我有一台类似3副耳机的设备(所以有6个耳塞)。我的目标是在每个耳塞上播放一首不同的歌曲(六首歌曲)。因此,我通过在耳塞上播放一首歌来凝视。对我来说,一个通道意味着一个耳塞(但也许我错了)。我正在使用Psychtoolbox:

function BasicSoundOutputDemo( wavfilename)

AssertOpenGL;

% Read WAV file from filesystem:
[y, freq] = psychwavread(wavfilename);

aux = y' ;
wavedata = aux(1,:);


InitializePsychSound;
devices = PsychPortAudio('GetDevices' );

pahandle = PsychPortAudio('Open', [], [], 0, freq, 1);// nr channels = 1

PsychPortAudio('FillBuffer', pahandle, wavedata);

t1 = PsychPortAudio('Start', pahandle, 1, 0);


KbReleaseWait;


while ~KbCheck
  % Wait a seconds...
  WaitSecs(1);

end


PsychPortAudio('Stop', pahandle);


PsychPortAudio('Close', pahandle);


fprintf('Demo finished, bye!\n');

但这没有用。它不是在一个耳塞上播放声音,而是在两个耳塞上播放。

我收到此警告



然后,我决定尝试另一种方式。让我们在其他2个耳塞上播放歌曲

我使用PsychPortAudio('GetDevices')查找耳塞对的ID。奇怪的是,我发现3个设备有2个通道,而不是4个。
而且我使用PsychPortAudio('Open'分别标识为7、9、18和20,但是每次在同一对耳塞上播放该歌曲时,都是从我尝试仅在一个耳塞上播放时的同一对。
这是带有4个设备的图片

matlab - 在特定的耳塞( channel )上播放歌曲-LMLPHP
function BasicSoundOutputDemo( wavfilename)

AssertOpenGL;

% Read WAV file from filesystem:
[y, freq] = psychwavread(wavfilename);

wavedata = y' ;
nrchannels = size(wavedata,1); % Number of rows == number of channels.

InitializePsychSound;
devices = PsychPortAudio('GetDevices' );

pahandle = PsychPortAudio('Open', 18, [], 0, freq, nrchannels);

PsychPortAudio('FillBuffer', pahandle, wavedata);

t1 = PsychPortAudio('Start', pahandle, 1, 0);


KbReleaseWait;


while ~KbCheck
  % Wait a seconds...
  WaitSecs(1);

end


PsychPortAudio('Stop', pahandle);


PsychPortAudio('Close', pahandle);


fprintf('Demo finished, bye!\n');

现在唯一的不同之处在于警告



对不起,这篇冗长的帖子,但是我想向您提供所有信息。

你能告诉我我错了吗。如何在特定的耳塞上播放一首歌曲。我想如果我知道,那我就复制代码并放另一首歌,这样我将在每个耳塞上播放一首歌

最佳答案

1)您可能不想在每次显示声音时都运行AssertOpenGL

2)您的代码看起来正确,尽管有趣的是在我的Apple笔记本电脑和内置声音上,两个耳机通道也在播放单个通道信号。

3)您使用的是哪种音频设备?从您的设备列表中看来,您列出的4个设备可能是同一设备的不同接口(interface)(2个输出(一个数字,一个模拟)X两个API(一个MME,一个DirectSound)。设备中是否还有其他条目? list ?

09-03 19:30