C# &引用;“缓冲区已满”;例外

C# &引用;“缓冲区已满”;例外,c#,.net,multithreading,sockets,naudio,C#,.net,Multithreading,Sockets,Naudio,我正在尝试创建发送和接收音频的应用程序。我有两个 BufferedWaveProvider的 第一次是这样 private void AsioOut_AudioAvailable(object sender, AsioAudioAvailableEventArgs e) { float[] sourceAudio = new float[e.SamplesPerBuffer*e.InputBuffers.Length]; e.GetAsInterleavedSamples(sou

我正在尝试创建发送和接收音频的应用程序。我有两个 BufferedWaveProvider的

第一次是这样

private void AsioOut_AudioAvailable(object sender, AsioAudioAvailableEventArgs e)
{
    float[] sourceAudio = new float[e.SamplesPerBuffer*e.InputBuffers.Length];
    e.GetAsInterleavedSamples(sourceAudio);
    float[] proccesedAudio = new float[settings.BufferSize];
    byte[] result = new byte[settings.BufferSize*4];
    byte[] sendingAudio = new byte[e.SamplesPerBuffer*4];

    for (int j = 1, q = 0; j < sourceAudio.Length; j += 2, q++)
        proccesedAudio[q] = sourceAudio[j];

    //...audio is beeing proccesed by VSTHost...

    result.CopyTo(sendingAudio,0);

    if (connection.IsConnected)
        Task.Run(() => connection.Send(sendingAudio)); //Proccesed audio sends by socket
    inputAudioBufferedWaveProvider.AddSamples(result, 0, result.Length);
}
这两个BufferedWiveProvider正在由MixingSampleProvider混合

mixingProvider = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(Convert.ToInt32(settings.SampleRate), 2));

mixingProvider.AddMixerInput(inputAudioPanningProvider);
mixingProvider.AddMixerInput(incomingAudioPanningProvider);
mixingProvider.ReadFully = true;

asioOut.InitRecordAndPlayback(new SampleToWaveProvider(mixingProvider),2,Convert.ToInt32(settings.SampleRate));
启动应用程序3-4分钟后,我得到异常(缓冲区已满)。我认为由从网络接收的字节填充的缓冲区有问题


我做错了什么?

您不断创建新的缓冲区。因此,您可能需要释放缓冲区。是否有用于.AddSamples()的反函数?谁正在生成缓冲区完全异常完整异常类型名称应该会给您一个线索。如果可以,请查看堆栈跟踪-它是否来自
连接.Send()
?这对我来说似乎是最有可能的罪魁祸首。其他候选对象是
AddSamples()
method.@Übercoder,
connection.Send()
method发送音频信号。该信号来自声卡输入,然后通过
inputAudioBufferedWaveProvider.AddSamples(result,0,result.Length)
将样本添加到
inputAudioBufferedWaveProvider
中。
mixingProvider = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(Convert.ToInt32(settings.SampleRate), 2));

mixingProvider.AddMixerInput(inputAudioPanningProvider);
mixingProvider.AddMixerInput(incomingAudioPanningProvider);
mixingProvider.ReadFully = true;

asioOut.InitRecordAndPlayback(new SampleToWaveProvider(mixingProvider),2,Convert.ToInt32(settings.SampleRate));