summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAssam Boudjelthia <assam.boudjelthia@qt.io>2021-09-15 19:45:50 +0300
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-09-17 10:00:41 +0000
commitca57e062e085f7346812e1a340bb0be49b44d224 (patch)
tree469f4413770b154ba29a27d64eea60517ded8b24
parent32a0aeef7a8e63a76aa7f783bd192701f513805f (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>
-rw-r--r--src/android/jar/src/org/qtproject/qt/android/multimedia/QtAndroidMediaPlayer.java36
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayer.cpp5
-rw-r--r--src/multimedia/platform/android/mediaplayer/qandroidmediaplayer_p.h2
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;