Reputation: 2528
I'm wondering is there a simple way in Qt to play sound without blocking the main thread ?
I know that normaly I should start a seperate thread to do this. But maybe there is a shortcut ? :)
Thanks for help.
Upvotes: 3
Views: 8425
Reputation: 121
QMediaPlayer shouldn't block your thread.
#include <QtMultimedia/QMediaPlayer>
QMediaPlayer *player = new QMediaPlayer;
player->setMedia(QUrl::fromLocalFile("/path"));
player->setVolume(50);
player->play();
Upvotes: 1
Reputation: 1089
I have been working with QT sound systems a lot, especially with the thread issues.
This solutions works for me:
Examples:
http://doc.qt.io/qt-5/qtmultimediawidgets-player-player-cpp.html
https://www.youtube.com/watch?v=DS7CDpIrwN4
Upvotes: 1
Reputation: 31851
The standard QSound and the Phonon library both have significant problems when it comes to playing sound. They both require the main message loop which means either a slight block in the main thread or a delay in playing the sound. Ultimately they both use a background thread, but the lag is easy to notice. Not to mention that Phonon has questionable support on many platforms.
I've worked with both for a while and tried to a build a simple sound system for playing user interface sounds (just to beep and pop occasionally). It just isn't possible using the standard Qt Library.
I'd recommend using OpenAL, which I eventually did. It's a relatively straight-forward library and seems to have good cross-platform support. The other option is SDL_mixer, but OpenAL seemed easier to get installed on Windows (probably not by much though). So basically if QSound::play
doesn't do what you want then the standard Qt API won't work for you.
Another important note, don't bother trying to fix the Qt sound api using a separate thread. It won't work. Phonon at least requires to be instantiated and called in the main thread.
Upvotes: 12
Reputation: 2439
http://doc.qt.nokia.com/latest/qsound.html
Qt provides the most commonly required audio operation in GUI applications: asynchronously playing a sound file. This is most easily accomplished using the static play() function:
QSound::play("mysounds/bells.wav");
It seems like this is an asynchronous operation, so it shouldn't block your main thread.
Upvotes: 3