From 4b8414b51dac70d949c0f516e1a7d8e723b97c29 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Wed, 31 May 2017 00:51:56 +0200 Subject: Android: implement QMediaPlayer::setPlaybackRate() Only possible on Android API level 23 or higher. Task-number: QTBUG-61115 Change-Id: I147575ed0a48f84d4208978a67e0856918e65b3d Reviewed-by: Alex Blasche --- .../src/mediaplayer/qandroidmediaplayercontrol.cpp | 43 ++++++++++++++++++++-- .../src/mediaplayer/qandroidmediaplayercontrol.h | 2 + 2 files changed, 42 insertions(+), 3 deletions(-) (limited to 'src/plugins/android/src/mediaplayer') diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp index 7aa7b97b8..df1463a87 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp @@ -93,7 +93,9 @@ QAndroidMediaPlayerControl::QAndroidMediaPlayerControl(QObject *parent) mPendingVolume(-1), mPendingMute(-1), mReloadingMedia(false), - mActiveStateChangeNotifiers(0) + mActiveStateChangeNotifiers(0), + mPendingPlaybackRate(1.0), + mHasPendingPlaybackRate(false) { connect(mMediaPlayer,SIGNAL(bufferingChanged(qint32)), this,SLOT(onBufferingChanged(qint32))); @@ -290,12 +292,45 @@ void QAndroidMediaPlayerControl::updateAvailablePlaybackRanges() qreal QAndroidMediaPlayerControl::playbackRate() const { - return 1.0f; + if (mHasPendingPlaybackRate || + (mState & (AndroidMediaPlayer::Initialized + | AndroidMediaPlayer::Prepared + | AndroidMediaPlayer::Started + | AndroidMediaPlayer::Paused + | AndroidMediaPlayer::PlaybackCompleted + | AndroidMediaPlayer::Error)) == 0) { + return mPendingPlaybackRate; + } + + return mMediaPlayer->playbackRate(); } void QAndroidMediaPlayerControl::setPlaybackRate(qreal rate) { - Q_UNUSED(rate); + if ((mState & (AndroidMediaPlayer::Initialized + | AndroidMediaPlayer::Prepared + | AndroidMediaPlayer::Started + | AndroidMediaPlayer::Paused + | AndroidMediaPlayer::PlaybackCompleted + | AndroidMediaPlayer::Error)) == 0) { + if (mPendingPlaybackRate != rate) { + mPendingPlaybackRate = rate; + mHasPendingPlaybackRate = true; + Q_EMIT playbackRateChanged(rate); + } + return; + } + + bool succeeded = mMediaPlayer->setPlaybackRate(rate); + + if (mHasPendingPlaybackRate) { + mHasPendingPlaybackRate = false; + mPendingPlaybackRate = qreal(1.0); + if (!succeeded) + Q_EMIT playbackRateChanged(playbackRate()); + } else if (succeeded) { + Q_EMIT playbackRateChanged(rate); + } } QMediaContent QAndroidMediaPlayerControl::media() const @@ -720,6 +755,8 @@ void QAndroidMediaPlayerControl::flushPendingStates() setVolume(mPendingVolume); if (mPendingMute != -1) setMuted((mPendingMute == 1)); + if (mHasPendingPlaybackRate) + setPlaybackRate(mPendingPlaybackRate); switch (newState) { case QMediaPlayer::PlayingState: diff --git a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h index 04f728a59..119add7f8 100644 --- a/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h +++ b/src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h @@ -117,6 +117,8 @@ private: int mPendingMute; bool mReloadingMedia; int mActiveStateChangeNotifiers; + qreal mPendingPlaybackRate; + bool mHasPendingPlaybackRate; // we need this because the rate can theoretically be negative void setState(QMediaPlayer::State state); void setMediaStatus(QMediaPlayer::MediaStatus status); -- cgit v1.2.3