在特定的耳塞(频道)上播放歌曲

时间:2016-08-19 15:19:17

标签: matlab audio psychtoolbox

我的设备就像一个3耳机(所以6个耳塞)。我的目标是在每个耳塞上播放一首不同的歌曲(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个耳塞上播放。

我收到此警告

  

PTB-INFO:使用经过特殊修改的PortAudio引擎,基于官方   版本:PortAudio V19-devel WITH-DIM

     

将使用ASIO增强型Portaudio驱动程序DLL。看到   Psychtoolbox / PsychSound / PortAudioLICENSE.txt的确切条款   用于此dll。

     

免责声明:“ASIO是Steinberg Media的商标和软件   Technologies GmbH。“

     

PTB-Warning:虽然使用了启用了ASIO的Psychtoolbox声音   驱动器,

     

PTB-Warning:在您的系统中找不到任何支持ASIO的声卡。

     

PTB-警告:如果您认为自己应该有ASIO卡,请检查   您的

     

PTB-Warning:正确安装和配置驱动程序的系统   重试。

     

PTB-Warning:有关ASIO的更多信息,请阅读“help InitializePsychSound”   等人。

     

PTB-INFO:将句柄0作为PortAudio流打开的新音频设备:

     

PTB-INFO:对于1个频道播放:音频子系统是MME,音频   设备名称是Microsoft Sound Mapper - 输出

     

PTB-INFO:Real samplerate 44100.000000 Hz。输入延迟0.000000   msecs,输出延迟464.399093毫秒。




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

我使用PsychPortAudio('GetDevices')来找到耳塞对的id。奇怪的是,我找到4个而不是3个有2个通道的设备。 我使用了PsychPortAudio('打开'用于id 7,9,18和20,但是每次这首歌都是在同一个耳塞对上播放的,当我尝试在一个耳塞上播放时就是同一对。
这是4个设备的图片

enter image description here

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');

现在唯一不同的是警告这个

  

PTB-INFO:用于2个频道播放:音频子系统是Windows   DirectSound,音频设备名称是扬声器(USB多声道音频   装置)

很抱歉这篇长篇文章,但我想给你所有的信息。

你能告诉我错了吗?如何在特定的耳塞上播放一首歌曲。我想如果我知道那么我只是复制代码然后放另一首歌,所以我会在每个耳塞上播放一首歌

3 个答案:

答案 0 :(得分:1)

1)您可能不希望每次发出声音时都运行AssertOpenGL

2)你的代码看起来是正确的,虽然有趣的是我的Apple笔记本电脑和内置声音,发送单通道信号也是从两个耳机通道播放。

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

答案 1 :(得分:0)

我的问题的部分答案。我找到了如何在耳塞中播放一首歌而在另一耳中播放另一首歌。 psychwavread给了我一个2行数组。所以我把一首歌的第一行和另一首歌的第一行放在一个数组中。所以现在我有一个2行阵列比起我播放一首歌时的那个,但现在我播放2首歌 [y, freq] = psychwavread(wavfilename1); [y1, freq1] = psychwavread(wavfilename2); aux = y'; aux1 = y1'; wavedata = [aux1(1,:) ; aux(1,:)];

答案 2 :(得分:0)

所以我设法在4个频道上播放我确信我可以在6和8上播放。我安装了ASIO4ALL,并在打开时选择ASIO4ALL设备ID。当ASIO4all打开时,我可以选择我的6声道设备,之后我只选择在哪个声道播放声音的开放功能

相关问题