Seek in Sound File

From Qt Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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->setMedia(QUrl::fromLocalFile("myCoolSong.mp3"));
player->setVolume(50);
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:

CoolPlayer::on_Button1_clicked()
{
 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;)
{
 setMedia(QUrl::fromLocalFile(file));
 if(!isSeekable())
 {
 QEventLoop loop;
 QTimer timer;
 timer.setSingleShot(true);
 timer.setInterval(2000);
 loop.connect(&timer;, SIGNAL (timeout()), &loop;, SLOT (quit()) );
 loop.connect(this, SIGNAL (seekableChanged(bool)), &loop;, SLOT (quit()));
 loop.exec();
 }
}

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.