--- a/qtmobility/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp Wed Jun 23 19:08:38 2010 +0300
@@ -60,6 +60,7 @@
, m_state(QMediaPlayer::StoppedState)
, m_mediaStatus(QMediaPlayer::NoMedia)
, m_bufferProgress(-1)
+ , m_seekToStartPending(false)
, m_stream(0)
, m_fifoNotifier(0)
, m_fifoCanWrite(false)
@@ -105,7 +106,7 @@
qint64 QGstreamerPlayerControl::position() const
{
- return m_session->position();
+ return m_seekToStartPending ? 0 : m_session->position();
}
qint64 QGstreamerPlayerControl::duration() const
@@ -168,37 +169,77 @@
void QGstreamerPlayerControl::setPosition(qint64 pos)
{
- m_session->seek(pos);
+ if (m_mediaStatus == QMediaPlayer::EndOfMedia) {
+ m_mediaStatus = QMediaPlayer::LoadedMedia;
+ emit mediaStatusChanged(m_mediaStatus);
+ }
+
+ if (m_session->seek(pos))
+ m_seekToStartPending = false;
}
void QGstreamerPlayerControl::play()
{
- if (m_session->play()) {
- if (m_state != QMediaPlayer::PlayingState)
- emit stateChanged(m_state = QMediaPlayer::PlayingState);
- }
+ playOrPause(QMediaPlayer::PlayingState);
}
void QGstreamerPlayerControl::pause()
{
- if (m_session->pause()) {
- if (m_state != QMediaPlayer::PausedState)
- emit stateChanged(m_state = QMediaPlayer::PausedState);
+ playOrPause(QMediaPlayer::PausedState);
+}
+
+void QGstreamerPlayerControl::playOrPause(QMediaPlayer::State newState)
+{
+ QMediaPlayer::State oldState = m_state;
+ QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus;
+
+ if (m_mediaStatus == QMediaPlayer::EndOfMedia)
+ m_mediaStatus = QMediaPlayer::BufferedMedia;
+
+ if (m_seekToStartPending) {
+ m_session->pause();
+ if (!m_session->seek(0)) {
+ m_bufferProgress = -1;
+ m_session->stop();
+ m_mediaStatus = QMediaPlayer::LoadingMedia;
+ }
+ m_seekToStartPending = false;
}
+
+ bool ok = false;
+ if (newState == QMediaPlayer::PlayingState)
+ ok = m_session->play();
+ else
+ ok = m_session->pause();
+
+ if (!ok)
+ return;
+
+ m_state = newState;
+
+ if (m_mediaStatus == QMediaPlayer::EndOfMedia || m_mediaStatus == QMediaPlayer::LoadedMedia) {
+ if (m_bufferProgress == -1 || m_bufferProgress == 100)
+ m_mediaStatus = QMediaPlayer::BufferedMedia;
+ else
+ m_mediaStatus = QMediaPlayer::BufferingMedia;
+ }
+
+ if (m_state != oldState)
+ emit stateChanged(m_state);
+ if (m_mediaStatus != oldMediaStatus)
+ emit mediaStatusChanged(m_mediaStatus);
+
}
void QGstreamerPlayerControl::stop()
{
if (m_state != QMediaPlayer::StoppedState) {
+ m_state = QMediaPlayer::StoppedState;
m_session->pause();
- if (!m_session->seek(0)) {
- m_bufferProgress = -1;
- m_session->stop();
- m_session->pause();
- }
+ m_seekToStartPending = true;
+ updateState(m_session->state());
emit positionChanged(0);
- if (m_state != QMediaPlayer::StoppedState)
- emit stateChanged(m_state = QMediaPlayer::StoppedState);
+ emit stateChanged(m_state);
}
}
@@ -242,6 +283,7 @@
m_currentResource = content;
m_stream = stream;
+ m_seekToStartPending = false;
QUrl url;
@@ -253,7 +295,7 @@
url = content.canonicalUrl();
}
- m_session->load(url);
+ m_session->load(url);
if (m_fifoFd[1] >= 0) {
m_fifoCanWrite = true;
@@ -294,24 +336,34 @@
void QGstreamerPlayerControl::updateState(QMediaPlayer::State state)
{
QMediaPlayer::MediaStatus oldStatus = m_mediaStatus;
+ QMediaPlayer::State oldState = m_state;
switch (state) {
case QMediaPlayer::StoppedState:
- if (m_state != QMediaPlayer::StoppedState)
- emit stateChanged(m_state = QMediaPlayer::StoppedState);
+ m_state = QMediaPlayer::StoppedState;
+ if (m_currentResource.isNull())
+ m_mediaStatus = QMediaPlayer::NoMedia;
+ else
+ m_mediaStatus = QMediaPlayer::LoadingMedia;
break;
case QMediaPlayer::PlayingState:
case QMediaPlayer::PausedState:
- if (m_state == QMediaPlayer::StoppedState)
+ if (m_state == QMediaPlayer::StoppedState) {
m_mediaStatus = QMediaPlayer::LoadedMedia;
- else {
- if (m_bufferProgress == -1)
+ } else {
+ if (m_bufferProgress == -1 || m_bufferProgress == 100)
m_mediaStatus = QMediaPlayer::BufferedMedia;
}
break;
}
+ //EndOfMedia status should be kept, until reset by pause, play or setMedia
+ if (oldStatus == QMediaPlayer::EndOfMedia)
+ m_mediaStatus = QMediaPlayer::EndOfMedia;
+
+ if (m_state != oldState)
+ emit stateChanged(m_state);
if (m_mediaStatus != oldStatus)
emit mediaStatusChanged(m_mediaStatus);
}
@@ -319,9 +371,7 @@
void QGstreamerPlayerControl::processEOS()
{
m_mediaStatus = QMediaPlayer::EndOfMedia;
- m_state = QMediaPlayer::StoppedState;
-
- emit stateChanged(m_state);
+ stop();
emit mediaStatusChanged(m_mediaStatus);
}