diff options
author | Assam Boudjelthia <assam.boudjelthia@qt.io> | 2021-09-15 19:45:50 +0300 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-09-17 10:00:41 +0000 |
commit | ca57e062e085f7346812e1a340bb0be49b44d224 (patch) | |
tree | 469f4413770b154ba29a27d64eea60517ded8b24 | |
parent | 32a0aeef7a8e63a76aa7f783bd192701f513805f (diff) |
Implement playback progress watcher
Android's MediaPlayer doesn't seem to provide a listener for
continuously reporting the current playback position, thus such
a mechanism need to be implemented by us, otherwise progress
is not being reported back to QMediaPlayer.
This also overrides QPlatformMediaPlayer::isSeekable().
Fixes: QTBUG-96079
Change-Id: I47ae0e2b9fe18b650fbbd0fb0266dc8a50dc3c55
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: Samuel Mira <samuel.mira@qt.io>
(cherry picked from commit fb9a5bfd0b8ea7551ac7eb01a5ed6ffcb1c86abb)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
3 files changed, 41 insertions, 2 deletions
diff --git a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java index f332c2db7..1ec250d47 100644 --- a/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java +++ b/src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java @@ -57,6 +57,11 @@ import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.view.SurfaceHolder; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + public class QtAndroidMediaPlayer { // Native callback functions for MediaPlayer @@ -81,6 +86,8 @@ public class QtAndroidMediaPlayer private int mVolume = 100; private static final String TAG = "Qt MediaPlayer"; private SurfaceHolder mSurfaceHolder = null; + private ScheduledExecutorService mProgressScheduler = null; + private ScheduledFuture mProgressWatcherHandle = null; private class State { final static int Uninitialized = 0x1 /* End */; @@ -280,6 +287,29 @@ public class QtAndroidMediaPlayer mMediaPlayer.setOnErrorListener(new MediaPlayerErrorListener()); mMediaPlayer.setOnPreparedListener(new MediaPlayerPreparedListener()); mMediaPlayer.setOnTimedTextListener(new MediaPlayerTimedTextListener()); + // Report playback position since there is no default listner for that in MediaPlayer + mProgressScheduler = Executors.newScheduledThreadPool(1); + } + + public void startProgressWatcher() + { + // if it was shutdown, request new thread + if (mProgressScheduler.isTerminated() || mProgressScheduler == null) + mProgressScheduler = Executors.newScheduledThreadPool(1); + + mProgressWatcherHandle = mProgressScheduler.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + if (isPlaying()) + onProgressUpdateNative(getCurrentPosition(), mID); + } + }, 10, 100, TimeUnit.MILLISECONDS); + } + + public void cancelProgressWatcher() + { + if (mProgressScheduler != null) + mProgressScheduler.shutdown(); } public void start() @@ -294,12 +324,12 @@ public class QtAndroidMediaPlayer try { mMediaPlayer.start(); setState(State.Started); + startProgressWatcher(); } catch (final IllegalStateException exception) { Log.w(TAG, exception); } } - public void pause() { if ((mState & (State.Started | State.Paused | State.PlaybackCompleted)) == 0) @@ -327,6 +357,7 @@ public class QtAndroidMediaPlayer try { mMediaPlayer.stop(); setState(State.Stopped); + cancelProgressWatcher(); } catch (final IllegalStateException exception) { Log.w(TAG, exception); } @@ -679,7 +710,6 @@ public class QtAndroidMediaPlayer return mMuted; } - public void reset() { if (mState == State.Uninitialized) { @@ -688,6 +718,7 @@ public class QtAndroidMediaPlayer mMediaPlayer.reset(); setState(State.Idle); + cancelProgressWatcher(); } public void release() @@ -699,6 +730,7 @@ public class QtAndroidMediaPlayer } setState(State.Uninitialized); + cancelProgressWatcher(); } public void setAudioAttributes(int type, int usage) diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp index 373aa41ee..49ed8fbec 100644 --- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp +++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp @@ -434,6 +434,11 @@ void QAndroidMediaPlayer::stop() mMediaPlayer->stop(); } +bool QAndroidMediaPlayer::isSeekable() const +{ + return true; +} + void QAndroidMediaPlayer::onInfo(qint32 what, qint32 extra) { StateChangeNotifier notifier(this); diff --git a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer_p.h b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer_p.h index f48f682d8..b8e187a08 100644 --- a/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer_p.h +++ b/src/multimedia/platform/android/mediaplayer/qandroidmediaplayer_p.h @@ -96,6 +96,8 @@ public: void pause() override; void stop() override; + bool isSeekable() const override; + int trackCount(TrackType trackType) override; QMediaMetaData trackMetaData(TrackType trackType, int streamNumber) override; int activeTrack(TrackType trackType) override; |