我有一個支持asio驅動程序的usb音頻板,帶有4個輸入和4個輸出。 我想同時發送和接收數據。 但目前我一次只能接收和發送數據到一個頻道。我無法弄清楚如何將它設置在Naudio c#庫的asioOut類中。Naudio Asio在多個通道上同時錄製和播放
,能夠爲每個信道的一個AudioAvailable事件?類似於waveIn/waveOut類。 我該如何實現這一目標?
這裏是我的代碼:
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();
爲AudioAvailable事件我要送每個輸入通道的輸入流在不同的組播地址:
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);
}
}
對於輸出我檢查了naudio源代碼,我看到我可以設置輸出通道的數量waveProvider.WaveFormat.Channels。所以我想在調用InitRecordAndPlayback方法時,IWaveProvider緩衝區應該有4個通道。
沒有關於此主題的stackoverflow文章幫助了我。我已經嘗試過了。
NAudio Asio Record and Playback
How to record and playback with NAudio using AsioOut
謝謝!
UPDATE:
我檢查了n音訊示範項目,ASIO錄音面板,看來我可以一次聽只有一個通道:
的n音訊驅動程序類創建4輸入和4個輸出緩衝區,但我無法訪問它們。
在AsioRecordingPanel文件如果asioOut對象監聽1個信道和用戶想要改變該對象被設置信道。
是庫限制或驅動程序的限制?
當我將樣本添加到asio緩衝區時,可以將數據直接發送到輸出通道?
if (Main.buffWaveProvider != null)
Main.buffWaveProvider.AddSamples(data, 0, dataLen);
謝謝!!
HI,Mark。感謝你的例子。可以將樣本添加到輸出通道?例如,我想每次發送一次track1到output1和track2到output2。在buffWaveProvider.AddSamples(data,0,dataLen)中,我可以爲所有輸出添加樣本。我嘗試將asioOut.ChannelOffset設置爲所需的頻道,然後將樣本添加到緩衝區中,但似乎無法正常工作。這是可能的? –
是的,這就是樣本的作用。讀取輸入,寫入輸出 –
好的,謝謝。因此,如果語音流不是來自輸入端,而是來自網絡,我該如何管理它?讓我更具體:我有一個語音應用程序,調度員通過網絡發送語音,並指定流發送通道。在asio驅動程序網關應用程序中,我有事件udp4VoiceRecv_OnNewDataRecv(byte [] data,int dataLen)。所以當這個被觸發時,我必須將流路由到特定的輸出。謝謝! –