IXAudio2SourceVoice
имеет GetState
, которая возвращает XAUDIO2_VOICE_STATE
. Эта структура имеет член SamplesPlayed
, а именно:
Общее количество сэмплов, обработанных этим голосом с момента его последнего запуска или с момента окончания последнего аудиопотока (отмечено флагом XAUDIO2_END_OF_STREAM).
Что я хочу сделать, так это остановить исходный голос, очистить все его буферы, а затем сбросить счетчик SamplesPlayed
на ноль. Ни вызов Stop
, ни FlushSourceBuffers
будут сбросить SamplesPlayed
. И хотя пометка последнего буфера с помощью XAUDIO2_END_OF_STREAM
действительно корректно сбрасывает SamplesPlayed
обратно в ноль, это, по-видимому, только работает, если этот последний буфер воспроизводится до конца; если буфер очищен, то SamplesPlayed
не сбрасывается. Я также пытался вызвать Discontinuity
a> как до, так и после остановки/промывки без эффекта.
Мой текущий обходной путь состоит в том, чтобы после остановки и сброса исходного голоса отправить крошечный тихий буфер с 1 семплом с установленным флагом XAUDIO2_END_OF_STREAM
, а затем позволить исходному голосу воспроизвести этот буфер и, таким образом, сбросить SamplesPlayed
до нуля. Это отлично работает для моего варианта использования, но кажется довольно хакерским/неуклюжим. Есть ли лучшее решение?
xaudio2redist.dll
в каталог вашего приложения. Кстати, в идеале вы избегаете всех вещей «устаревшего DirectX SDK», поэтому вам не нужно полагаться на установщик Steam. См. эту запись в блоге. - person Chuck Walbourn   schedule 03.02.2021