Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Naudio Asio在多个频道上同时录制和播放_C#_Naudio_Asio - Fatal编程技术网

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

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

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

每个频道可能有一个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事件,我必须为每个输入通道发送不同多播地址上的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);