]> git.sesse.net Git - vlc/commitdiff
integrate patch from Ticket #725. needs testing.
authorFilippo Carone <littlejohn@videolan.org>
Tue, 24 Oct 2006 22:23:49 +0000 (22:23 +0000)
committerFilippo Carone <littlejohn@videolan.org>
Tue, 24 Oct 2006 22:23:49 +0000 (22:23 +0000)
THANKS
bindings/java/org/videolan/jvlc/VLM.java
bindings/java/src/video-jni.cc
bindings/java/src/vlm-jni.cc
include/vlc/libvlc.h
src/control/vlm.c

diff --git a/THANKS b/THANKS
index 4c70da31512e3000144aec24a7d7c46465e26550..789e318ff33e939343d2413e243eb1c1a83c3090 100644 (file)
--- a/THANKS
+++ b/THANKS
@@ -88,6 +88,7 @@ Jeroen Massar <jeroen at unfix dot org> - IPv6 hostname resolution fix
 Jérôme Guilbaud - Update of the WinAmp 5 VLC skin
 Joel Arvidsson <dogai at privat.utfors.se> - Swedish translation
 Joeri van Dooren <joeri at van.dooren.be> - OS X icon (v0.4.0)
+Jörg<vlc-ml at aab.noctis dot de> - VLM seek/show media functions
 Johen Michael Zorko <zorko at att.net> - fix for delay issues in udp sout
 John Paul Lorenti <jpl31 at columbia.edu> - ALSA device selection patch
 Jonas Larsen <jonas at vrt.dk> - Danish translation
