How to Seek in Sound File
I tried to play a sound file not at the beginning but with an offset of 20 seconds.
The following way of setting an offset fails:
- player = new QMediaPlayer(this);
- player->play(); // music can be heard
- qDebug() << player->isSeekable(); // is always false
- player->setPosition ( 20*1000 ); //does not work
It does not work because QMediaPlayer works asynchronously.
As soon as the seek operations are delayed everything works as intended. For example:
- qDebug() << player->isSeekable(); // true
- player->setPosition ( 20*1000 );
To make my life easier I have derived a class MediaPlayer from QMediaPlayer and added a blocking load method:
- void MediaPlayer::loadBlocking(const QString &file;)
- QEventLoop loop;
- QTimer timer;
- loop.connect(&timer;, SIGNAL(timeout()), &loop;, SLOT(quit()) );
- loop.connect(this, SIGNAL(seekableChanged(bool)), &loop;, SLOT(quit()));
When files are loaded with this blocking load method
setPosition() can be called right in the next source line.
loadBlocking blocks until signal
seekableChanged() is emitted. To avoid a deadlock, maximum waiting time is 2 seconds.