2016-11-14 273 views
0

私は4入力と4出力のasioドライバをサポートするUSB​​オーディオボードを持っています。 私は同時にデータを送受信したいです。 しかし、現在は一度に1つのチャンネルにしかデータを送受信できません。私はNaioのC#ライブラリからasioOutクラスに設定する方法を理解できません。Naudio Asio複数のチャンネルで同時に録音と再生を行います

I have to threads

各チャネルに1つのAudioAvailableイベントを持つことが可能でしょうか? waveIn/waveOutクラスと似ています。 どうすればこの問題を解決できますか?以下のための入力バッファにアクセスする方法はあり

public void OnAsioOutAudioAvailable(object sender, AsioAudioAvailableEventArgs e) 
{ 
    if (speakersOn && e.InputBuffers.Length != 0 && !monitorRequest) 
    { 
     byte[] buf = new byte[e.SamplesPerBuffer*4]; 
     for (int i = 0; i < e.InputBuffers.Length; i++) 
     { 
      Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer*4); 
     } 
     e.WrittenToOutputBuffers = true; 
     udp4VoiceSend.Send(buf, buf.Length); 
    } 
} 

:私は別のマルチキャストアドレスに、各入力チャンネルのための入力ストリームを送信する必要がAudioAvailableイベントの

int sampleRate = 44100; 
int channels = 4; 

buffWaveProvider = new BufferedWaveProvider(new NAudio.Wave.WaveFormat(sampleRate, 32, channels)); 
asioOut = new AsioOut(radioForm.driverName); 
asioOut.ChannelOffset = OUTdevID; 
asioOut.InputChannelOffset = INdevId; 
asioOut.AudioAvailable += OnAsioOutAudioAvailable; 
asioOut.InitRecordAndPlayback(buffWaveProvider, channels, sampleRate); 
asioOut.Play(); 

:ここ

は私のコードです各チャンネル? enter image description here

出力用にnaudioソースコードを確認しました。出力チャンネル数をwaveProvider.WaveFormat.Channelsに設定できます。ですから、InitRecordAndPlaybackメソッドを呼び出すときに、IWaveProviderバッファには4つのチャネルが必要です。

この件に関するお問い合わせはまだありません。私はそれらをすべて試しました。

https://stackoverflow.com/questions/22543513/naudio-using-asio-to-record-audio-and-output-with-a-guitar

NAudio Asio Record and Playback

How to record and playback with NAudio using AsioOut

NAudio AsioOut + Sockets

ありがとう!

UPDATE:

私はNaudioデモプロジェクト、ASIOレコーディングパネルをチェックし、私は一度に一つのチャンネルを聞くことができると思われました: enter image description here

naudioドライバクラスが4を作成し、入力バッファーと4つの出力バッファーは期待通りにアクセスできません。 enter image description here

asioOutオブジェクトが1チャンネルをリッスンし、チャンネルを変更したい場合は、オブジェクトが配置されます。

enter image description here

ライブラリの制限やドライバの制限ですか?

サンプルをasioバッファに追加すると、データを出力チャネルに直接送信できますか?

if (Main.buffWaveProvider != null) 
Main.buffWaveProvider.AddSamples(data, 0, dataLen); 

ありがとう!!

答えて

1

ここでは、入力と出力ASIOバッファの両方にアクセスし、サンプルの低レベル操作を実行して作成したsimple exampleを作成しました。

+0

HI、Mark。あなたの例をありがとう。出力チャンネルにサンプルを追加することは可能ですか?たとえば、track1をoutput1に、track2をoutput2に一度に1回送信したいとします。また、buffWaveProvider.AddSamples(data、0、dataLen)では、すべての出力に対してサンプルを追加できます。私はasioOut.ChannelOffsetを目的のチャンネルに設定しようとしましたが、バッファにサンプルを追加しましたが、このハックを動作させていないようです。それが可能だ? –

+0

はい、これはサンプルの動作です。入力からの読み取り、出力への書き込み –

+0

ありがとう、ありがとう。したがって、音声ストリームが入力からではなくネットワークから来ている場合は、どのように管理できますか?より具体的に言えば、ディスパッチャがネットワーク上で音声を送信し、ストリーム送信チャネルを指定する音声アプリケーションがあります。私はイベントudp4VoiceRecv_OnNewDataRecv(byte [] data、int dataLen)を持っています。だから私はストリームを特定の出力にルーティングする必要があります。ありがとうございました! –

関連する問題