From d8764171d6da1b87c32835cb68adf783d258efa6 Mon Sep 17 00:00:00 2001 From: Bernd Weimer Date: Tue, 18 Mar 2014 11:29:49 +0100 Subject: QNX: Evaluate mm-renderer buffer status 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 Reviewed-by: Fabian Bumberger --- .../qnx/mediaplayer/bpsmediaplayercontrol.cpp | 10 +++++-- .../mediaplayer/mmrenderermediaplayercontrol.cpp | 33 ++++++++++++++++------ .../qnx/mediaplayer/mmrenderermediaplayercontrol.h | 3 +- .../qnx/mediaplayer/ppsmediaplayercontrol.cpp | 7 +++-- 4 files changed, 38 insertions(+), 15 deletions(-) (limited to 'src/plugins/qnx/mediaplayer') diff --git a/src/plugins/qnx/mediaplayer/bpsmediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/bpsmediaplayercontrol.cpp index dde03ad59..2774a4c88 100644 --- a/src/plugins/qnx/mediaplayer/bpsmediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/bpsmediaplayercontrol.cpp @@ -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); } } diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp index ba3cbfdff..004eca36d 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.cpp @@ -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(capacity) * 100.0f; - emit bufferStatusChanged(m_bufferStatus); + m_bufferLevel = fill / static_cast(capacity) * 100.0f; + emit bufferStatusChanged(m_bufferLevel); } } } diff --git a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h index a22e71bfc..ffa8ae4fb 100644 --- a/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h +++ b/src/plugins/qnx/mediaplayer/mmrenderermediaplayercontrol.h @@ -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; }; diff --git a/src/plugins/qnx/mediaplayer/ppsmediaplayercontrol.cpp b/src/plugins/qnx/mediaplayer/ppsmediaplayercontrol.cpp index b54c7963f..de209c49b 100644 --- a/src/plugins/qnx/mediaplayer/ppsmediaplayercontrol.cpp +++ b/src/plugins/qnx/mediaplayer/ppsmediaplayercontrol.cpp @@ -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; -- cgit v1.2.3