Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
Seek in Sound File: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
AutoSpider (talk | contribs) (Add "cleanup" tag) |
||
Line 1: | Line 1: | ||
{{Cleanup | reason=Auto-imported from ExpressionEngine.}} | |||
[[Category:Snippets]] | [[Category:Snippets]] | ||
[[Category:HowTo]] | [[Category:HowTo]] |
Revision as of 16:58, 3 March 2015
This article may require cleanup to meet the Qt Wiki's quality standards. Reason: Auto-imported from ExpressionEngine. Please improve this article if you can. Remove the {{cleanup}} tag and add this page to Updated pages list after it's clean. |
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.