Naudio Asio在多个频道上同时录制和播放

时间:2016-11-14 10:21:06

标签: c# naudio asio

我有一个usb音频板,支持带4个输入和4个输出的asio驱动程序。 我想同时发送和接收数据。 但是目前我一次只能收发数据到一个频道。我无法弄清楚如何在Naudio c#library的asioOut类中设置它。

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

谢谢!

更新

我已经检查了Naudio演示项目,Asio录制面板,似乎我一次只能收听一个频道: enter image description here

naudio驱动程序类按预期创建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 个答案:

答案 0 :(得分:2)

这是我创建的simple example,它正在访问输入和输出ASIO缓冲区并对样本执行低级操作。