【问题标题】:"Buffer full" exception when BufferedWaveProvider is being filled in another thread在另一个线程中填充 BufferedWaveProvider 时出现“缓冲区已满”异常
【发布时间】:2016-03-11 08:51:24
【问题描述】:

我有两个 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 秒后,由于异常而结束。
我应该如何异步填充缓冲区?

【问题讨论】:

  • 您的例外是什么?请把它放在你的问题中。

标签: c# .net multithreading asynchronous naudio


【解决方案1】:

不要再忽略 EndReceive 的返回值了

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

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

一般来说,方法和函数的返回值是有意义的,只有在你理解什么你忽略它们时才应该忽略它们(例如,如果你不关心处理除了回调,忽略BeginReceive的返回值也可以;如果你需要知道是否有一个挂起的异步I/O请求,你需要返回值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 2016-02-27
    • 2022-12-10
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多