Постараюсь описать всё как можно покороче.
Вот цикл программы, в котором выполняется обновление сообщений от Windows окна:
while( msg.message != WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
Кто работал с Виндой – знает. И, собственно, выполнение самой программы. Например, мне необходимо проиграть аудио файл в ф-ции подобной этой:
playSound( const string& file_name )
{
while( !engOfFile() )
{
// There is sound are playing...
}
}
Однако нам мешает следующее: в playSound(...) есть цикл который повторяет итерации на протяжении воспроизведения песни. Получается, что пока итерирует цикл принятия смс-оk от окна, sound are not playing. Так же само и наоборот: пока sound are playing, программу сложно закрыть, кроме как через диспетчер задач (и виден круглый курсор). В итоге: оба цикла мешают друг другу
playSound( "music.ogg" );
Window->update( );
// Anyway, we've got an issue.
Window->update( );
playSound( "music.ogg" );
Что посоветуете? Уже думал над отдельным потоком, но реализовать не вышло. Есть какие-то идеи, кто писал код под Windows?
Ответ
Посмотрите пример Playing and Recording Sound via the Wave API
Смотрите сразу playback wrapper functions
Суть тут для воспроизведения и записи звука примерно одинаковая: готовим буферы, в которые последовательно загружаем звуковые данные и передаем эти буферы в систему, а она уже Вас уведомляет о их завершении или ошибках через колбеки или через оконные уведомления.
Формат ogg, насколько я знаю, напрямую не поддерживается Windows. PlaySound, например конвертировать ogg точно не будет. Вам придется конвертировать его перед воспроизведением, в WAV, например. Для этого тоже есть свой API (смотрите функции с префиком acm). Подобрать кодек можно с помощью вызова acmFormatSuggest
Подробности - в MSDN: Converting Data from One Format to Another
Самый простой способ асинхронно проиграть файл, на мой взгляд - PlaySound
PlaySound(TEXT("recycle.wav"), NULL, SND_FILENAME | SND_ASYNC);
но учитывайте предыдущее замечание относительно этой функции касательно ogg
Комментариев нет:
Отправить комментарий