X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcontrol%2Fvlm.c;h=cafd8dced7ec72d456c85f7b91b276a45ca2b7b0;hb=33614823610fea0403c0e635305a7ab1596e45a2;hp=55abdac62ae1a0d0ec87e8941e32c594b9367d1d;hpb=423ec777563612108aecd971b9603081b4c567f5;p=vlc diff --git a/src/control/vlm.c b/src/control/vlm.c index 55abdac62a..cafd8dced7 100644 --- a/src/control/vlm.c +++ b/src/control/vlm.c @@ -2,7 +2,7 @@ * vlm.c: libvlc new API VLM handling functions ***************************************************************************** * Copyright (C) 2005 the VideoLAN team - * $Id: playlist.c 14265 2006-02-12 17:31:39Z zorglub $ + * $Id$ * * Authors: Clément Stenac * @@ -21,13 +21,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#include "libvlc_internal.h" + #include #include #include #include -#include "libvlc_internal.h" - #if 0 /* local function to be used in libvlc_vlm_show_media only */ static char* recurse_answer( char* psz_prefix, vlm_message_t *p_answer ) { @@ -73,7 +73,6 @@ char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name, 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 ); @@ -91,23 +90,31 @@ char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name, } free( psz_message ); return(psz_response ); -#endif +} +#else + +char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, + const char *psz_name, + libvlc_exception_t *p_exception ) +{ + (void)p_instance; + /* FIXME is it needed ? */ + libvlc_exception_raise( p_exception, "Unable to call show %s", psz_name ); return NULL; } -#endif + +#endif /* 0 */ static int libvlc_vlm_init( libvlc_instance_t *p_instance, libvlc_exception_t *p_exception ) { -#ifdef ENABLE_VLM if( !p_instance->p_vlm ) p_instance->p_vlm = vlm_New( p_instance->p_libvlc_int ); -#endif if( !p_instance->p_vlm ) { libvlc_exception_raise( p_exception, - "Unable to create VLM. It might be disabled." ); + "Unable to create VLM." ); return VLC_EGENERIC; } return VLC_SUCCESS; @@ -118,9 +125,52 @@ static int libvlc_vlm_init( libvlc_instance_t *p_instance, } while(0) #define VLM(p) VLM_RET(p,) -void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, char *psz_name, - char *psz_input, char *psz_output, - int i_options, char **ppsz_options, +static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p_instance, + const char *psz_name, + int i_minstance_idx, + libvlc_exception_t *p_exception ) +{ + vlm_t *p_vlm; + vlm_media_instance_t **pp_minstance; + vlm_media_instance_t *p_minstance; + int i_minstance; + int64_t id; + + VLM_RET(p_vlm, NULL); + + if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || + vlm_Control( p_vlm, VLM_GET_MEDIA_INSTANCES, id, &pp_minstance, &i_minstance ) ) + { + libvlc_exception_raise( p_exception, "Unable to get %s instances", psz_name ); + return NULL; + } + p_minstance = NULL; + if( i_minstance_idx >= 0 && i_minstance_idx < i_minstance ) + { + p_minstance = pp_minstance[i_minstance_idx]; + TAB_REMOVE( i_minstance, pp_minstance, p_minstance ); + } + while( i_minstance > 0 ) + vlm_media_instance_Delete( pp_minstance[--i_minstance] ); + TAB_CLEAN( i_minstance, pp_minstance ); + return p_minstance; +} + + +void libvlc_vlm_release( libvlc_instance_t *p_instance, libvlc_exception_t *p_exception) +{ + vlm_t *p_vlm; + + VLM(p_vlm); + + vlm_Delete( p_vlm ); +} + +void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, + const char *psz_name, + const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, int b_enabled, int b_loop, libvlc_exception_t *p_exception ) { @@ -133,7 +183,7 @@ void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, char *psz_name, vlm_media_Init( &m ); m.psz_name = strdup( psz_name ); m.b_enabled = b_enabled; - m.b_vod = VLC_FALSE; + m.b_vod = false; m.broadcast.b_loop = b_loop; if( psz_input ) TAB_APPEND( m.i_input, m.ppsz_input, strdup(psz_input) ); @@ -142,15 +192,40 @@ void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, char *psz_name, for( n = 0; n < i_options; n++ ) TAB_APPEND( m.i_option, m.ppsz_option, strdup(ppsz_options[n]) ); - if( vlm_Control( p_vlm, VLM_ADD_MEDIA, &m, NULL ) ) - { - vlm_media_Clean( &m ); + n = vlm_Control( p_vlm, VLM_ADD_MEDIA, &m, NULL ); + vlm_media_Clean( &m ); + if( n ) libvlc_exception_raise( p_exception, "Media %s creation failed", psz_name ); - } +} + +void libvlc_vlm_add_vod( libvlc_instance_t *p_instance, const char *psz_name, + const char *psz_input, int i_options, + const char * const *ppsz_options, int b_enabled, + const char *psz_mux, libvlc_exception_t *p_exception ) +{ + vlm_t *p_vlm; + vlm_media_t m; + int n; + + VLM(p_vlm); + + vlm_media_Init( &m ); + m.psz_name = strdup( psz_name ); + m.b_enabled = b_enabled; + m.b_vod = true; + m.vod.psz_mux = psz_mux ? strdup( psz_mux ) : NULL; + if( psz_input ) + TAB_APPEND( m.i_input, m.ppsz_input, strdup(psz_input) ); + for( n = 0; n < i_options; n++ ) + TAB_APPEND( m.i_option, m.ppsz_option, strdup(ppsz_options[n]) ); + + n = vlm_Control( p_vlm, VLM_ADD_MEDIA, &m, NULL ); vlm_media_Clean( &m ); + if( n ) + libvlc_exception_raise( p_exception, "Media %s creation failed", psz_name ); } -void libvlc_vlm_del_media( libvlc_instance_t *p_instance, char *psz_name, +void libvlc_vlm_del_media( libvlc_instance_t *p_instance, const char *psz_name, libvlc_exception_t *p_exception ) { vlm_t *p_vlm; @@ -189,15 +264,16 @@ void libvlc_vlm_del_media( libvlc_instance_t *p_instance, char *psz_name, libvlc_exception_raise( p_exception, psz_error, psz_name );\ } while(0) -void libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, char *psz_name, - int b_enabled, libvlc_exception_t *p_exception ) +void libvlc_vlm_set_enabled( libvlc_instance_t *p_instance, + const char *psz_name, int b_enabled, + libvlc_exception_t *p_exception ) { #define VLM_CHANGE_CODE { p_media->b_enabled = b_enabled; } VLM_CHANGE( "Unable to delete %s", VLM_CHANGE_CODE ); #undef VLM_CHANGE_CODE } -void libvlc_vlm_set_loop( libvlc_instance_t *p_instance, char *psz_name, +void libvlc_vlm_set_loop( libvlc_instance_t *p_instance, const char *psz_name, int b_loop, libvlc_exception_t *p_exception ) { #define VLM_CHANGE_CODE { p_media->broadcast.b_loop = b_loop; } @@ -205,17 +281,30 @@ void libvlc_vlm_set_loop( libvlc_instance_t *p_instance, char *psz_name, #undef VLM_CHANGE_CODE } -void libvlc_vlm_set_output( libvlc_instance_t *p_instance, char *psz_name, - char *psz_output, libvlc_exception_t *p_exception ) +void libvlc_vlm_set_mux( libvlc_instance_t *p_instance, const char *psz_name, + const char *psz_mux, libvlc_exception_t *p_exception ) +{ +#define VLM_CHANGE_CODE { if( p_media->b_vod ) { \ + free( p_media->vod.psz_mux ); \ + p_media->vod.psz_mux = psz_mux ? strdup( psz_mux ) : NULL; \ + } } + VLM_CHANGE( "Unable to change %s mux property", VLM_CHANGE_CODE ); +#undef VLM_CHANGE_CODE +} + +void libvlc_vlm_set_output( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_output, + libvlc_exception_t *p_exception ) { -#define VLM_CHANGE_CODE { if( p_media->psz_output ) free( p_media->psz_output ); \ +#define VLM_CHANGE_CODE { free( p_media->psz_output ); \ p_media->psz_output = strdup( psz_output ); } VLM_CHANGE( "Unable to change %s output property", VLM_CHANGE_CODE ); #undef VLM_CHANGE_CODE } -void libvlc_vlm_set_input( libvlc_instance_t *p_instance, char *psz_name, - char *psz_input, libvlc_exception_t *p_exception ) +void libvlc_vlm_set_input( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + libvlc_exception_t *p_exception ) { #define VLM_CHANGE_CODE { while( p_media->i_input > 0 ) \ free( p_media->ppsz_input[--p_media->i_input] );\ @@ -224,18 +313,20 @@ void libvlc_vlm_set_input( libvlc_instance_t *p_instance, char *psz_name, #undef VLM_CHANGE_CODE } -void libvlc_vlm_add_input( libvlc_instance_t *p_instance, char *psz_name, - char *psz_input, libvlc_exception_t *p_exception ) +void libvlc_vlm_add_input( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + libvlc_exception_t *p_exception ) { #define VLM_CHANGE_CODE { TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); } VLM_CHANGE( "Unable to change %s input property", VLM_CHANGE_CODE ); #undef VLM_CHANGE_CODE } -void libvlc_vlm_change_media( libvlc_instance_t *p_instance, char *psz_name, - char *psz_input, char *psz_output, int i_options, - char **ppsz_options, int b_enabled, int b_loop, - libvlc_exception_t *p_exception ) +void libvlc_vlm_change_media( libvlc_instance_t *p_instance, + const char *psz_name, const char *psz_input, + const char *psz_output, int i_options, + const char * const *ppsz_options, int b_enabled, + int b_loop, libvlc_exception_t *p_exception ) { #define VLM_CHANGE_CODE { int n; \ p_media->b_enabled = b_enabled; \ @@ -244,8 +335,7 @@ void libvlc_vlm_change_media( libvlc_instance_t *p_instance, char *psz_name, free( p_media->ppsz_input[--p_media->i_input] ); \ if( psz_input ) \ TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); \ - if( p_media->psz_output ) \ - free( p_media->psz_output ); \ + free( p_media->psz_output ); \ p_media->psz_output = psz_output ? strdup( psz_output ) : NULL; \ while( p_media->i_option > 0 ) \ free( p_media->ppsz_option[--p_media->i_option] ); \ @@ -256,7 +346,8 @@ void libvlc_vlm_change_media( libvlc_instance_t *p_instance, char *psz_name, #undef VLM_CHANGE_CODE } -void libvlc_vlm_play_media( libvlc_instance_t *p_instance, char *psz_name, +void libvlc_vlm_play_media( libvlc_instance_t *p_instance, + const char *psz_name, libvlc_exception_t *p_exception ) { vlm_t *p_vlm; @@ -271,7 +362,8 @@ void libvlc_vlm_play_media( libvlc_instance_t *p_instance, char *psz_name, } } -void libvlc_vlm_stop_media( libvlc_instance_t *p_instance, char *psz_name, +void libvlc_vlm_stop_media( libvlc_instance_t *p_instance, + const char *psz_name, libvlc_exception_t *p_exception ) { vlm_t *p_vlm; @@ -286,8 +378,9 @@ void libvlc_vlm_stop_media( libvlc_instance_t *p_instance, char *psz_name, } } -void libvlc_vlm_pause_media( libvlc_instance_t *p_instance, char *psz_name, - libvlc_exception_t *p_exception ) +void libvlc_vlm_pause_media( libvlc_instance_t *p_instance, + const char *psz_name, + libvlc_exception_t *p_exception ) { vlm_t *p_vlm; int64_t id; @@ -301,8 +394,9 @@ void libvlc_vlm_pause_media( libvlc_instance_t *p_instance, char *psz_name, } } -void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, char *psz_name, - float f_percentage, libvlc_exception_t *p_exception ) +void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, + const char *psz_name, float f_percentage, + libvlc_exception_t *p_exception ) { vlm_t *p_vlm; int64_t id; @@ -316,67 +410,122 @@ void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, char *psz_name, } } -static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p_instance, - char *psz_name, int i_minstance_idx, - libvlc_exception_t *p_exception ) +float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) { - vlm_t *p_vlm; - vlm_media_instance_t **pp_minstance; - vlm_media_instance_t *p_minstance; - int i_minstance; - int64_t id; - - VLM_RET(p_vlm, NULL); + float result = -1; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) + { + result = p_mi->d_position; + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get position attribute" ); + return result; +} - if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || - vlm_Control( p_vlm, VLM_GET_MEDIA_INSTANCES, id, &pp_minstance, &i_minstance ) ) +int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance, + libvlc_exception_t *p_exception ) +{ + int result = -1; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) { - libvlc_exception_raise( p_exception, "Unable to get %s instances", psz_name ); - return NULL; + result = p_mi->i_time; + vlm_media_instance_Delete( p_mi ); + return result; } - p_minstance = NULL; - if( i_minstance_idx >= 0 && i_minstance_idx < i_minstance ) + libvlc_exception_raise( p_exception, "Unable to get time attribute" ); + return result; +} + +int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) +{ + int result = -1; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) { - p_minstance = pp_minstance[i_minstance_idx]; - TAB_REMOVE( i_minstance, pp_minstance, p_minstance ); + result = p_mi->i_length; + vlm_media_instance_Delete( p_mi ); + return result; } - while( i_minstance > 0 ) - vlm_media_instance_Delete( pp_minstance[--i_minstance] ); - TAB_CLEAN( i_minstance, pp_minstance ); - return p_minstance; + libvlc_exception_raise( p_exception, "Unable to get length attribute" ); + return result; } -#define LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( attr, returnType, getType, ret, code )\ -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_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, i_instance, \ - p_exception ); \ - if( p_mi ) { \ - returnType ret_value; \ - code; \ - vlm_media_instance_Delete( p_mi ); \ - return ret_value; \ - } \ - libvlc_exception_raise( p_exception, "Unable to get %s "#attr "attribute" ); \ - return ret; \ +int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance, + libvlc_exception_t *p_exception ) +{ + int result = -1; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) + { + result = p_mi->i_rate; + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get rate attribute" ); + return result; } -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( position, float, Float, -1, ret_value = p_mi->d_position; ); -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( time, int, Integer, -1, ret_value = p_mi->i_time ); -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( length, int, Integer, -1, ret_value = p_mi->i_length ); -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( rate, int, Integer, -1, ret_value = p_mi->i_rate ); -/* FIXME extend vlm_media_instance_t to be able to implement them */ -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( title, int, Integer, 0, ret_value = 0 ); -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( chapter, int, Integer, 0, ret_value = 0 ); -LIBVLC_VLM_GET_MEDIA_ATTRIBUTE( seekable, int, Bool, 0, ret_value = VLC_FALSE ); +int libvlc_vlm_get_media_instance_title( libvlc_instance_t *p_instance, + const char *psz_name, int i_instance, + libvlc_exception_t *p_exception ) +{ + int result = 0; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) + { + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get title attribute" ); + return result; +} -#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE +int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) +{ + int result = 0; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) + { + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get chapter attribute" ); + return result; +} -char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name, - libvlc_exception_t *p_exception ) +int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) { - /* FIXME is it needed ? */ - libvlc_exception_raise( p_exception, "Unable to call show %s", psz_name ); - return NULL; + bool result = 0; + vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + i_instance, p_exception ); + if( p_mi ) + { + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get seekable attribute" ); + return result; }