QNX: Evaluate mm-renderer buffer status
authorBernd Weimer <bweimer@blackberry.com>
Tue, 18 Mar 2014 10:29:49 +0000 (11:29 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 19 Mar 2014 14:21:03 +0000 (15:21 +0100)
In the playing (or paused) state the media status should reflect the
buffer state, it should not stay in the loaded media state.

Mm-renderer differentiates between buffer "status" and "level".
Unfortunately, QMediaPlayer's buffer status maps to mm-renderer's
buffer level.

Change-Id: I22ea8dc83cee975fc4aa1a6de4f172def042a9a8
QT-BUG: 37166
Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
src/plugins/qnx/mediaplayer/bpsmediaplayercontrol.cpp
src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp
src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h
src/plugins/qnx/mediaplayer/ppsmediaplayercontrol.cpp

index dde03ad..2774a4c 100644 (file)
@@ -103,11 +103,15 @@ bool BpsMediaPlayerControl::nativeEventFilter(const QByteArray &eventType, void
         }
 
         if (bps_event_get_code(event) == MMRENDERER_STATUS_UPDATE) {
-            const qint64 newPosition = QString::fromLatin1(mmrenderer_event_get_position(event)).toLongLong();
+            const qint64 newPosition = QString::fromLatin1(mmrenderer_event_get_position(event)).
+                                       toLongLong();
             handleMmStatusUpdate(newPosition);
 
-            const QString bufferStatus = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event));
-            setMmBufferStatus(bufferStatus);
+            const QString status = QString::fromLatin1(mmrenderer_event_get_bufferstatus(event));
+            setMmBufferStatus(status);
+
+            const QString level = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event));
+            setMmBufferLevel(level);
         }
     }
 
index ba3cbfd..004eca3 100644 (file)
@@ -73,7 +73,7 @@ MmRendererMediaPlayerControl::MmRendererMediaPlayerControl(QObject *parent)
       m_playAfterMediaLoaded(false),
       m_inputAttached(false),
       m_stopEventsToIgnore(0),
-      m_bufferStatus(0)
+      m_bufferLevel(0)
 {
     m_loadingTimer.setSingleShot(true);
     m_loadingTimer.setInterval(0);
@@ -234,8 +234,11 @@ void MmRendererMediaPlayerControl::attach()
 
     m_inputAttached = true;
     setMediaStatus(QMediaPlayer::LoadedMedia);
-    m_bufferStatus = 0;
-    emit bufferStatusChanged(m_bufferStatus);
+
+    // mm-renderer has buffer properties "status" and "level"
+    // QMediaPlayer's buffer status maps to mm-renderer's buffer level
+    m_bufferLevel = 0;
+    emit bufferStatusChanged(m_bufferLevel);
 }
 
 void MmRendererMediaPlayerControl::detach()
@@ -406,7 +409,9 @@ void MmRendererMediaPlayerControl::setMuted(bool muted)
 
 int MmRendererMediaPlayerControl::bufferStatus() const
 {
-    return m_bufferStatus;
+    // mm-renderer has buffer properties "status" and "level"
+    // QMediaPlayer's buffer status maps to mm-renderer's buffer level
+    return m_bufferLevel;
 }
 
 bool MmRendererMediaPlayerControl::isAudioAvailable() const
@@ -585,13 +590,23 @@ void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition)
 
 void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus)
 {
-    const int slashPos = bufferStatus.indexOf('/');
+    if (bufferStatus == QLatin1String("buffering"))
+        setMediaStatus(QMediaPlayer::BufferingMedia);
+    else if (bufferStatus == QLatin1String("playing"))
+        setMediaStatus(QMediaPlayer::BufferedMedia);
+    // ignore "idle" buffer status
+}
+
+void MmRendererMediaPlayerControl::setMmBufferLevel(const QString &bufferLevel)
+{
+    // buffer level has format level/capacity, e.g. "91319/124402"
+    const int slashPos = bufferLevel.indexOf('/');
     if (slashPos != -1) {
-        const int fill = bufferStatus.leftRef(slashPos).toInt();
-        const int capacity = bufferStatus.midRef(slashPos + 1).toInt();
+        const int fill = bufferLevel.leftRef(slashPos).toInt();
+        const int capacity = bufferLevel.midRef(slashPos + 1).toInt();
         if (capacity != 0) {
-            m_bufferStatus = fill / static_cast<float>(capacity) * 100.0f;
-            emit bufferStatusChanged(m_bufferStatus);
+            m_bufferLevel = fill / static_cast<float>(capacity) * 100.0f;
+            emit bufferStatusChanged(m_bufferLevel);
         }
     }
 }
index a22e71b..ffa8ae4 100644 (file)
@@ -115,6 +115,7 @@ protected:
     void emitPError(const QString &msg);
     void setMmPosition(qint64 newPosition);
     void setMmBufferStatus(const QString &bufferStatus);
+    void setMmBufferLevel(const QString &bufferLevel);
     void handleMmStopped();
     void handleMmStatusUpdate(qint64 position);
 
@@ -162,7 +163,7 @@ private:
     bool m_playAfterMediaLoaded;
     bool m_inputAttached;
     int m_stopEventsToIgnore;
-    int m_bufferStatus;
+    int m_bufferLevel;
     QString m_tempMediaFileName;
     QTimer m_loadingTimer;
 };
index b54c796..de209c4 100644 (file)
@@ -171,9 +171,12 @@ void PpsMediaPlayerControl::ppsReadyRead(int fd)
     pps_decoder_push(&decoder, 0);
 
     const char *value = 0;
-    if (pps_decoder_get_string(&decoder, "bufferlevel", &value) == PPS_DECODER_OK) {
+
+    if (pps_decoder_get_string(&decoder, "bufferstatus", &value) == PPS_DECODER_OK)
         setMmBufferStatus(QString::fromLatin1(value));
-    }
+
+    if (pps_decoder_get_string(&decoder, "bufferlevel", &value) == PPS_DECODER_OK)
+        setMmBufferLevel(QString::fromLatin1(value));
 
     if (pps_decoder_get_string(&decoder, "state", &value) == PPS_DECODER_OK) {
         const QByteArray state = value;