Как сбросить счетчик SamplesPlayed IXAudio2SourceVoice после сброса исходных буферов?

IXAudio2SourceVoice имеет GetState, которая возвращает XAUDIO2_VOICE_STATE. Эта структура имеет член SamplesPlayed, а именно:

Общее количество сэмплов, обработанных этим голосом с момента его последнего запуска или с момента окончания последнего аудиопотока (отмечено флагом XAUDIO2_END_OF_STREAM).

Что я хочу сделать, так это остановить исходный голос, очистить все его буферы, а затем сбросить счетчик SamplesPlayed на ноль. Ни вызов Stop, ни FlushSourceBuffers будут сбросить SamplesPlayed. И хотя пометка последнего буфера с помощью XAUDIO2_END_OF_STREAM действительно корректно сбрасывает SamplesPlayed обратно в ноль, это, по-видимому, только работает, если этот последний буфер воспроизводится до конца; если буфер очищен, то SamplesPlayed не сбрасывается. Я также пытался вызвать Discontinuity как до, так и после остановки/промывки без эффекта.

Мой текущий обходной путь состоит в том, чтобы после остановки и сброса исходного голоса отправить крошечный тихий буфер с 1 семплом с установленным флагом XAUDIO2_END_OF_STREAM, а затем позволить исходному голосу воспроизвести этот буфер и, таким образом, сбросить SamplesPlayed до нуля. Это отлично работает для моего варианта использования, но кажется довольно хакерским/неуклюжим. Есть ли лучшее решение?


person Walt D    schedule 16.01.2021    source источник
comment
Какую версию XAudio2 вы используете?   -  person Chuck Walbourn    schedule 03.02.2021
comment
Прямо сейчас мой код автоматически выбирает последнюю доступную версию из 2.7, 2.8 и 2.9.   -  person Walt D    schedule 03.02.2021
comment
Избегай этой боли. Просто используйте XAudio2Redist.   -  person Chuck Walbourn    schedule 03.02.2021
comment
В Steam нет автоматического установщика для распространяемого XAudio2, что делает его использование гораздо более болезненным. (И вышеуказанная проблема возникает независимо от того, какую версию XAudio2 я использую.)   -  person Walt D    schedule 03.02.2021
comment
XAudio2Redist не требует установки. Вы просто помещаете xaudio2redist.dll в каталог вашего приложения. Кстати, в идеале вы избегаете всех вещей «устаревшего DirectX SDK», поэтому вам не нужно полагаться на установщик Steam. См. эту запись в блоге.   -  person Chuck Walbourn    schedule 03.02.2021
comment
О, я этого не знала, спасибо, что указали! И отличный пост в блоге, очень полезный, спасибо!   -  person Walt D    schedule 03.02.2021


Ответы (1)


Глядя на исходный код XAudio2, в API нет открытого способа сделать это, кроме как позволить пакету воспроизводиться с XAUDIO2_END_OF_STREAM.

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

person Chuck Walbourn    schedule 03.02.2021