Sebastian Dusza
Sebastian Dusza

Reputation: 2528

Qt: How to play sound witout blocking main thread?

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

Answers (4)

Am.sheikhjafari
Am.sheikhjafari

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

user257980
user257980

Reputation: 1089

I have been working with QT sound systems a lot, especially with the thread issues.

This solutions works for me:

  1. Convert any wav to mp3, because there is issues for playing wavs in qt 5.5.
  2. Add those mp3 files to your resources in QT (qrc).
  3. Use QMediaPlayer to play sounds.

Examples:

http://doc.qt.io/qt-5/qtmultimediawidgets-player-player-cpp.html

https://www.youtube.com/watch?v=DS7CDpIrwN4

Upvotes: 1

edA-qa mort-ora-y
edA-qa mort-ora-y

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

rtpg
rtpg

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

Related Questions