2016-11-14 366 views
0

我有一個支持asio驅動程序的usb音頻板,帶有4個輸入和4個輸出。 我想同時發送和接收數據。 但目前我一次只能接收和發送數據到一個頻道。我無法弄清楚如何將它設置在Naudio c#庫的asioOut類中。Naudio Asio在多個通道上同時錄製和播放

I have to threads

,能夠爲每個信道的一個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); 
    } 
} 

是否有訪問輸入緩衝器一種方式每個頻道? enter image description here

對於輸出我檢查了naudio源代碼,我看到我可以設置輸出通道的數量waveProvider.WaveFormat.Channels。所以我想在調用InitRecordAndPlayback方法時,IWaveProvider緩衝區應該有4個通道。

沒有關於此主題的stackoverflow文章幫助了我。我已經嘗試過了。

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:

我檢查了n音訊示範項目,ASIO錄音面板,看來我可以一次聽只有一個通道: enter image description here

的n音訊驅動程序類創建4輸入和4個輸出緩衝區,但我無法訪問它們。 enter image description here

在AsioRecordingPanel文件如果asioOut對象監聽1個信道和用戶想要改變該對象被設置信道。

enter image description here

是庫限制或驅動程序的限制?

當我將樣本添加到asio緩衝區時,可以將數據直接發送到輸出通道?

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

謝謝!!

回答

1

下面是我創建的一個訪問輸入和輸出ASIO緩衝區並對樣本進行低級別操作的創建方法。

+0

HI,Mark。感謝你的例子。可以將樣本添加到輸出通道?例如,我想每次發送一次track1到output1和track2到output2。在buffWaveProvider.AddSamples(data,0,dataLen)中,我可以爲所有輸出添加樣本。我嘗試將asioOut.ChannelOffset設置爲所需的頻道,然後將樣本添加到緩衝區中,但似乎無法正常工作。這是可能的? –

+0

是的,這就是樣本的作用。讀取輸入,寫入輸出 –

+0

好的,謝謝。因此,如果語音流不是來自輸入端,而是來自網絡,我該如何管理它?讓我更具體:我有一個語音應用程序,調度員通過網絡發送語音,並指定流發送通道。在asio驅動程序網關應用程序中,我有事件udp4VoiceRecv_OnNewDataRecv(byte [] data,int dataLen)。所以當這個被觸發時,我必須將流路由到特定的輸出。謝謝! –