From 7985381b600ff48f1df0883bdf873b855982ba44 Mon Sep 17 00:00:00 2001 From: Julian Winkler Date: Wed, 23 Apr 2025 18:16:37 +0200 Subject: [PATCH] implement MediaMetadataRetriever on top of MediaPlayer also add MediaPlayer.getDuration() and MediaPlayer.getCurrentPosition() --- .../android_media_MediaPlayer.h | 16 ++++++++ .../media/android_media_MediaPlayer.c | 16 ++++++++ .../android/media/MediaMetadataRetriever.java | 37 +++++++++++++++++++ src/api-impl/android/media/MediaPlayer.java | 10 +++++ src/api-impl/meson.build | 1 + 5 files changed, 80 insertions(+) create mode 100644 src/api-impl/android/media/MediaMetadataRetriever.java diff --git a/src/api-impl-jni/generated_headers/android_media_MediaPlayer.h b/src/api-impl-jni/generated_headers/android_media_MediaPlayer.h index 12a17c80..3d1ea19a 100644 --- a/src/api-impl-jni/generated_headers/android_media_MediaPlayer.h +++ b/src/api-impl-jni/generated_headers/android_media_MediaPlayer.h @@ -39,6 +39,22 @@ JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1setOnCompletionLis JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1start (JNIEnv *, jclass, jlong); +/* + * Class: android_media_MediaPlayer + * Method: native_getDuration + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getDuration + (JNIEnv *, jclass, jlong); + +/* + * Class: android_media_MediaPlayer + * Method: native_getCurrentPosition + * Signature: (J)I + */ +JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getCurrentPosition + (JNIEnv *, jclass, jlong); + #ifdef __cplusplus } #endif diff --git a/src/api-impl-jni/media/android_media_MediaPlayer.c b/src/api-impl-jni/media/android_media_MediaPlayer.c index a905f8c9..ee2563c8 100644 --- a/src/api-impl-jni/media/android_media_MediaPlayer.c +++ b/src/api-impl-jni/media/android_media_MediaPlayer.c @@ -56,3 +56,19 @@ JNIEXPORT void JNICALL Java_android_media_MediaPlayer_native_1start(JNIEnv *env, gtk_media_stream_set_volume(media_stream, 1.0); gtk_media_stream_play(media_stream); } + +JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getDuration(JNIEnv *env, jclass this, jlong media_stream_ptr) +{ + GtkMediaStream *media_stream = _PTR(media_stream_ptr); + + // convert from microseconds to milliseconds + return gtk_media_stream_get_duration(media_stream) / 1000; +} + +JNIEXPORT jint JNICALL Java_android_media_MediaPlayer_native_1getCurrentPosition(JNIEnv *env, jclass this, jlong media_stream_ptr) +{ + GtkMediaStream *media_stream = _PTR(media_stream_ptr); + + // convert from microseconds to milliseconds + return gtk_media_stream_get_timestamp(media_stream) / 1000; +} diff --git a/src/api-impl/android/media/MediaMetadataRetriever.java b/src/api-impl/android/media/MediaMetadataRetriever.java new file mode 100644 index 00000000..827187c0 --- /dev/null +++ b/src/api-impl/android/media/MediaMetadataRetriever.java @@ -0,0 +1,37 @@ +package android.media; + +import android.content.Context; +import android.net.Uri; + +public class MediaMetadataRetriever { + + private MediaPlayer mediaPlayer; + + public void release() { + if (mediaPlayer != null) + mediaPlayer.release(); + } + + public void setDataSource(Context context, Uri uri) { + mediaPlayer = new MediaPlayer(); + mediaPlayer.setDataSource(uri.getPath()); + } + + public void setDataSource(String path) { + mediaPlayer = new MediaPlayer(); + mediaPlayer.setDataSource(path); + } + + public byte[] getEmbeddedPicture() { + return null; + } + + public String extractMetadata(int key) { + switch (key) { + case 9/*METADATA_KEY_DURATION*/: + return String.valueOf(mediaPlayer.getDuration()); + default: + return null; + } + } +} diff --git a/src/api-impl/android/media/MediaPlayer.java b/src/api-impl/android/media/MediaPlayer.java index a1dd724a..df413938 100644 --- a/src/api-impl/android/media/MediaPlayer.java +++ b/src/api-impl/android/media/MediaPlayer.java @@ -68,8 +68,18 @@ public class MediaPlayer { public void setVolume(float leftVolume, float rightVolume) {} + public int getDuration() { + return native_getDuration(gtk_media_stream); + } + + public int getCurrentPosition() { + return native_getCurrentPosition(gtk_media_stream); + } + public static native void native_prepare(long gtk_media_stream); public native long native_setDataSource(String path); public static native void native_setOnCompletionListener(long gtk_media_stream, MediaPlayer.OnCompletionListener listener); public static native void native_start(long gtk_media_stream); + public static native int native_getDuration(long gtk_media_stream); + public static native int native_getCurrentPosition(long gtk_media_stream); } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index c6458a4b..108047ff 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -279,6 +279,7 @@ srcs = [ 'android/media/MediaDescription.java', 'android/media/MediaFormat.java', 'android/media/MediaMetadata.java', + 'android/media/MediaMetadataRetriever.java', 'android/media/MediaPlayer.java', 'android/media/MediaRouter.java', 'android/media/Ringtone.java',