"Buffer full" BufferedWaveProvider 在另一个线程中填充时出现异常

"Buffer full" exception when BufferedWaveProvider is being filled in another thread

我有两个 BufferedWaveProvider 和 MixingSampleProvider。第一个 BufferedSampleProvider (myBuffer) 用于我来自声卡的音频。第二个 BufferedWaveProvider (incomingBuffer) 用于来自网络 (TCP) 的音频。

incomingBuffer 是这样异步填充的:

    private static void Receive()
    {
        receiver.BeginReceive(incomingBytes, 0, incomingBytes.Length, SocketFlags.None, ReceiveCallback, null);
    }

    private static void ReceiveCallback(IAsyncResult ar)
    {
        receiver.EndReceive(ar);
        incomingBuffer.AddSamples(incomingBytes, 0 , incomingBytes.Length);
        Receive();
    }

但是在启动程序后 7-10 秒后由于异常而结束。
我应该如何异步填充缓冲区?

停止忽略 EndReceive 的 return 值。

它告诉您收到了多少字节的数据。这就是您必须添加到缓冲区中的样本数量(但请确保您没有将样本错误地转换为字节,反之亦然)。

相反,现在您只需将 incomingBytes 传递给整个 incomingBuffer,始终如此 - 即使您仅通过 TCP 接收到一个字节。这是垃圾数据,它填满您的缓冲区的速度快于它耗尽的速度。

一般来说,return 方法和函数的值是有意义的,只有当您了解 您要忽略的内容 时才应该忽略它们(例如,如果您不关心处理回调之外的任何事情,忽略 BeginReceive 的 return 值就可以了;如果你需要知道是否有挂起的异步 I/O 请求,你需要 return 值).