X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fvlm.c;h=cafd8dced7ec72d456c85f7b91b276a45ca2b7b0;hb=7bbb46c1e2d22e7a144bcca18f6e0ca1e0eaf8e2;hp=78df6c3d1c91b5e7509fd43aa53ab8f6b7288120;hpb=0f3049ef88ee9e7a1047ff27521774616330390b;p=vlc diff --git a/src/control/vlm.c b/src/control/vlm.c index 78df6c3d1c..cafd8dced7 100644 --- a/src/control/vlm.c +++ b/src/control/vlm.c @@ -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; @@ -119,7 +126,8 @@ static int libvlc_vlm_init( libvlc_instance_t *p_instance, #define VLM(p) VLM_RET(p,) static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p_instance, - char *psz_name, int i_minstance_idx, + const char *psz_name, + int i_minstance_idx, libvlc_exception_t *p_exception ) { vlm_t *p_vlm; @@ -158,10 +166,11 @@ void libvlc_vlm_release( libvlc_instance_t *p_instance, libvlc_exception_t *p_ex vlm_Delete( p_vlm ); } - -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, +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 ) { @@ -174,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) ); @@ -183,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; @@ -230,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; } @@ -246,8 +281,20 @@ 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 { free( p_media->psz_output ); \ p_media->psz_output = strdup( psz_output ); } @@ -255,8 +302,9 @@ void libvlc_vlm_set_output( libvlc_instance_t *p_instance, char *psz_name, #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] );\ @@ -265,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; \ @@ -296,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; @@ -311,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; @@ -326,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; @@ -341,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; @@ -356,37 +410,122 @@ void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, char *psz_name, } } -#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; \ +float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) +{ + 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; } -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_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 ) + { + result = p_mi->i_time; + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get time attribute" ); + return result; +} -#undef LIBVLC_VLM_GET_MEDIA_ATTRIBUTE +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 ) + { + result = p_mi->i_length; + vlm_media_instance_Delete( p_mi ); + return result; + } + libvlc_exception_raise( p_exception, "Unable to get length 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_rate( 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; + 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; +} + +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; +} + +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; +} + +int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, + const char *psz_name, + int i_instance, + libvlc_exception_t *p_exception ) +{ + 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; }