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:
committed by
Martin Jones
parent
e2ca2d2485
commit
dc7453c28a
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user