[Android] [PATCH 06/24] jni: Add basic media list support in JNI
Edward Wang
edward.c.wang at compdigitec.com
Wed Aug 22 23:15:06 CEST 2012
---
vlc-android/jni/libvlcjni.c | 75 ++++++++++++++++++-------
vlc-android/src/org/videolan/vlc/LibVLC.java | 6 ++-
2 files changed, 59 insertions(+), 22 deletions(-)
diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c
index 244a55b..f4a38c5 100644
--- a/vlc-android/jni/libvlcjni.c
+++ b/vlc-android/jni/libvlcjni.c
@@ -170,24 +170,37 @@ libvlc_media_t *new_media(jlong instance, JNIEnv *env, jobject thiz, jstring fil
return p_md;
}
+static libvlc_media_list_t *getMediaList(JNIEnv *env, jobject thiz)
+{
+ return (libvlc_media_list_t*)getLong(env, thiz, "mMediaListInstance");
+}
+
static libvlc_media_player_t *getMediaPlayer(JNIEnv *env, jobject thiz)
{
- return (libvlc_media_player_t*)getLong(env, thiz, "mMediaPlayerInstance");
+ return (libvlc_media_player_t*)getLong(env, thiz, "mInternalMediaPlayerInstance");
+}
+
+static libvlc_media_list_player_t *getMediaListPlayer(JNIEnv *env, jobject thiz)
+{
+ return (libvlc_media_list_player_t*)getLong(env, thiz, "mMediaListPlayerInstance");
}
static void unsetMediaPlayer(JNIEnv *env, jobject thiz)
{
- setLong(env, thiz, "mMediaPlayerInstance", (jlong)0);
+ setLong(env, thiz, "mInternalMediaPlayerInstance", (jlong)0);
}
static void releaseMediaPlayer(JNIEnv *env, jobject thiz)
{
- libvlc_media_player_t *mp = getMediaPlayer(env, thiz);
- if (mp)
+ libvlc_media_list_player_t* p_mlp = getMediaListPlayer(env, thiz);
+ if (p_mlp)
{
- libvlc_media_player_stop(mp);
- libvlc_media_player_release(mp);
+ libvlc_media_list_player_stop(p_mlp);
+ libvlc_media_list_player_release(p_mlp);
+ /* libvlc_media_list_player_release frees the media player, so
+ * we don't free it ourselves. */
unsetMediaPlayer(env, thiz);
+ setLong(env, thiz, "mInternalMediaPlayerInstance", 0);
}
}
@@ -388,6 +401,16 @@ void Java_org_videolan_vlc_LibVLC_nativeInit(JNIEnv *env, jobject thiz, jboolean
}
LOGI("LibVLC initialized: %p", instance);
+
+ /* Initialize media list (a.k.a. playlist/history) */
+ libvlc_media_list_t* pointer = libvlc_media_list_new( instance );
+ if(!pointer) {
+ jclass exc = (*env)->FindClass(env, "org/videolan/vlc/LibVlcException");
+ (*env)->ThrowNew(env, exc, "Unable to create LibVLC media list");
+ return;
+ }
+
+ setLong(env, thiz, "mMediaListInstance", (jlong)pointer);
}
jstring Java_org_videolan_vlc_LibVLC_nativeToURI(JNIEnv *env, jobject thiz, jstring path)
@@ -509,12 +532,18 @@ void Java_org_videolan_vlc_LibVLC_readMedia(JNIEnv *env, jobject thiz,
return;
}
+ libvlc_media_list_t* p_mlist = getMediaList(env, thiz);
+
/* Create a media player playing environment */
+ libvlc_media_list_player_t* p_mlp = libvlc_media_list_player_new((libvlc_instance_t*)instance);
libvlc_media_player_t *mp = libvlc_media_player_new((libvlc_instance_t*)instance);
jobject myJavaLibVLC = (*env)->NewGlobalRef(env, thiz);
- libvlc_media_player_set_media(mp, m);
+ libvlc_media_list_lock(p_mlist);
+ libvlc_media_list_add_media(p_mlist, m);
+ int position = libvlc_media_list_index_of_item(p_mlist, m);
+ libvlc_media_list_unlock(p_mlist);
//if AOUT_AUDIOTRACK_JAVA, we use amem
jclass cls = (*env)->GetObjectClass(env, thiz);
@@ -538,14 +567,17 @@ void Java_org_videolan_vlc_LibVLC_readMedia(JNIEnv *env, jobject thiz,
libvlc_MediaPlayerStopped,
libvlc_MediaPlayerVout,
};
- int i;
- for (i = 0; i < (sizeof(mp_events) / sizeof(*mp_events)); ++i)
+ for(int i = 0; i < (sizeof(mp_events) / sizeof(*mp_events)); i++)
libvlc_event_attach(ev, mp_events[i], vlc_event_callback, myVm);
+ libvlc_media_list_player_set_media_list(p_mlp, p_mlist);
+ libvlc_media_list_player_set_media_player(p_mlp, mp);
+
/* Keep a pointer to this media player */
- setLong(env, thiz, "mMediaPlayerInstance", (jlong) mp);
+ setLong(env, thiz, "mMediaListPlayerInstance", (jlong)p_mlp);
+ setLong(env, thiz, "mInternalMediaPlayerInstance", (jlong)mp);
- libvlc_media_player_play(mp);
+ libvlc_media_list_player_play_item_at_index(p_mlp, position);
}
jfloat Java_org_videolan_vlc_LibVLC_getRate(JNIEnv *env, jobject thiz) {
@@ -757,15 +789,16 @@ end:
jboolean Java_org_videolan_vlc_LibVLC_hasMediaPlayer(JNIEnv *env, jobject thiz)
{
- return !!getMediaPlayer(env, thiz);
+ return !!getMediaListPlayer(env, thiz);
}
jboolean Java_org_videolan_vlc_LibVLC_isPlaying(JNIEnv *env, jobject thiz)
{
- libvlc_media_player_t *mp = getMediaPlayer(env, thiz);
+ libvlc_media_list_player_t *mp = getMediaListPlayer(env, thiz);
if (mp)
- return !!libvlc_media_player_is_playing(mp);
- return 0;
+ return !!libvlc_media_list_player_is_playing(mp);
+ else
+ return 0;
}
jboolean Java_org_videolan_vlc_LibVLC_isSeekable(JNIEnv *env, jobject thiz)
@@ -778,23 +811,23 @@ jboolean Java_org_videolan_vlc_LibVLC_isSeekable(JNIEnv *env, jobject thiz)
void Java_org_videolan_vlc_LibVLC_play(JNIEnv *env, jobject thiz)
{
- libvlc_media_player_t *mp = getMediaPlayer(env, thiz);
+ libvlc_media_list_player_t *mp = getMediaListPlayer(env, thiz);
if (mp)
- libvlc_media_player_play(mp);
+ libvlc_media_list_player_play(mp);
}
void Java_org_videolan_vlc_LibVLC_pause(JNIEnv *env, jobject thiz)
{
- libvlc_media_player_t *mp = getMediaPlayer(env, thiz);
+ libvlc_media_list_player_t *mp = getMediaListPlayer(env, thiz);
if (mp)
- libvlc_media_player_pause(mp);
+ libvlc_media_list_player_pause(mp);
}
void Java_org_videolan_vlc_LibVLC_stop(JNIEnv *env, jobject thiz)
{
- libvlc_media_player_t *mp = getMediaPlayer(env, thiz);
+ libvlc_media_list_player_t *mp = getMediaListPlayer(env, thiz);
if (mp)
- libvlc_media_player_stop(mp);
+ libvlc_media_list_player_stop(mp);
}
jint Java_org_videolan_vlc_LibVLC_getVolume(JNIEnv *env, jobject thiz)
diff --git a/vlc-android/src/org/videolan/vlc/LibVLC.java b/vlc-android/src/org/videolan/vlc/LibVLC.java
index 4eb6675..bb6494b 100644
--- a/vlc-android/src/org/videolan/vlc/LibVLC.java
+++ b/vlc-android/src/org/videolan/vlc/LibVLC.java
@@ -45,7 +45,11 @@ public class LibVLC {
/** libVLC instance C pointer */
private long mLibVlcInstance = 0; // Read-only, reserved for JNI
- private long mMediaPlayerInstance = 0; // Read-only, reserved for JNI
+ /** libvlc_media_list_player pointer */
+ private long mMediaListPlayerInstance = 0; // Read-only, reserved for JNI
+ private long mInternalMediaPlayerInstance = 0; // Read-only, reserved for JNI
+ /** libvlc_media_list_t pointer */
+ private long mMediaListInstance = 0; // Read-only, reserved for JNI
private Aout mAout;
--
1.7.5.4
More information about the Android
mailing list