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

Posted

技术标签:

【中文标题】Naudio Asio 在多个通道上同时录制和播放【英文标题】:Naudio Asio Record and Playback simultaneously on multiple channels 【发布时间】:2016-11-14 10:21:06 【问题描述】:

我有一个支持 4 个输入和 4 个输出的 asio 驱动程序的 USB 音频板。 我想同时发送和接收数据。 但目前我一次只能接收和发送数据到一个通道。我不知道如何在 Nadio c# 库的 asioOut 类中设置它。

每个通道可以有一个 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 个通道。

关于这个主题的 *** 帖子都没有帮助我。我都试过了。

https://***.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 录音面板,似乎我一次只能听一个频道:

naudio 驱动程序类按预期创建了 4 个输入和 4 个输出缓冲区,但我无法访问它们。

在 AsioRecordingPanel 文件中,如果 asioOut 对象监听 1 个频道并且用户想要更改频道,则该对象被释放。

是库限制还是驱动限制?

当我将样本添加到 asio 缓冲区时,可以将数据直接发送到输出通道吗?

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

谢谢!!

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,马克。谢谢你的例子。可以将样本添加到输出通道吗?例如,我想一次将 track1 发送到 output1 并将 track2 发送到 output2 一次。在 buffWaveProvider.AddSamples(data, 0, dataLen) 我可以为所有输出添加样本。我试图将 asioOut.ChannelOffset 设置为所需的通道,然后在缓冲区中添加样本,但似乎并不能解决这个问题。有可能吗? 是的,这就是示例的作用。从输入读取,写入输出 好的,谢谢。那么,如果语音流不是来自输入,而是来自网络,我该如何管理呢?让我更具体一点:我有一个语音应用程序,调度员通过网络发送语音,他指定流发送通道。在 asio 驱动程序网关应用程序中,我有事件 udp4VoiceRecv_OnNewDataRecv(byte[] data, int dataLen)。所以当它被触发时,我必须将流路由到特定的输出。谢谢! 例如在waveout类中我选择一个设备号,我可以为每个设备定义一个缓冲区。 buffWaveProvider = new BufferedWaveProvider(waveInClass.WaveFormat); waveOutClass = 新的 WaveOut(); waveOutClass.DeviceNumber = OUTdevID; waveOutClass.Init(buffWaveProvider); waveOutClass.Play(); 我只需要使用BufferedWaveProvider,然后您可以将其提供给 AsioOut 或任何其他 NAudio 输出设备播放。

以上是关于Naudio Asio 在多个通道上同时录制和播放的主要内容,如果未能解决你的问题,请参考以下文章

NAudio Asio 录制播放和保存(仅限噪音)

NAudio Asio 录制和播放

尝试在 ASIO 输出上使用 NAudio 播放音频时的空引用

NAudio:使用 ASIO 录制音频并用吉他输出

NAudio - ASIO 播放到设备(仅限静态)

C# NAudio asio 和 wasapi