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 <rafael.roquetto@kdab.com>
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
This commit is contained in:
Bernd Weimer
2014-03-18 11:29:49 +01:00
committed by The Qt Project
parent 19ce431f9f
commit d8764171d6
4 changed files with 38 additions and 15 deletions

View File

@@ -103,11 +103,15 @@ bool BpsMediaPlayerControl::nativeEventFilter(const QByteArray &eventType, void
} }
if (bps_event_get_code(event) == MMRENDERER_STATUS_UPDATE) { 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); handleMmStatusUpdate(newPosition);
const QString bufferStatus = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event)); const QString status = QString::fromLatin1(mmrenderer_event_get_bufferstatus(event));
setMmBufferStatus(bufferStatus); setMmBufferStatus(status);
const QString level = QString::fromLatin1(mmrenderer_event_get_bufferlevel(event));
setMmBufferLevel(level);
} }
} }

View File

@@ -73,7 +73,7 @@ MmRendererMediaPlayerControl::MmRendererMediaPlayerControl(QObject *parent)
m_playAfterMediaLoaded(false), m_playAfterMediaLoaded(false),
m_inputAttached(false), m_inputAttached(false),
m_stopEventsToIgnore(0), m_stopEventsToIgnore(0),
m_bufferStatus(0) m_bufferLevel(0)
{ {
m_loadingTimer.setSingleShot(true); m_loadingTimer.setSingleShot(true);
m_loadingTimer.setInterval(0); m_loadingTimer.setInterval(0);
@@ -234,8 +234,11 @@ void MmRendererMediaPlayerControl::attach()
m_inputAttached = true; m_inputAttached = true;
setMediaStatus(QMediaPlayer::LoadedMedia); 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() void MmRendererMediaPlayerControl::detach()
@@ -406,7 +409,9 @@ void MmRendererMediaPlayerControl::setMuted(bool muted)
int MmRendererMediaPlayerControl::bufferStatus() const 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 bool MmRendererMediaPlayerControl::isAudioAvailable() const
@@ -585,13 +590,23 @@ void MmRendererMediaPlayerControl::setMmPosition(qint64 newPosition)
void MmRendererMediaPlayerControl::setMmBufferStatus(const QString &bufferStatus) 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) { if (slashPos != -1) {
const int fill = bufferStatus.leftRef(slashPos).toInt(); const int fill = bufferLevel.leftRef(slashPos).toInt();
const int capacity = bufferStatus.midRef(slashPos + 1).toInt(); const int capacity = bufferLevel.midRef(slashPos + 1).toInt();
if (capacity != 0) { if (capacity != 0) {
m_bufferStatus = fill / static_cast<float>(capacity) * 100.0f; m_bufferLevel = fill / static_cast<float>(capacity) * 100.0f;
emit bufferStatusChanged(m_bufferStatus); emit bufferStatusChanged(m_bufferLevel);
} }
} }
} }

View File

@@ -115,6 +115,7 @@ protected:
void emitPError(const QString &msg); void emitPError(const QString &msg);
void setMmPosition(qint64 newPosition); void setMmPosition(qint64 newPosition);
void setMmBufferStatus(const QString &bufferStatus); void setMmBufferStatus(const QString &bufferStatus);
void setMmBufferLevel(const QString &bufferLevel);
void handleMmStopped(); void handleMmStopped();
void handleMmStatusUpdate(qint64 position); void handleMmStatusUpdate(qint64 position);
@@ -162,7 +163,7 @@ private:
bool m_playAfterMediaLoaded; bool m_playAfterMediaLoaded;
bool m_inputAttached; bool m_inputAttached;
int m_stopEventsToIgnore; int m_stopEventsToIgnore;
int m_bufferStatus; int m_bufferLevel;
QString m_tempMediaFileName; QString m_tempMediaFileName;
QTimer m_loadingTimer; QTimer m_loadingTimer;
}; };

View File

@@ -171,9 +171,12 @@ void PpsMediaPlayerControl::ppsReadyRead(int fd)
pps_decoder_push(&decoder, 0); pps_decoder_push(&decoder, 0);
const char *value = 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)); 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) { if (pps_decoder_get_string(&decoder, "state", &value) == PPS_DECODER_OK) {
const QByteArray state = value; const QByteArray state = value;