<div dir="ltr">Hi,<div>I am sending a new version of the patch.</div><div>Thank you</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-25 22:13 GMT+01:00 Paulo Vitor Magacho da Silva <span dir="ltr"><<a href="mailto:pvmagacho@gmail.com" target="_blank">pvmagacho@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div>Hi,<br></div><br>Thanks for the input.<br></div><div>A few answers.<br><br></div><div>
1- Each instance of the java LibVLC class holds a pointer to the libvlc instance. So there is no issue here. The main issue was the Surface object. A static global variable was being used initially. This was solved by creating android_surf_value_t structure that is attached to each LibVLC class. This works rather well.<br>

</div><div>2- Event handling: I see your point. Just need to make it non-static and add it as instance variable inside the LibVLC class. And pass to vlc_event_callback data the EventHandler instance pointer.<br></div><div>

3- The restartInstance was added to avoid breaking the VLC android application which still uses a singleton. In the future the VLC android application will need to refactored.<br>4- "protected void applyEqualizer()" - This is to allow LibVLC subclassing.<br>

</div><div>5- synchronized was used around nativeInit and nativeDestroy, but I am not really sure if it's actually needed. Have to test further as well.<br></div><br></div>Will continue developing and should post a few more updates on this one.<br>

<br></div><div>Thanks<br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">2014-07-25 2:17 GMT-03:00 Edward Wang <span dir="ltr"><<a href="mailto:edward.c.wang@compdigitec.com" target="_blank">edward.c.wang@compdigitec.com</a>></span>:<div>
<div class="h5"><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On 2014-07-24 22:14, Paulo Vitor Magacho da Silva <<a href="mailto:pvmagacho@gmail.com" target="_blank">pvmagacho@gmail.com</a>> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
---<br>
  vlc-android/jni/libvlcjni.c                        |  39 ++++--<br>
  vlc-android/jni/utils.h                            |  12 ++<br>
  vlc-android/jni/vout.c                             | 135 +++++++++++----------<br>
  vlc-android/jni/vout.h                             |   4 -<br>
  vlc-android/src/org/videolan/<u></u>libvlc/LibVLC.java    |  33 +++--<br>
  vlc-android/src/org/videolan/<u></u>libvlc/MediaList.java |   2 +-<br>
  .../org/videolan/vlc/gui/<u></u>PreferencesActivity.java  |   2 +-<br>
  7 files changed, 139 insertions(+), 88 deletions(-)<br>
</blockquote>
<br></div>
Most notably, you have to keep track of which objects belong to which libVLC, and that could get messy.<br>
<br>
I'd like to test this out first, but that will be for tomorrow.<br>
<br>
Some comments inline below.<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
diff --git a/vlc-android/jni/libvlcjni.c b/vlc-android/jni/libvlcjni.c<br>
index 6a08d85..1f11b20 100644<br>
--- a/vlc-android/jni/libvlcjni.c<br>
+++ b/vlc-android/jni/libvlcjni.c<br>
@@ -200,16 +200,12 @@ jint JNI_OnLoad(JavaVM *vm, void *reserved)<br>
      // Keep a reference on the Java VM.<br>
      myVm = vm;<br>
  -    pthread_mutex_init(&vout_<u></u>android_lock, NULL);<br>
-    pthread_cond_init(&vout_<u></u>android_surf_attached, NULL);<br>
-<br>
      LOGD("JNI interface loaded.");<br>
      return JNI_VERSION_1_2;<br>
  }<br>
    void JNI_OnUnload(JavaVM* vm, void* reserved) {<br>
-    pthread_mutex_destroy(&vout_<u></u>android_lock);<br>
-    pthread_cond_destroy(&vout_<u></u>android_surf_attached);<br>
+    LOGD("JNI interface un-loaded.");<br>
  }<br>
    // FIXME: use atomics<br>
