void MmRendererMediaPlayerControl::attach() { // Should only be called in detached state Q_ASSERT(m_audioId == -1 && !m_inputAttached); if (m_media.isNull() || !m_context) { setMediaStatus(QMediaPlayer::NoMedia); return; } if (m_videoRendererControl) m_videoRendererControl->attachDisplay(m_context); if (m_videoWindowControl) m_videoWindowControl->attachDisplay(m_context); const QByteArray defaultAudioDevice = qgetenv("QQNX_RENDERER_DEFAULT_AUDIO_SINK"); m_audioId = mmr_output_attach(m_context, defaultAudioDevice.isEmpty() ? "audio:default" : defaultAudioDevice.constData(), "audio"); if (m_audioId == -1) { emitMmError("mmr_output_attach() for audio failed"); return; } const QByteArray resourcePath = resourcePathForUrl(m_media.canonicalUrl()); if (resourcePath.isEmpty()) { detach(); return; } if (mmr_input_attach(m_context, resourcePath.constData(), "track") != 0) { emitMmError(QStringLiteral("mmr_input_attach() failed for ") + QString(resourcePath)); setMediaStatus(QMediaPlayer::InvalidMedia); detach(); return; } // For whatever reason, the mmrenderer sends out a MMR_STOPPED event when calling // mmr_input_attach() above. Ignore it, as otherwise we'll trigger stopping right after we // started. m_stopEventsToIgnore++; m_inputAttached = true; setMediaStatus(QMediaPlayer::LoadedMedia); // 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 BbMediaPlayerControl::setPositionInternal(qint64 position) { if (!m_context) return; if (mmr_seek(m_context, QString::number(position).toAscii()) != 0) emitMmError("Seeking failed"); }
void BbMediaPlayerControl::setPlaybackRateInternal(qreal rate) { if (!m_context) return; const int mmRate = rate * 1000; if (mmr_speed_set(m_context, mmRate) != 0) emitMmError("mmr_speed_set failed"); }
void MmRendererMediaPlayerControl::setPositionInternal(qint64 position) { if (!m_context) return; if (m_metaData.isSeekable()) { if (mmr_seek(m_context, QString::number(position).toLatin1()) != 0) emitMmError("Seeking failed"); } }
void BbMediaPlayerControl::setVolumeInternal(int newVolume) { if (!m_context) return; newVolume = qBound(0, newVolume, 100); if (m_audioId != -1) { strm_dict_t * dict = strm_dict_new(); dict = strm_dict_set(dict, "volume", QString::number(newVolume).toAscii()); if (mmr_output_parameters(m_context, m_audioId, dict) != 0) emitMmError("mmr_output_parameters: Setting volume failed"); } }
void BbMediaPlayerControl::attach() { if (m_media.isNull() || !m_context) { setMediaStatus(QMediaPlayer::NoMedia); return; } if (m_videoControl) m_videoControl->attachDisplay(m_context); m_audioId = mmr_output_attach(m_context, "audio:default", "audio"); if (m_audioId == -1) { emitMmError("mmr_output_attach() for audio failed"); return; } const QString resourcePath = resourcePathForUrl(m_media.canonicalUrl()); if (resourcePath.isEmpty()) { detach(); return; } if (mmr_input_attach(m_context, QFile::encodeName(resourcePath), "track") != 0) { emitMmError(QString("mmr_input_attach() for %1 failed").arg(resourcePath)); setMediaStatus(QMediaPlayer::InvalidMedia); detach(); return; } // For whatever reason, the mmrenderer sends out a MMR_STOPPED event when calling // mmr_input_attach() above. Ignore it, as otherwise we'll trigger stopping right after we // started. m_stopEventsToIgnore++; m_inputAttached = true; setMediaStatus(QMediaPlayer::LoadedMedia); m_bufferStatus = 0; emit bufferStatusChanged(m_bufferStatus); }
void MmRendererMediaPlayerControl::play() { if (m_playAfterMediaLoaded) m_playAfterMediaLoaded = false; // No-op if we are already playing, except if we were called from continueLoadMedia(), in which // case m_playAfterMediaLoaded is true (hence the 'else'). else if (m_state == QMediaPlayer::PlayingState) return; if (m_mediaStatus == QMediaPlayer::LoadingMedia) { // State changes are supposed to be synchronous setState(QMediaPlayer::PlayingState); // Defer playing to later, when the timer triggers continueLoadMedia() m_playAfterMediaLoaded = true; return; } // Un-pause the state when it is paused if (m_state == QMediaPlayer::PausedState) { setPlaybackRateInternal(m_rate); setState(QMediaPlayer::PlayingState); return; } if (m_media.isNull() || !m_connection || !m_context || m_audioId == -1) { setState(QMediaPlayer::StoppedState); return; } if (m_mediaStatus == QMediaPlayer::EndOfMedia) m_position = 0; setPositionInternal(m_position); setVolumeInternal(m_muted ? 0 : m_volume); setPlaybackRateInternal(m_rate); if (mmr_play(m_context) != 0) { setState(QMediaPlayer::StoppedState); emitMmError("mmr_play() failed"); return; } m_stopEventsToIgnore = 0; // once playing, stop events must be proccessed setState( QMediaPlayer::PlayingState); }