Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

Проблема в архитектуре приложения: итерации и циклы

Постараюсь описать всё как можно покороче. Вот цикл программы, в котором выполняется обновление сообщений от 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

Комментариев нет:

Отправить комментарий