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/wrappers/jni/androidmediaplayer.cpp | |
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/wrappers/jni/androidmediaplayer.cpp')
-rw-r--r-- | src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp index 582d8aa9d..b81f98cbd 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp @@ -109,6 +109,33 @@ bool AndroidMediaPlayer::isMuted() return mMediaPlayer.callMethod<jboolean>("isMuted"); } +qreal AndroidMediaPlayer::playbackRate() +{ + qreal rate(1.0); + + if (QtAndroidPrivate::androidSdkVersion() < 23) + return rate; + + QJNIObjectPrivate player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle", "()Landroid/media/MediaPlayer;"); + if (player.isValid()) { + QJNIObjectPrivate playbackParams = player.callObjectMethod("getPlaybackParams", "()Landroid/media/PlaybackParams;"); + if (playbackParams.isValid()) { + const qreal speed = playbackParams.callMethod<jfloat>("getSpeed", "()F"); + QJNIEnvironmentPrivate env; + if (env->ExceptionCheck()) { +#ifdef QT_DEBUG + env->ExceptionDescribe(); +#endif // QT_DEBUG + env->ExceptionClear(); + } else { + rate = speed; + } + } + } + + return rate; +} + jobject AndroidMediaPlayer::display() { return mMediaPlayer.callObjectMethod("display", "()Landroid/view/SurfaceHolder;").object(); @@ -155,6 +182,40 @@ void AndroidMediaPlayer::setVolume(int volume) mMediaPlayer.callMethod<void>("setVolume", "(I)V", jint(volume)); } +bool AndroidMediaPlayer::setPlaybackRate(qreal rate) +{ + if (QtAndroidPrivate::androidSdkVersion() < 23) { + qWarning("Setting the playback rate on a media player requires Android 6.0 (API level 23) or later"); + return false; + } + + QJNIEnvironmentPrivate env; + + QJNIObjectPrivate player = mMediaPlayer.callObjectMethod("getMediaPlayerHandle", "()Landroid/media/MediaPlayer;"); + if (player.isValid()) { + QJNIObjectPrivate playbackParams = player.callObjectMethod("getPlaybackParams", "()Landroid/media/PlaybackParams;"); + if (playbackParams.isValid()) { + playbackParams.callObjectMethod("setSpeed", "(F)Landroid/media/PlaybackParams;", jfloat(rate)); + // pitch can only be > 0 + if (!qFuzzyIsNull(rate)) + playbackParams.callObjectMethod("setPitch", "(F)Landroid/media/PlaybackParams;", jfloat(qAbs(rate))); + player.callMethod<void>("setPlaybackParams", "(Landroid/media/PlaybackParams;)V", playbackParams.object()); + if (Q_UNLIKELY(env->ExceptionCheck())) { +#ifdef QT_DEBUG + env->ExceptionDescribe(); +#endif // QT_DEBUG + env->ExceptionClear(); + qWarning() << "Invalid playback rate" << rate; + return false; + } else { + return true; + } + } + } + + return false; +} + void AndroidMediaPlayer::setDisplay(AndroidSurfaceTexture *surfaceTexture) { mMediaPlayer.callMethod<void>("setDisplay", |