Add resource release timer when pausing or stopping media.

If media is paused, stopped, or end of media, if state hasn't changed to
playing state, release the resources. The idea with the timer is that if
for example media player is playing one song which ends, there won't be
release()/acquire() unnecessarily if next song is immediately set as
media and started playing.
This commit is contained in:
Juho Hämäläinen
2014-06-13 10:29:47 +03:00
committed by Martin Jones
parent e2ca2d2485
commit dc7453c28a
2 changed files with 48 additions and 0 deletions

View File

@@ -42,6 +42,7 @@
#include <QtCore/qsocketnotifier.h>
#include <QtCore/qurl.h>
#include <QtCore/qdebug.h>
#include <QTimer>
#include <sys/types.h>
#include <sys/stat.h>
@@ -50,6 +51,11 @@
//#define DEBUG_PLAYBIN
// 2 second timeout for releasing the resources
// Value was selected as combination of fair dice roll and personal
// feeling when testing.
#define RELEASE_TIMER_TIMEOUT (1000 * 2)
QT_BEGIN_NAMESPACE
QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *session, QObject *parent)
@@ -62,6 +68,7 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
, m_pendingSeekPosition(-1)
, m_setMediaPending(false)
, m_stream(0)
, m_releaseTimer(0)
{
m_resources = QMediaResourcePolicy::createResourceSet<QMediaPlayerResourceSetInterface>();
Q_ASSERT(m_resources);
@@ -99,10 +106,16 @@ QGstreamerPlayerControl::QGstreamerPlayerControl(QGstreamerPlayerSession *sessio
//so handleResourcesDenied should be processed later, otherwise it will be overwritten by state update later in playOrPause.
connect(m_resources, SIGNAL(resourcesDenied()), this, SLOT(handleResourcesDenied()), Qt::QueuedConnection);
connect(m_resources, SIGNAL(resourcesLost()), SLOT(handleResourcesLost()));
m_releaseTimer = new QTimer(this);
m_releaseTimer->setSingleShot(true);
connect(m_releaseTimer, SIGNAL(timeout()), this, SLOT(handleRelease()));
}
QGstreamerPlayerControl::~QGstreamerPlayerControl()
{
stopReleaseTimer();
QMediaResourcePolicy::destroyResourceSet(m_resources);
}
@@ -207,6 +220,7 @@ void QGstreamerPlayerControl::play()
//m_userRequestedState is needed to know that we need to resume playback when resource-policy
//regranted the resources after lost, since m_currentState will become paused when resources are
//lost.
stopReleaseTimer();
m_userRequestedState = QMediaPlayer::PlayingState;
playOrPause(QMediaPlayer::PlayingState);
}
@@ -216,6 +230,7 @@ void QGstreamerPlayerControl::pause()
#ifdef DEBUG_PLAYBIN
qDebug() << Q_FUNC_INFO;
#endif
restartReleaseTimer();
m_userRequestedState = QMediaPlayer::PausedState;
playOrPause(QMediaPlayer::PausedState);
@@ -316,6 +331,8 @@ void QGstreamerPlayerControl::stop()
}
}
restartReleaseTimer();
popAndNotifyState();
}
@@ -510,6 +527,8 @@ void QGstreamerPlayerControl::processEOS()
m_session->showPrerollFrames(false); // stop showing prerolled frames in stop state
}
restartReleaseTimer();
popAndNotifyState();
}
@@ -622,4 +641,26 @@ void QGstreamerPlayerControl::popAndNotifyState()
}
}
void QGstreamerPlayerControl::restartReleaseTimer()
{
stopReleaseTimer();
m_releaseTimer->start(RELEASE_TIMER_TIMEOUT);
}
void QGstreamerPlayerControl::stopReleaseTimer()
{
m_releaseTimer->stop();
}
void QGstreamerPlayerControl::handleRelease()
{
if (m_currentState != QMediaPlayer::PlayingState ||
m_mediaStatus == QMediaPlayer::EndOfMedia) {
#ifdef DEBUG_PLAYBIN
qDebug() << "handleRelease currentState " << m_currentState << " mediaStatus " << m_mediaStatus;
#endif
m_resources->release();
}
}
QT_END_NAMESPACE

View File

@@ -36,6 +36,7 @@
#include <QtCore/qobject.h>
#include <QtCore/qstack.h>
#include <QTimer>
#include <qmediaplayercontrol.h>
#include <qmediaplayer.h>
@@ -110,12 +111,17 @@ private Q_SLOTS:
void handleResourcesLost();
void handleResourcesDenied();
void handleRelease();
private:
void playOrPause(QMediaPlayer::State state);
void pushState();
void popAndNotifyState();
void restartReleaseTimer();
void stopReleaseTimer();
QGstreamerPlayerSession *m_session;
QMediaPlayer::State m_userRequestedState;
QMediaPlayer::State m_currentState;
@@ -130,6 +136,7 @@ private:
QIODevice *m_stream;
QMediaPlayerResourceSetInterface *m_resources;
QTimer *m_releaseTimer;
};
QT_END_NAMESPACE