在另一个线程中填充 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 时出现“缓冲区已满”异常的主要内容,如果未能解决你的问题,请参考以下文章