Как определить, когда закончилось воспроизведение звука при использовании PlaySound в Win32 SDK? - PullRequest
1 голос
/ 09 мая 2011

Я использую функцию PlaySound из Win32 SDK для воспроизведения звукового файла. В настоящее время у меня есть следующая строка кода:

PlaySound(szFile,NULL,SND_FILENAME );

Но теперь я хочу знать, как я могу определить время окончания воспроизведения волнового файла? Я хочу изменить текст кнопки, когда волна перестает играть.

Ответы [ 2 ]

5 голосов
/ 09 мая 2011

PlaySound очень ограничен в своих возможностях.В продукте, над которым я работаю, мы создали библиотеку воспроизведения мультимедиа поверх DirectSound, чтобы преодолеть ограничения.Среди прочего он включал в себя написание анализатора файлов WAV и потокового кода для поддержки потока образцов PCM в буфер DirectSound.Не для слабонервных.

Вы можете пойти по этому пути, но вот несколько простых советов.

  1. Если вы знаете длину воспроизводимого файла WAV,Вы можете вызвать PlaySound с флагом SND_ASYNC.Запланируйте таймер, чтобы стрелять в предполагаемое время, когда звук должен закончиться.Если вы не знаете длину WAV-файла, вы можете написать синтаксический анализатор для чтения заголовка файла.Сравнивает частоту дискретизации и формат из фрагмента "fmt" с количеством байтов в блоке данных для вычисления длины файла.

  2. ИЛИ .... Создать выделенныйпоток для выдачи вызовов PlaySound (без флага SND_ASYNC).Когда синхронная функция PlaySound возвращается, выполните PostMessage в свой поток пользовательского интерфейса, чтобы обновить кнопку.Если у вас есть перекрывающиеся вызовы в PlaySound, вам, вероятно, потребуется выполнить многопоточную синхронизацию, но это не должно быть сложно.

1 голос
/ 09 мая 2011

Если вы не укажете флаг SND_ASYNC, функция PlaySound будет синхронной , означая, что после ее вызова она не возвращает управление вашей программе до после он завершил воспроизведение звукового файла.

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

Вы можете просто обновить текст элемента управления вашей кнопки в следующей строке кода, сразу после вызова функции PlaySound. Если вы хотите, чтобы кнопка обновлялась немедленно, чтобы отразить ваши изменения, вам также может понадобиться вызвать UpdateWindow функцию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...