2016-03-11 1 views
1

У меня есть два BufferedWaveProviders и MixingSampleProvider. Первый BufferedSampleProvider (myBuffer) предназначен для моего звука, поступающего со звуковой карты. Второй BufferedWaveProvider() предназначен для передачи звука из сети (TCP).

заполняется асинхронно так:Исключение «Buffer full», когда BufferedWaveProvider заполняется в другом потоке

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 секунды после запуска программы он заканчивает из-за исключения.
Как заполнить буфер асинхронно?

+0

Ваше исключение: Пожалуйста, поместите его в свой вопрос. – Edin

ответ

2

Остановить игнорирование возвращаемого значения EndReceive.

Он сообщает вам, сколько байтов данных вы получили. Вот сколько образцов вы должны добавить в свой буфер (хотя убедитесь, что вы не конвертируете отсчеты в байты и наоборот).

Вместо этого вы просто передаете incomingBytes в целиком, всегда - даже если вы получили только один байт через TCP. Это данные мусора, и он заполняет буфер быстрее, чем он может стекать.

В целом, значения возвращаемых значений методов и функций имеют смысл, и игнорирование их должно выполняться только тогда, когда вы понимаете, что вы игнорируете (например, если вы не заботитесь о том, чтобы обращаться с каким-либо, кроме обратного вызова, игнорируя возвращаемое значение BeginReceive в порядке, если вам нужно знать, существует ли ожидающий асинхронный запрос ввода-вывода, вам нужно вернуть значение).

 Смежные вопросы

  • Нет связанных вопросов^_^