0

私は 3 つのヘッドフォンを 1 つにしたようなデバイスを持っています (つまり 6 つの耳栓) 。私の目標は、各耳栓で 1 つの異なる曲 (6 曲) を再生することです。それで、耳栓で1曲演奏することから始めました。私にとって、1 つのチャンネルは 1 つの耳栓を意味します (しかし、私は間違っているかもしれません)。私は 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');

しかし、うまくいきませんでした。1 つの耳栓だけで音を再生する代わりに、2 つの耳栓で再生していました。

この警告が表示されます

PTB-INFO: 公式バージョンに基づいて、特別に変更された PortAudio エンジンを使用: PortAudio V19-devel WITH-DIM

ASIO 拡張 Portaudio ドライバー DLL を使用します。この dll の正確な使用条件については、Psychtoolbox/PsychSound/PortAudioLICENSE.txt を参照してください。

免責事項: 「ASIO は、Steinberg Media Technologies GmbH の商標およびソフトウェアです。」

PTB-警告: ASIO 対応の Psychtoolbox サウンド ドライバーを使用していますが、

PTB-警告: システムに ASIO 対応のサウンドカードが見つかりませんでした。

PTB-警告: ASIO カードが必要だと思われる場合は、

PTB-警告: ドライバーが正しくインストールおよび構成されているためのシステムで、再試行してください。

PTB-警告: ASIO などの詳細については、「help InitializePsychSound」を参照してください。

PTB-INFO: ハンドル 0 を持つ新しいオーディオ デバイスが PortAudio ストリームとして開かれました:

PTB-INFO: 1 チャンネルの場合 再生: オーディオ サブシステムは MME、オーディオ デバイス名は Microsoft Sound Mapper - Output

PTB-INFO: 実際のサンプルレート 44100.000000 Hz。入力遅延 0.000000 ミリ秒、出力遅延 464.399093 ミリ秒。




それから私は別のアプローチを試すことにしました。他の2つの耳栓で曲を再生しましょう

PsychPortAudio('GetDevices') を使用して、耳栓ペアの ID を見つけました。奇妙なのは、2 つのチャンネルを持つ 3 つのデバイスではなく、4 つを見つけたことです。そして、ID 7、9、18、および 20 に対して PsychPortAudio('Open' を使用しましたが、同じ耳栓ペアで曲を再生するたびに、同じペアでした。 1つの耳栓だけでプレイしようとしました.
これは4つのデバイスでの写真です.

ここに画像の説明を入力

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、オーディオ デバイス名は Speakers (USB Multi-Channel Audio Device)

この長い投稿で申し訳ありませんが、すべての情報を提供したかったのです。

私が間違っていたと言えますか。特定の耳栓で 1 つの曲を再生するにはどうすればよいですか? それがわかれば、コードをコピーして別の曲を入れるだけで、各耳栓で 1 曲ずつ再生できると思います。

4

3 に答える 3

1

AssertOpenGL1)音を出すたびに走りたくないでしょう。

2)あなたのコードは正しいように見えますが、興味深いことに、私のAppleラップトップと内蔵サウンドでは、単一のチャンネル信号を送信すると、両方のヘッドフォンチャンネルからも再生されます。

3) 使用しているオーディオ デバイスは何ですか? あなたのデバイスリストから、あなたがリストした 4 つは同じデバイスへの異なるインターフェースである可能性があるようです (2 つの出力 (1 つのデジタル、1 つのアナログ) X 2 つの API (1 つの MME、1 つの DirectSound))。デバイスに他のエントリはありますか?リスト?

于 2016-08-19T23:57:53.720 に答える
0

私の質問に対する部分的な答え。耳栓で曲を再生し、別の曲を別の曲で再生する方法を見つけました。psychwavread は 2 行の配列を提供します。だから私は、ある曲の最初の行と他の曲の最初の行を配列に入れました。だから今、私は 1 つの曲を再生するときからのものに似た 2 行の配列を持っていますが、今は 2 つの曲を再生します [y, freq] = psychwavread(wavfilename1); [y1, freq1] = psychwavread(wavfilename2); aux = y'; aux1 = y1'; wavedata = [aux1(1,:) ; aux(1,:)];

于 2016-08-22T10:01:08.627 に答える
0

ASIO4ALL をインストールし、開いたときに ASIO4ALL デバイス ID を選択します。ASIO4all が開いたら、6 チャンネルのデバイスを選択できます。その後、サウンドを再生するチャンネルをオープン機能で選択するだけです。

于 2016-08-26T13:12:23.583 に答える