"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 值).
我有两个 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 值).