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/wrappers/jni/androidmediaplayer.cpp | 61 ++++++++++++++++++++++ .../android/src/wrappers/jni/androidmediaplayer.h | 2 + 2 files changed, 63 insertions(+) (limited to 'src/plugins/android/src/wrappers') 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("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("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("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("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("setDisplay", diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h index 28bfa3662..a7284bb0c 100644 --- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.h +++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.h @@ -103,6 +103,7 @@ public: bool isPlaying(); int volume(); bool isMuted(); + qreal playbackRate(); jobject display(); void play(); @@ -113,6 +114,7 @@ public: void setDataSource(const QString &path); void prepareAsync(); void setVolume(int volume); + bool setPlaybackRate(qreal rate); void setDisplay(AndroidSurfaceTexture *surfaceTexture); static bool initJNI(JNIEnv *env); -- cgit v1.2.3