diff options
author | Yoann Lopes <yoann.lopes@qt.io> | 2017-05-31 00:51:56 +0200 |
---|---|---|
committer | Christian Stromme <christian.stromme@qt.io> | 2018-09-26 10:50:18 +0000 |
commit | 4b8414b51dac70d949c0f516e1a7d8e723b97c29 (patch) | |
tree | db19e65a90b98c10a9eea39569e47c60518f3d4d /src/plugins/android/src/mediaplayer | |
parent | 3f8962e984969881b057fd294f9f3f3e812f7c4c (diff) |
Android: implement QMediaPlayer::setPlaybackRate()
Only possible on Android API level 23 or higher.
Task-number: QTBUG-61115
Change-Id: I147575ed0a48f84d4208978a67e0856918e65b3d
Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/plugins/android/src/mediaplayer')
-rw-r--r-- | src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.cpp | 43 | ||||
-rw-r--r-- | src/plugins/android/src/mediaplayer/qandroidmediaplayercontrol.h | 2 |
2 files changed, 42 insertions, 3 deletions
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); |