0

我有一个支持 4 个输入和 4 个输出的 asio 驱动程序的 USB 音频板。我想同时发送和接收数据。但目前我一次只能接收和发送数据到一个通道。我无法弄清楚如何在 Naudio 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 个通道。

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

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

NAudio Asio 录制和播放

如何使用 AsioOut 使用 NAudio 进行录制和播放

NAudio AsioOut + 插座

谢谢!

更新:

我检查了 Naudio 演示项目,Asio 录音面板,似乎我一次只能听一个频道: 在此处输入图像描述

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

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

在此处输入图像描述

是库限制还是驱动程序限制?

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

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

谢谢!!

4

1 回答 1

2

这是我创建的一个简单示例,它访问输入和输出 ASIO 缓冲区并执行样本的低级操作。

于 2016-11-14T19:47:25.397 回答