qtmobility/plugins/multimedia/gstreamer/mediaplayer/qgstreamerplayercontrol.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- 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);
 }