@@ -217,6 +213,18 @@ static bool verbosity;<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_nativeInit(JNIEnv *env, jobject thiz)<br>
  {<br>
+    android_surf_value_t *object = (android_surf_value_t *) malloc(sizeof(android_surf_<u></u>value_t));<br>
</blockquote>
<br></div>
More descriptive variable name than 'object' possible?<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+    object->vout_android_surf = NULL;<br>
+    object->vout_android_gui = NULL;<br>
+    object->vout_android_java_surf = NULL;<br>
+    object->vout_android_<u></u>subtitles_surf = NULL;<br>
+<br>
+    pthread_mutex_init(&object-><u></u>vout_android_lock, NULL);<br>
+    pthread_cond_init(&object-><u></u>vout_android_surf_attached, NULL);<br>
+<br>
+    setLong(env, thiz, "mAndroidSurfaceValue", (jlong)(intptr_t)object);<br>
+<br>
      //only use OpenSLES if java side says we can<br>
      jclass cls = (*env)->GetObjectClass(env, thiz);<br>
      jmethodID methodId = (*env)->GetMethodID(env, cls, "getAout", "()I");<br>
@@ -318,12 +326,23 @@ void Java_org_videolan_libvlc_<u></u>LibVLC_nativeInit(JNIEnv *env, jobject thiz)<br>
        libvlc_log_set(instance, debug_log, &verbosity);<br>
  -    init_native_crash_handler(env, thiz);<br>
+    // init_native_crash_handler(env, thiz);<br>
</blockquote>
<br></div>
Why?<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_nativeDestroy(JNIEnv *env, jobject thiz)<br>
  {<br>
-    destroy_native_crash_handler(<u></u>env);<br>
+    // clear surface lock and condition<br>
+    android_surf_value_t *object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    if (object != NULL) {<br>
+        pthread_mutex_destroy(&object-<u></u>>vout_android_lock);<br>
+        pthread_cond_destroy(&object-><u></u>vout_android_surf_attached);<br>
+<br>
+        free(object);<br>
+    }<br>
+    setLong(env, thiz, "mAndroidSurfaceValue", 0);<br>
+<br>
+    // destroy_native_crash_handler(<u></u>env);<br>
</blockquote></div>
Ditto.<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
        releaseMediaPlayer(env, thiz);<br>
      jlong libVlcInstance = getLong(env, thiz, "mLibVlcInstance");<br>
@@ -413,9 +432,13 @@ void Java_org_videolan_libvlc_<u></u>LibVLC_playMRL(JNIEnv *env, jobject thiz, jlong in<br>
              (*env)->ReleaseStringUTFChars(<u></u>env, option, p_st);<br>
          }<br>
      }<br>
-<br>
+<br>
</blockquote>
<br>
?<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      (*env)->ReleaseStringUTFChars(<u></u>env, mrl, p_mrl);<br>
  +    // set the Android surface value structure<br>
+    android_surf_value_t *object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+    libvlc_media_player_set_<u></u>surfacevalue(mp, object);<br>
+<br>
      /* Connect the media event manager. */<br>
</blockquote>
<br></div>
What about events? How does each instance deal with its own events?<div><div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      libvlc_event_manager_t *ev_media = libvlc_media_event_manager(p_<u></u>md);<br>
      static const libvlc_event_type_t mp_media_events[] = {<br>
diff --git a/vlc-android/jni/utils.h b/vlc-android/jni/utils.h<br>
index f8502d9..ccf23aa 100644<br>
--- a/vlc-android/jni/utils.h<br>
+++ b/vlc-android/jni/utils.h<br>
@@ -21,6 +21,18 @@<br>
  #ifndef LIBVLCJNI_UTILS_H<br>
  #define LIBVLCJNI_UTILS_H<br>
  +#include <pthread.h><br>
+<br>
+typedef struct android_surf_value_t {<br>
+    pthread_mutex_t vout_android_lock;<br>
+    pthread_cond_t vout_android_surf_attached;<br>
+    void *vout_android_surf;<br>
+    void *vout_android_gui;<br>
+    jobject vout_android_java_surf;<br>
+    jobject vout_android_subtitles_surf;<br>
+    bool vout_video_player_activity_<u></u>created;<br>
+} android_surf_value_t;<br>
+<br>
  libvlc_media_t *new_media(jlong instance, JNIEnv *env, jobject thiz, jstring fileLocation, bool noOmx, bool noVideo);<br>
    libvlc_media_player_t *getMediaPlayer(JNIEnv *env, jobject thiz);<br>
diff --git a/vlc-android/jni/vout.c b/vlc-android/jni/vout.c<br>
index f2f4346..74e1f1e 100644<br>
--- a/vlc-android/jni/vout.c<br>
+++ b/vlc-android/jni/vout.c<br>
@@ -23,96 +23,94 @@<br>
    #include <jni.h><br>
  +#include "utils.h"<br>
+<br>
  /** Unique Java VM instance, as defined in libvlcjni.c */<br>
  extern JavaVM *myVm;<br>
  -pthread_mutex_t vout_android_lock;<br>
-pthread_cond_t vout_android_surf_attached;<br>
-static void *vout_android_surf = NULL;<br>
-static void *vout_android_gui = NULL;<br>
-static jobject vout_android_java_surf = NULL;<br>
-static jobject vout_android_subtitles_surf = NULL;<br>
-static bool vout_video_player_activity_<u></u>created = false;<br>
-<br>
-void *jni_<u></u>LockAndGetSubtitlesSurface() {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    while (vout_android_subtitles_surf == NULL)<br>
-        pthread_cond_wait(&vout_<u></u>android_surf_attached, &vout_android_lock);<br>
-    return vout_android_subtitles_surf;<br>
+void *jni_<u></u>LockAndGetSubtitlesSurface(<u></u>android_surf_value_t *object) {<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    while (object->vout_android_<u></u>subtitles_surf == NULL)<br>
+        pthread_cond_wait(&object-><u></u>vout_android_surf_attached, &object->vout_android_lock);<br>
+    return object->vout_android_<u></u>subtitles_surf;<br>
  }<br>
  -void *jni_LockAndGetAndroidSurface(<u></u>) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    while (vout_android_surf == NULL)<br>
-        pthread_cond_wait(&vout_<u></u>android_surf_attached, &vout_android_lock);<br>
-    return vout_android_surf;<br>
+void *jni_LockAndGetAndroidSurface(<u></u>android_surf_value_t *object) {<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    while (object->vout_android_surf == NULL)<br>
+        pthread_cond_wait(&object-><u></u>vout_android_surf_attached, &object->vout_android_lock);<br>
+    return object->vout_android_surf;<br>
  }<br>
  -jobject jni_<u></u>LockAndGetAndroidJavaSurface() {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    while (vout_android_java_surf == NULL)<br>
-        pthread_cond_wait(&vout_<u></u>android_surf_attached, &vout_android_lock);<br>
-    return vout_android_java_surf;<br>
+jobject jni_<u></u>LockAndGetAndroidJavaSurface(<u></u>android_surf_value_t *object) {<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    while (object->vout_android_java_<u></u>surf == NULL)<br>
+        pthread_cond_wait(&object-><u></u>vout_android_surf_attached, &object->vout_android_lock);<br>
+    return object->vout_android_java_<u></u>surf;<br>
  }<br>
  -void jni_UnlockAndroidSurface() {<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+void jni_UnlockAndroidSurface(<u></u>android_surf_value_t *object) {<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
  -void jni_<u></u>EventHardwareAccelerationError<u></u>()<br>
+void jni_<u></u>EventHardwareAccelerationError<u></u>(android_surf_value_t *object)<br>
  {<br>
-    if (vout_android_gui == NULL)<br>
+    if (object->vout_android_gui == NULL)<br>
          return;<br>
        JNIEnv *env;<br>
      (*myVm)->AttachCurrentThread(<u></u>myVm, &env, NULL);<br>
  -    jclass cls = (*env)->GetObjectClass(env, vout_android_gui);<br>
+    jclass cls = (*env)->GetObjectClass(env, object->vout_android_gui);<br>
      jmethodID methodId = (*env)->GetMethodID(env, cls, "<u></u>eventHardwareAccelerationError<u></u>", "()V");<br>
-    (*env)->CallVoidMethod(env, vout_android_gui, methodId);<br>
+    (*env)->CallVoidMethod(env, object->vout_android_gui, methodId);<br>
        (*env)->DeleteLocalRef(env, cls);<br>
      (*myVm)->DetachCurrentThread(<u></u>myVm);<br>
  }<br>
  -void jni_SetAndroidSurfaceSizeEnv(<u></u>JNIEnv *p_env, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)<br>
+void jni_SetAndroidSurfaceSizeEnv(<u></u>JNIEnv *p_env, android_surf_value_t *object, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)<br>
  {<br>
-    if (vout_android_gui == NULL)<br>
+    if (object->vout_android_gui == NULL)<br>
          return;<br>
  -    jclass cls = (*p_env)->GetObjectClass (p_env, vout_android_gui);<br>
+    jclass cls = (*p_env)->GetObjectClass (p_env, object->vout_android_gui);<br>
      jmethodID methodId = (*p_env)->GetMethodID (p_env, cls, "setSurfaceSize", "(IIIIII)V");<br>
  -    (*p_env)->CallVoidMethod (p_env, vout_android_gui, methodId, width, height, visible_width, visible_height, sar_num, sar_den);<br>
+    (*p_env)->CallVoidMethod (p_env, object->vout_android_gui, methodId, width, height, visible_width, visible_height, sar_num, sar_den);<br>
        (*p_env)->DeleteLocalRef(p_<u></u>env, cls);<br>
  }<br>
  -void jni_SetAndroidSurfaceSize(int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)<br>
+void jni_SetAndroidSurfaceSize(<u></u>android_surf_value_t *object, int width, int height, int visible_width, int visible_height, int sar_num, int sar_den)<br>
  {<br>
      JNIEnv *p_env;<br>
        (*myVm)->AttachCurrentThread (myVm, &p_env, NULL);<br>
-    jni_SetAndroidSurfaceSizeEnv(<u></u>p_env, width, height, visible_width, visible_height, sar_num, sar_den);<br>
+    jni_SetAndroidSurfaceSizeEnv(<u></u>p_env, object, width, height, visible_width, visible_height, sar_num, sar_den);<br>
        (*myVm)->DetachCurrentThread (myVm);<br>
  }<br>
  -bool jni_<u></u>IsVideoPlayerActivityCreated() {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    bool result = vout_video_player_activity_<u></u>created;<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+bool jni_<u></u>IsVideoPlayerActivityCreated(<u></u>android_surf_value_t *object) {<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    bool result = object->vout_video_player_<u></u>activity_created;<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
      return result;<br>
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_<u></u>eventVideoPlayerActivityCreate<u></u>d(JNIEnv *env, jobject thiz, jboolean created) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    vout_video_player_activity_<u></u>created = created;<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+    android_surf_value_t * object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    object->vout_video_player_<u></u>activity_created = created;<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_attachSurface(JNIEnv *env, jobject thiz, jobject surf, jobject gui) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
+    android_surf_value_t * object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
      jclass clz;<br>
      jfieldID fid;<br>
  @@ -131,39 +129,46 @@ void Java_org_videolan_libvlc_<u></u>LibVLC_attachSurface(JNIEnv *env, jobject thiz, jo<br>
              }<br>
              fid = (*env)->GetFieldID(env, clz, "mNativeSurface", "I");<br>
          }<br>
-        vout_android_surf = (void*)(*env)->GetIntField(<u></u>env, surf, fid);<br>
+<br>
+        object->vout_android_surf = (void*)(*env)->GetIntField(<u></u>env, surf, fid);<br>
          (*env)->DeleteLocalRef(env, clz);<br>
      }<br>
-    vout_android_gui = (*env)->NewGlobalRef(env, gui);<br>
-    vout_android_java_surf = (*env)->NewGlobalRef(env, surf);<br>
-    pthread_cond_signal(&vout_<u></u>android_surf_attached);<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+    object->vout_android_gui = (*env)->NewGlobalRef(env, gui);<br>
+    object->vout_android_java_surf = (*env)->NewGlobalRef(env, surf);<br>
+    pthread_cond_signal(&object-><u></u>vout_android_surf_attached);<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_detachSurface(JNIEnv *env, jobject thiz) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    vout_android_surf = NULL;<br>
-    if (vout_android_gui != NULL)<br>
-        (*env)->DeleteGlobalRef(env, vout_android_gui);<br>
-    if (vout_android_java_surf != NULL)<br>
-        (*env)->DeleteGlobalRef(env, vout_android_java_surf);<br>
-    vout_android_gui = NULL;<br>
-    vout_android_java_surf = NULL;<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+    android_surf_value_t *object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    object->vout_android_surf = NULL;<br>
+    if (object->vout_android_gui != NULL)<br>
+        (*env)->DeleteGlobalRef(env, object->vout_android_gui);<br>
+    if (object->vout_android_java_<u></u>surf != NULL)<br>
+        (*env)->DeleteGlobalRef(env, object->vout_android_java_<u></u>surf);<br>
+    object->vout_android_gui = NULL;<br>
+    object->vout_android_java_surf = NULL;<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_attachSubtitlesSurface(<u></u>JNIEnv *env, jobject thiz, jobject surf) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    vout_android_subtitles_surf = (*env)->NewGlobalRef(env, surf);<br>
-    pthread_cond_signal(&vout_<u></u>android_surf_attached);<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+    android_surf_value_t *object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    object->vout_android_<u></u>subtitles_surf = (*env)->NewGlobalRef(env, surf);<br>
+    pthread_cond_signal(&object-><u></u>vout_android_surf_attached);<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
    void Java_org_videolan_libvlc_<u></u>LibVLC_detachSubtitlesSurface(<u></u>JNIEnv *env, jobject thiz) {<br>
-    pthread_mutex_lock(&vout_<u></u>android_lock);<br>
-    (*env)->DeleteGlobalRef(env, vout_android_subtitles_surf);<br>
-    vout_android_subtitles_surf = NULL;<br>
-    pthread_mutex_unlock(&vout_<u></u>android_lock);<br>
+    android_surf_value_t *object = (android_surf_value_t *)(intptr_t)getLong(env, thiz, "mAndroidSurfaceValue");<br>
+<br>
+    pthread_mutex_lock(&object-><u></u>vout_android_lock);<br>
+    (*env)->DeleteGlobalRef(env, object->vout_android_<u></u>subtitles_surf);<br>
+    object->vout_android_<u></u>subtitles_surf = NULL;<br>
+    pthread_mutex_unlock(&object-><u></u>vout_android_lock);<br>
  }<br>
    static int mouse_x = -1;<br>
diff --git a/vlc-android/jni/vout.h b/vlc-android/jni/vout.h<br>
index c3d4fd7..d14957a 100644<br>
--- a/vlc-android/jni/vout.h<br>
+++ b/vlc-android/jni/vout.h<br>
@@ -21,8 +21,4 @@<br>
  #ifndef LIBVLCJNI_VOUT_H<br>
  #define LIBVLCJNI_VOUT_H<br>
  -/* vout lock initialized in vout.c */<br>
-pthread_mutex_t vout_android_lock;<br>
-pthread_cond_t vout_android_surf_attached;<br>
-<br>
  #endif // LIBVLCJNI_VOUT_H<br>
diff --git a/vlc-android/src/org/<u></u>videolan/libvlc/LibVLC.java b/vlc-android/src/org/<u></u>videolan/libvlc/LibVLC.java<br>
index 5ac201e..abc50a7 100644<br>
--- a/vlc-android/src/org/<u></u>videolan/libvlc/LibVLC.java<br>
+++ b/vlc-android/src/org/<u></u>videolan/libvlc/LibVLC.java<br>
@@ -51,6 +51,9 @@ public class LibVLC {<br>
      private int mInternalMediaPlayerIndex = 0; // Read-only, reserved for JNI<br>
      private long mInternalMediaPlayerInstance = 0; // Read-only, reserved for JNI<br>
  +    private long mAndroidSurfaceValue = 0; // Read-only, reserved for JNI<br>
+    private long mInternalSurface = 0; // Read-only, reserved for JNI<br>
+<br>
      private MediaList mMediaList; // Pointer to media list being followed<br>
      private MediaList mPrimaryList; // Primary/default media list; see getPrimaryMediaList()<br>
  @@ -128,7 +131,7 @@ public class LibVLC {<br>
      public static LibVLC getInstance() throws LibVlcException {<br>
          synchronized (LibVLC.class) {<br>
              if (sInstance == null) {<br>
-                /* First call */<br>
+                // First call //<br>
</blockquote>
<br></div></div>
Unneeded change.<div><div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
                  sInstance = new LibVLC();<br>
              }<br>
          }<br>
@@ -149,10 +152,9 @@ public class LibVLC {<br>
      }<br>
        /**<br>
-     * Constructor<br>
-     * It is private because this class is a singleton.<br>
+     * Constructor.<br>
       */<br>
-    private LibVLC() {<br>
+    public LibVLC() {<br>
          mAout = new AudioOutput();<br>
      }<br>
  @@ -218,7 +220,7 @@ public class LibVLC {<br>
       */<br>
      public native void setSurface(Surface f);<br>
  -    public static synchronized void restart(Context context) {<br>
+    public static synchronized void restartInstance(Context context) {<br>
          if (sInstance != null) {<br>
              try {<br>
                  sInstance.destroy();<br>
@@ -226,6 +228,15 @@ public class LibVLC {<br>
              } catch (LibVlcException lve) {<br>
                  Log.e(TAG, "Unable to reinit libvlc: " + lve);<br>
              }<br>
+       }<br>
+    }<br>
+<br>
+    public synchronized void restart(Context context) {<br>
+        try {<br>
+            this.destroy();<br>
+            this.init(context);<br>
+        } catch (LibVlcException lve) {<br>
+            Log.e(TAG, "Unable to reinit libvlc: " + lve);<br>
          }<br>
      }<br>
  @@ -341,7 +352,7 @@ public class LibVLC {<br>
          applyEqualizer();<br>
      }<br>
  -    private void applyEqualizer()<br>
+    protected void applyEqualizer()<br>
</blockquote>
<br></div></div>
Why?<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      {<br>
          setNativeEqualizer(<u></u>mInternalMediaPlayerInstance, this.equalizer);<br>
      }<br>
@@ -381,7 +392,9 @@ public class LibVLC {<br>
                File cacheDir = context.getCacheDir();<br>
              mCachePath = (cacheDir != null) ? cacheDir.getAbsolutePath() : null;<br>
-            nativeInit();<br>
+            synchronized (LibVLC.class) {<br>
+                nativeInit();<br>
+            }<br>
</blockquote>
<br></div>
Why?<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
              mMediaList = mPrimaryList = new MediaList(this);<br>
              setEventHandler(EventHandler.<u></u>getInstance());<br>
              mIsInitialized = true;<br>
@@ -394,7 +407,9 @@ public class LibVLC {<br>
       */<br>
      public void destroy() {<br>
          Log.v(TAG, "Destroying LibVLC instance");<br>
-        nativeDestroy();<br>
+        synchronized (LibVLC.class) {<br>
+            nativeDestroy();<br>
+        }<br>
</blockquote>
<br></div>
Ditto.<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          detachEventHandler();<br>
          mIsInitialized = false;<br>
      }<br>
@@ -647,7 +662,7 @@ public class LibVLC {<br>
      public native int getSpuTracksCount();<br>
        public static native String nativeToURI(String path);<br>
-<br>
+<br>
</blockquote>
<br>
?<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
      public native static void sendMouseEvent( int action, int button, int x, int y);<br>
        /**<br>
diff --git a/vlc-android/src/org/<u></u>videolan/libvlc/MediaList.java b/vlc-android/src/org/<u></u>videolan/libvlc/MediaList.java<br>
index 85b2d2a..1889481 100644<br>
--- a/vlc-android/src/org/<u></u>videolan/libvlc/MediaList.java<br>
+++ b/vlc-android/src/org/<u></u>videolan/libvlc/MediaList.java<br>
@@ -32,7 +32,7 @@ public class MediaList {<br>
        /* Since the libvlc_media_t is not created until the media plays, we have<br>
       * to cache them here. */<br>
-    private static class MediaHolder {<br>
+    private class MediaHolder {<br>
</blockquote>
<br></div>
Why?<div><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
          Media m;<br>
          boolean noVideo; // default false<br>
          boolean noHardwareAcceleration; // default false<br>
diff --git a/vlc-android/src/org/<u></u>videolan/vlc/gui/<u></u>PreferencesActivity.java b/vlc-android/src/org/<u></u>videolan/vlc/gui/<u></u>PreferencesActivity.java<br>
index 4c9539f..eedadf5 100644<br>
--- a/vlc-android/src/org/<u></u>videolan/vlc/gui/<u></u>PreferencesActivity.java<br>
+++ b/vlc-android/src/org/<u></u>videolan/vlc/gui/<u></u>PreferencesActivity.java<br>
@@ -291,7 +291,7 @@ public class PreferencesActivity extends PreferenceActivity implements OnSharedP<br>
                  || key.equalsIgnoreCase("enable_<u></u>verbose_mode")<br>
                  || key.equalsIgnoreCase("network_<u></u>caching")) {<br>
              VLCInstance.<u></u>updateLibVlcSettings(<u></u>sharedPreferences);<br>
-            LibVLC.restart(this);<br>
+            LibVLC.restartInstance(this);<br>
          }<br>
      }<br>
  <br>
</blockquote>
<br></div>
______________________________<u></u>_________________<br>
Android mailing list<br>
<a href="mailto:Android@videolan.org" target="_blank">Android@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/android" target="_blank">https://mailman.videolan.org/<u></u>listinfo/android</a><br>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div>