Всем доброй ночи. Все-таки не успокоюсь, пока не решу окончательно одну проблему. В этот раз постараюсь получше изъяснится, т.к. в прошлый никто не помог, да и в общем, проблему не так поняли. Вот вам тело одной ф-ции:
auto sound = audio_system->LoadSound("gong.ogg");
sound->SetVolume(0.05f);
sound->Play();
MSG msg = {0};
while(sound->IsPlaying() == true)
{
while(msg.message != WM_QUIT)
{
audio_system->Streaming(*sound);
if(PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
break;
if(msg.message == WM_QUIT)
return;
}
}
Знаю, это ни словами, ни матом не описать, но только вот это все решает мою an issue. В консольных apps все ok, да вот с Win32, что-то не так. Это AcousticsLib, если кому-то полезней знать, чтобы решить задачу. Только перед стриимингом можно изменить громкось, источника, вот поэтому я с этим хочу попарится. В общем-то, audio_system->Streaming(*sound); должен быть в true-цикле, пока играет один sound. Иначе, он попросту не будет играть. Streaming не дает обновляться окну, пока он не завепшит playSound. Это единственный код, что у меня работает. Потоки либо не давали никакого эффекта, либо программа крэшилась. Причем это один sound, а что если я два и более захочу? Хотелось бы:
PlayTestSound(); // здесь playSound, собственно
Window->update(); // здесь прием сообщений
Надеюсь, во второй раз мне помогут разобраться с этим. Спасибо.
Благодаря @KoVadim и его совету об отдельном потоке, у меня вышел рабочий код, который не задерживается в цикле стримминга и выглядит не так ужасно. Это элементарно с помощью std::thread и его методе join:
auto foo_lambda = [] ()
{
auto sound = ac_lib->LoadSound("gong.ogg");
sound->SetVolume(0.5f); // Теперь есть возможность изменить громкость источника
sound->Play();
while(sound->IsPlaying())
{
ac_lib->Streaming(*sound);
}
};
std::thread thr1(foo); // Create thread.
window()->update(); // Update window.
thr1.join(); // Joining thread.
Не смотрите, что загрузка и воспроизведение в одной лямбде, все это для краткости. Как видите необходим современный компилятор с поддержкой std::thread и лябмд. И окно события принимает и стримминг происходит. Большое спасибо @KoVadim за наводку. Изучайте многопоточность.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей