Seek in sound file: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Add "cleanup" tag)
(Redirect to Seek in Sound File)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
#REDIRECT [[Seek in Sound File]]


[[Category:Snippets]]
[[Category:Snippets]]
Line 28: Line 28:
To make my life easier I have derived a class MediaPlayer from QMediaPlayer and added a blocking load method:
To make my life easier I have derived a class MediaPlayer from QMediaPlayer and added a blocking load method:


<code>void MediaPlayer::loadBlocking(const QString &amp;file;)
<code>void MediaPlayer::loadBlocking(const QString &file;)
{
{
  setMedia(QUrl::fromLocalFile(file));
  setMedia(QUrl::fromLocalFile(file));
Line 37: Line 37:
  timer.setSingleShot(true);
  timer.setSingleShot(true);
  timer.setInterval(2000);
  timer.setInterval(2000);
  loop.connect(&amp;timer;, SIGNAL (timeout()), &amp;loop;, SLOT (quit()) );
  loop.connect(&timer;, SIGNAL (timeout()), &loop;, SLOT (quit()) );
  loop.connect(this, SIGNAL (seekableChanged(bool)), &amp;loop;, SLOT (quit()));
  loop.connect(this, SIGNAL (seekableChanged(bool)), &loop;, SLOT (quit()));
  loop.exec();
  loop.exec();
  }
  }

Latest revision as of 08:17, 13 April 2015

Redirect to:


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->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.