Naudio Asio 在多个通道上同时录制和回放
Naudio Asio Record and Playback simultaneously on multiple channels
我有一个USB音频板,支持4输入4输出的asio驱动。
我想同时发送和接收数据。
但目前我一次只能接收和发送数据到一个通道。我不知道如何在 Naudio c# 库的 asioOut class 中设置它。
是否可以为每个通道设置一个 AudioAvailable 事件?类似于 waveIn / waveOut classes。
我怎样才能做到这一点?
这是我的代码:
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 个通道。
None 的 Whosebug post 关于这个主题帮助了我。我都试过了。
NAudio Asio Record and Playback
How to record and playback with NAudio using AsioOut
NAudio AsioOut + Sockets
谢谢!
更新:
我查看了 Naudio Demo Project、Asio Recording Panel,似乎一次只能收听一个频道:
naudio 驱动程序 class 按预期创建了 4 个输入缓冲区和 4 个输出缓冲区,但我无法访问它们。
在 AsioRecordingPanel 文件中,如果 asioOut 对象侦听 1 个频道并且用户想要更改频道,则该对象将被释放。
是库限制还是驱动程序限制?
当我将样本添加到 asio 缓冲区时,是否可以将数据直接发送到输出通道?
if (Main.buffWaveProvider != null)
Main.buffWaveProvider.AddSamples(data, 0, dataLen);
谢谢!!
这是我创建的 simple example,它可以访问输入和输出 ASIO 缓冲区并对样本执行低级操作。
我有一个USB音频板,支持4输入4输出的asio驱动。 我想同时发送和接收数据。 但目前我一次只能接收和发送数据到一个通道。我不知道如何在 Naudio c# 库的 asioOut class 中设置它。
是否可以为每个通道设置一个 AudioAvailable 事件?类似于 waveIn / waveOut classes。 我怎样才能做到这一点?
这是我的代码:
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 个通道。
None 的 Whosebug post 关于这个主题帮助了我。我都试过了。
NAudio Asio Record and Playback
How to record and playback with NAudio using AsioOut
NAudio AsioOut + Sockets
谢谢!
更新:
我查看了 Naudio Demo Project、Asio Recording Panel,似乎一次只能收听一个频道:
naudio 驱动程序 class 按预期创建了 4 个输入缓冲区和 4 个输出缓冲区,但我无法访问它们。
在 AsioRecordingPanel 文件中,如果 asioOut 对象侦听 1 个频道并且用户想要更改频道,则该对象将被释放。
是库限制还是驱动程序限制?
当我将样本添加到 asio 缓冲区时,是否可以将数据直接发送到输出通道?
if (Main.buffWaveProvider != null)
Main.buffWaveProvider.AddSamples(data, 0, dataLen);
谢谢!!
这是我创建的 simple example,它可以访问输入和输出 ASIO 缓冲区并对样本执行低级操作。