C# &引用;“缓冲区已满”;例外
我正在尝试创建发送和接收音频的应用程序。我有两个 BufferedWaveProvider的 第一次是这样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
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));