XAudio2.7 аварийно завершает работу после остановки исходного голоса

Я использую XAudio2.7 в приложении Windows 7 x86 для рендеринга образцов потокового аудио. Исходный голос создается в формате 8 кГц, моно и 16 бит на сэмпл волнового формата. Затем я запускаю фоновый поток, который ожидает голосового обратного вызова и отправляет новый буфер. Все работает отлично, пока я не остановлю голос, и приложение не вылетает с исключением нарушения прав доступа. После создания файла дампа я заметил, что сбой происходит во внутреннем потоке обработки XAudio2:

Трассировка стека

Я попытался остановить поток двигателя перед остановкой голоса, но результат тот же.

Посоветуйте, спасибо


person Roman Gin    schedule 08.02.2017    source источник


Ответы (1)


Когда вы освобождаете память, на которую указываете, для отправки буфера? Помните, что вы должны поддерживать все указатели памяти действительными до тех пор, пока голос не завершит обработку этого буфера. Данные считываются из памяти приложения в режиме реального времени рабочим потоком, а не копируются.

Вызов Stop голосом не означает, что поток полностью прекратил работу, как только он возвращается. Если вы хотите убедиться, что все буферы для голоса закончились, используйте FlushSourceBuffers после Stop.

(void)voice->Stop( 0 ); 
(void)voice->FlushSourceBuffers(); 

Вам следует взглянуть на реализацию DirectX Tool Kit для аудио.

Кстати, поскольку вы используете XAudio 2.7, вы должны знать об этом известная проблема.

person Chuck Walbourn    schedule 09.02.2017
comment
Привет, Чак, спасибо за ответ. Память буфера выделяется при запуске приложения и помещается в очередь FIFO, поэтому она никогда не освобождается. Я вызываю FlushSourceBuffers после Stop. Я также пытался использовать Discontinuity API перед остановкой, но это тоже не помогло. Спасибо, что указали мне на известную проблему, я добавил ее в свою реализацию. - person Roman Gin; 09.02.2017