index e16fd6af9e842098d41e7ce896a551a679420b08..5a38a8c7394ac2a5a58ec5b255c2c185e255ca25 100644 (file)
@@ -19,6 +19,15 @@ public class VLM implements VLMIntf {
        private native void _playMedia(String mediaName);
        private native void _stopMedia(String mediaName);
        private native void _pauseMedia(String mediaName);
+       private native void _seekMedia(String mediaName, float percentage);
+       private native String _showMedia(String mediaName);
+       private native float _getMediaposition(String name, int mediaInstance);
+       private native int _getMediatime(String name, int mediaInstance);
+       private native int _getMedialength(String name, int mediaInstance);
+       private native int _getMediarate(String name, int mediaInstance);
+       private native int _getMediatitle(String name, int mediaInstance);
+       private native int _getMediachapter(String name, int mediaInstance);
+       private native int _getMediaseekable(String name, int mediaInstance);
 
     public VLM( long instance ) {
        this.libvlcInstance = instance;
@@ -68,6 +77,43 @@ public class VLM implements VLMIntf {
                _pauseMedia(name);
        }
        
+       public void seekMedia(String name, float percentage) throws VLCException {
+               _seekMedia(name, percentage);
+       }
+
+       public String showMedia(String name) throws VLCException {
+               return _showMedia(name);
+       }
+       
+       public float getMediaPosition(String name, int mediaInstance) throws VLCException {
+               return _getMediaposition(name, mediaInstance);
+       }
+
+       public int getMediaTime(String name, int mediaInstance) throws VLCException {
+               return _getMediatime(name, mediaInstance);
+       }
+
+       public int getMediaLength(String name, int mediaInstance) throws VLCException {
+               return _getMedialength(name, mediaInstance);
+       }
+
+       public int getMediaRate(String name, int mediaInstance) throws VLCException {
+               return _getMediarate(name, mediaInstance);
+       }
+
+       public int getMediaTitle(String name, int mediaInstance) throws VLCException {
+               return _getMediatitle(name, mediaInstance);
+       }
+
+       public int getMediaChapter(String name, int mediaInstance) throws VLCException {
+               return _getMediachapter(name, mediaInstance);
+       }
+
+       public boolean getMediaSeekable(String name, int mediaInstance) throws VLCException {
+               return _getMediaseekable(name, mediaInstance) > 0;
+       }
+
+
        public long getInstance() {
                return libvlcInstance;
        }
index 1f01bba6f47a10b4f3a51546099d4e6b0f25aa2f..e14fbf670c42b56483bae9085cc648c3375a09c8 100644 (file)
@@ -200,7 +200,7 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_Video__1reparent (JNIEnv *env, job
     XSetBackground(dsi_x11->display, gc, 0);
 
     /* and reparent */
-    libvlc_video_reparent( input, dsi_x11->drawable, exception );
+    libvlc_video_reparent( input, (libvlc_drawable_t)dsi_x11->drawable, exception );
 
     CHECK_EXCEPTION_FREE ;
 
index c43db60623c04829506e687d88c43ce99268b22c..637d93cb0fdf159b8197bb0f2d24f73d9e79c0be 100644 (file)
@@ -217,3 +217,61 @@ JNIEXPORT void JNICALL Java_org_videolan_jvlc_VLM__1pauseMedia (JNIEnv *env, job
     }    
 }
 
+JNIEXPORT void JNICALL Java_org_videolan_jvlc_VLM__1seekMedia (JNIEnv *env, jobject _this, jstring name, jfloat percentage) 
+{
+    INIT_FUNCTION;
+    const char* psz_name = env->GetStringUTFChars( name, 0 );
+
+    libvlc_vlm_seek_media( (libvlc_instance_t *) instance, (char*)psz_name, (float)percentage, exception );
+    CHECK_EXCEPTION_FREE ;
+
+    if (psz_name != NULL) {
+        env->ReleaseStringUTFChars( name, psz_name );
+    }
+}
+
+JNIEXPORT jstring JNICALL Java_org_videolan_jvlc_VLM__1showMedia (JNIEnv *env, jobject _this, jstring name) 
+{
+    INIT_FUNCTION;
+    const char* psz_name = env->GetStringUTFChars( name, 0 );
+    char *psz_response;
+    jstring js_response;
+   
+    psz_response = libvlc_vlm_show_media( (libvlc_instance_t *) instance, (char*)psz_name, exception );
+    CHECK_EXCEPTION_FREE ;
+
+    if (psz_name != NULL) {
+        env->ReleaseStringUTFChars( name, psz_name );
+    }
+    js_response = env->NewStringUTF(psz_response);
+    if (psz_response != NULL) {
+        free(psz_response);
+    }
+    return js_response;
+}
+
+#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, dummyGetType, dummyDefault)\
+JNIEXPORT j ## returnType JNICALL Java_org_videolan_jvlc_VLM__1getMedia ## attr(JNIEnv *env, jobject _this, jstring name, jint index) \
+{ \
+    INIT_FUNCTION; \
+    const char* psz_name = env->GetStringUTFChars( name, 0 ); \
+    returnType response; \
+    \
+    response = libvlc_vlm_get_media_ ## attr( (libvlc_instance_t *) instance, (char*)psz_name, (int)index, exception ); \
+    CHECK_EXCEPTION_FREE ; \
+    \
+    if (psz_name != NULL) { \
+        env->ReleaseStringUTFChars( name, psz_name ); \
+    } \
+    return response; \
+}
+
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( position, float, Float, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( time, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( length, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( rate, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( title, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( chapter, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0);
+
+#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE
index e29c8d48bc7fd29b166d274185e98b31d495cb9f..5ac03fe3d3a5db0d211018b56202c7cb665bcf67 100644 (file)
@@ -580,7 +580,37 @@ void libvlc_vlm_stop_media ( libvlc_instance_t *, char *, libvlc_exception_t * )
  */ 
 void libvlc_vlm_pause_media( libvlc_instance_t *, char *, libvlc_exception_t * );
     
-    
+/**
+ * Seeks in the named broadcast.
+ * \param p_instance the instance
+ * \param psz_name the name of the broadcast
+ * \param f_percentage the percentage to seek to
+ * \param p_exception an initialized exception
+ */ 
+void libvlc_vlm_seek_media( libvlc_instance_t *, char *,
+                            float, libvlc_exception_t * );
+   
+/**
+ * Return information of the named broadcast.
+ * \param p_instance the instance
+ * \param psz_name the name of the broadcast
+ * \param p_exception an initialized exception
+ */ 
+char* libvlc_vlm_show_media( libvlc_instance_t *, char *, libvlc_exception_t * );
+
+#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, getType, default)\
+returnType libvlc_vlm_get_media_## attr( libvlc_instance_t *, \
+                        char *, int , libvlc_exception_t * );
+
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( position, float, Float, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( time, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( length, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( rate, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( title, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( chapter, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0);
+
+#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE
 
 /** @} */
 /** @} */
index 8f2d617ae9ff0b220242cbeaf940dea73c2d96d0..4c608274e5b5c685016d46840315a35b1dd91a19 100644 (file)
@@ -290,6 +290,141 @@ void libvlc_vlm_pause_media( libvlc_instance_t *p_instance, char *psz_name,
         libvlc_exception_raise( p_exception, "Unable to pause %s",
                                 psz_name );
     }
-    free( psz_message);
+    free( psz_message );
+#endif
+}
+
+void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, char *psz_name,
+                            float f_percentage, libvlc_exception_t *p_exception )
+    
+{
+    char *psz_message;
+    vlm_message_t *answer;
+    CHECK_VLM;
+#ifdef ENABLE_VLM
+    asprintf( &psz_message, "control %s seek %f", psz_name, f_percentage );
+    vlm_ExecuteCommand( p_instance->p_vlm, psz_message, &answer );
+    if( answer->psz_value )
+    {
+        libvlc_exception_raise( p_exception, "Unable to seek %s to %f",
+                                psz_name, f_percentage );
+    }
+    free( psz_message );
+#endif
+}
+
+#ifdef ENABLE_VLM
+#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, getType, default)\
+returnType libvlc_vlm_get_media_## attr( libvlc_instance_t *p_instance, \
+                        char *psz_name, int i_instance, \
+                        libvlc_exception_t *p_exception ) \
+{ \
+    vlm_media_instance_t *p_media_instance; \
+    CHECK_VLM; \
+    vlm_media_t *p_media; \
+    p_media = vlm_MediaSearch( p_instance->p_vlm, psz_name ); \
+    if ( p_media == NULL ) \
+    { \
+        libvlc_exception_raise( p_exception, "Unable to find media %s", \
+                                psz_name); \
+    } \
+    else \
+    { \
+        if ( i_instance < p_media->i_instance ) \
+        { \
+            p_media_instance = p_media->instance[ i_instance ]; \
+            return var_Get ## getType( p_media_instance->p_input, #attr );\
+        } \
+        else \
+        { \
+            libvlc_exception_raise( p_exception, "Media index %i out of range",\
+                                    i_instance); \
+        } \
+    } \
+    return default; \
+}
+#else
+#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, getType, default)\
+returnType libvlc_vlm_get_media_## attr( libvlc_instance_t *p_instance, \
+                        char *psz_name, int i_instance, libvlc_exception_t *p_exception ) \
+{ \
+    char *psz_message; \
+    vlm_message_t *answer; \
+    CHECK_VLM; \
+    return default; \
+}
+#endif
+
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( position, float, Float, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( time, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( length, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( rate, int, Integer, -1);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( title, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( chapter, int, Integer, 0);
+LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0);
+
+#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE
+
+char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name,
+                             libvlc_exception_t *p_exception )
+{
+    char* recurse_answer( char* psz_prefix, vlm_message_t *p_answer ) {
+        char* psz_childprefix;
+        char* psz_response="";
+        char* response_tmp;
+        int i;
+        vlm_message_t *aw_child, **paw_child;
+        
+        asprintf( &psz_childprefix, "%s%s.", psz_prefix, p_answer->psz_name );
+        
+        if ( p_answer->i_child )
+        {
+            paw_child = p_answer->child;
+            aw_child = *( paw_child );
+            for( i = 0; i < p_answer->i_child; i++ )
+            {
+                asprintf( &response_tmp, "%s%s%s:%s\n",
+                          psz_response, psz_prefix, aw_child->psz_name,
+                          aw_child->psz_value );
+                free( psz_response );
+                psz_response = response_tmp;
+                if ( aw_child->i_child )
+                {
+                    asprintf(&response_tmp, "%s%s", psz_response,
+                             recurse_answer(psz_childprefix, aw_child));
+                    free( psz_response );
+                    psz_response = response_tmp;
+                }
+                paw_child++;
+                aw_child = *( paw_child );
+            }
+        }
+        free( psz_childprefix );
+        return psz_response;
+    }
+    
+    char *psz_message;
+    vlm_message_t *answer;
+    char *psz_response;
+
+    CHECK_VLM;
+#ifdef ENABLE_VLM
+    asprintf( &psz_message, "show %s", psz_name );
+    asprintf( &psz_response, "", psz_name );
+    vlm_ExecuteCommand( p_instance->p_vlm, psz_message, &answer );
+    if( answer->psz_value )
+    {
+        libvlc_exception_raise( p_exception, "Unable to call show %s: %s",
+                                psz_name, answer->psz_value );
+    }
+    else
+    {
+        if ( answer->child )
+        {
+            psz_response = recurse_answer( "", answer );
+        }
+    }
+    free( psz_message );
+    return(psz_response );
 #endif
 }