在另一个线程中填充 BufferedWaveProvider 时出现“缓冲区已满”异常

Posted

技术标签:

【中文标题】在另一个线程中填充 BufferedWaveProvider 时出现“缓冲区已满”异常【英文标题】:"Buffer full" exception when BufferedWaveProvider is being filled in another thread 【发布时间】: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 秒后,由于异常而结束。 我应该如何异步填充缓冲区?

【问题讨论】:

您的例外是什么?请把它放在你的问题中。 【参考方案1】:

不要再忽略 EndReceive 的返回值了

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

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

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

【讨论】:

以上是关于在另一个线程中填充 BufferedWaveProvider 时出现“缓冲区已满”异常的主要内容,如果未能解决你的问题,请参考以下文章

jQuery - 如何在另一个页面中填充 div

动态填充后在另一个(未绑定的)表单中显示表单

如何在另一个类中填充来自foreach的Combobox

我需要在另一个页面上回显从 mysql 填充的下拉选择

根据在另一个文本框中键入的文本,使用 AJAX 更新面板在 ASP.NET 中自动填充文本框

python:在线程中读取子进程输出