C# Naudio Asio在多个频道上同时录制和播放
我有一个usb音频板,支持4个输入和4个输出的asio驱动程序。 我想同时发送和接收数据。 但目前我一次只能接收和发送一个频道的数据。我不知道如何在Naudio c#library的一个oout类中设置它 每个频道可能有一个AudioAvailable事件?类似于waveIn/waveOut类。 我怎样才能做到这一点 这是我的密码:C# Naudio Asio在多个频道上同时录制和播放,c#,naudio,asio,C#,Naudio,Asio,我有一个usb音频板,支持4个输入和4个输出的asio驱动程序。 我想同时发送和接收数据。 但目前我一次只能接收和发送一个频道的数据。我不知道如何在Naudio c#library的一个oout类中设置它 每个频道可能有一个AudioAvailable事件?类似于waveIn/waveOut类。 我怎样才能做到这一点 这是我的密码: int sampleRate = 44100; int channels = 4; buffWaveProvider = new BufferedWavePro
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事件,我必须为每个输入通道发送不同多播地址上的inputstream:
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);
}
}
谢谢 这里创建了一个I,它访问输入和输出ASIO缓冲区并对样本执行低级操作。这里创建了一个I,它访问输入和输出ASIO缓冲区并对样本执行低级操作。您好,Mark。谢谢你的例子。是否可以将样本添加到输出通道?例如,我想一次将track1发送到output1,将track2发送到output2。在buffWaveProvider.AddSamples(data,0,dataLen)中,我可以为所有输出添加样本。我尝试将asioOut.ChannelOffset设置为所需的通道,然后在缓冲区中添加样本,但似乎无法解决此问题。有可能吗?是的,样品就是这样做的。读取输入,写入输出,谢谢。因此,如果语音流不是来自输入,而是来自网络,我如何管理它?让我更具体一点:我有一个语音应用程序,其中调度员通过网络发送语音,并指定流发送通道。在asio驱动程序网关应用程序中,我有一个事件udp4VoiceRecv_OnNewDataRecv(字节[]数据,int dataLen)。因此,当触发时,我必须将流路由到特定的输出。非常感谢。例如,在waveout类中,我选择一个设备编号,然后可以为每个设备定义一个缓冲区。buffWaveProvider=新的BufferedWaveProvider(waveInClass.WaveFormat);waveOutClass=新的WaveOut();waveOutClass.DeviceNumber=OutDeviceId;waveOutClass.Init(buffWaveProvider);waveOutClass.Play();我只需要使用一个
BufferedWaveProvider
,然后你就可以把它交给Asiout或任何其他NAudio输出设备来播放。嗨,马克。谢谢你的例子。是否可以将样本添加到输出通道?例如,我想一次将track1发送到output1,将track2发送到output2。在buffWaveProvider.AddSamples(data,0,dataLen)中,我可以为所有输出添加样本。我尝试将asioOut.ChannelOffset设置为所需的通道,然后在缓冲区中添加样本,但似乎无法解决此问题。有可能吗?是的,样品就是这样做的。读取输入,写入输出,谢谢。因此,如果语音流不是来自输入,而是来自网络,我如何管理它?让我更具体一点:我有一个语音应用程序,其中调度员通过网络发送语音,并指定流发送通道。在asio驱动程序网关应用程序中,我有一个事件udp4VoiceRecv_OnNewDataRecv(字节[]数据,int dataLen)。因此,当触发时,我必须将流路由到特定的输出。非常感谢。例如,在waveout类中,我选择一个设备编号,然后可以为每个设备定义一个缓冲区。buffWaveProvider=新的BufferedWaveProvider(waveInClass.WaveFormat);waveOutClass=新的WaveOut();waveOutClass.DeviceNumber=OutDeviceId;waveOutClass.Init(buffWaveProvider);waveOutClass.Play();我只需要使用一个BufferedWaveProvider
,然后你就可以把它交给Asiout或任何其他NAudio输出设备来播放。
if (Main.buffWaveProvider != null)
Main.buffWaveProvider.AddSamples(data, 0, dataLen);