X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcontrol%2Fvlm.c;h=e8312d9e7515516026e264b88bd81fafae072f0e;hb=9ee093515ab379c5215e243b07563a9e8f5fb40d;hp=60d1e7dab716e0d27800a4f912037e3f0f6bade7;hpb=8c967b013160e200c377dd4d56d11dc37c1d5251;p=vlc diff --git a/src/control/vlm.c b/src/control/vlm.c index 60d1e7dab7..e8312d9e75 100644 --- a/src/control/vlm.c +++ b/src/control/vlm.c @@ -21,13 +21,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include "libvlc_internal.h" - #include +#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 ) { @@ -75,7 +76,7 @@ char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, char *psz_name, CHECK_VLM; asprintf( &psz_message, "show %s", psz_name ); asprintf( &psz_response, "", psz_name ); - vlm_ExecuteCommand( p_instance->p_vlm, psz_message, &answer ); + vlm_ExecuteCommand( p_instance->libvlc_vlm.p_vlm, psz_message, &answer ); if( answer->psz_value ) { libvlc_exception_raise( p_exception, "Unable to call show %s: %s", @@ -104,31 +105,169 @@ char* libvlc_vlm_show_media( libvlc_instance_t *p_instance, } #endif /* 0 */ +/* VLM events callback. Transmit to libvlc */ +static int VlmEvent( vlc_object_t *p_this, const char * name, + vlc_value_t old_val, vlc_value_t newval, void *param ) +{ + vlm_event_t *event = (vlm_event_t*)newval.p_address; + libvlc_event_manager_t *p_event_manager = (libvlc_event_manager_t *) param; + libvlc_event_t libvlc_event; + + VLC_UNUSED( p_this ); + VLC_UNUSED( name ); + VLC_UNUSED( old_val ); + + libvlc_event.u.vlm_media_event.psz_instance_name = NULL; + libvlc_event.u.vlm_media_event.psz_media_name = event->psz_name; + + switch( event->i_type ) + { + case VLM_EVENT_MEDIA_ADDED: + libvlc_event.type = libvlc_VlmMediaAdded; + break; + case VLM_EVENT_MEDIA_REMOVED: + libvlc_event.type = libvlc_VlmMediaRemoved; + break; + case VLM_EVENT_MEDIA_CHANGED: + libvlc_event.type = libvlc_VlmMediaChanged; + break; + case VLM_EVENT_MEDIA_INSTANCE_STARTED: + libvlc_event.type = libvlc_VlmMediaInstanceStarted; + break; + case VLM_EVENT_MEDIA_INSTANCE_STOPPED: + libvlc_event.type = libvlc_VlmMediaInstanceStopped; + break; + case VLM_EVENT_MEDIA_INSTANCE_STATE: + libvlc_event.u.vlm_media_event.psz_instance_name = + event->psz_instance_name; + switch( event->input_state ) + { + case INIT_S: + libvlc_event.type = libvlc_VlmMediaInstanceStatusInit; + break; + case OPENING_S: + libvlc_event.type = + libvlc_VlmMediaInstanceStatusOpening; + break; + case PLAYING_S: + libvlc_event.type = + libvlc_VlmMediaInstanceStatusPlaying; + break; + case PAUSE_S: + libvlc_event.type = libvlc_VlmMediaInstanceStatusPause; + break; + case END_S: + libvlc_event.type = libvlc_VlmMediaInstanceStatusEnd; + break; + case ERROR_S: + libvlc_event.type = libvlc_VlmMediaInstanceStatusError; + break; + default: + return 0; + } + break; + default: + return 0; + } + libvlc_event_send( p_event_manager, &libvlc_event ); + return 0; +} + +static void libvlc_vlm_release_internal( libvlc_instance_t *p_instance ) +{ + vlm_t *p_vlm = p_instance->libvlc_vlm.p_vlm; + if( !p_instance->libvlc_vlm.p_vlm ) + return; + /* We need to remove medias in order to receive events */ + vlm_Control( p_vlm, VLM_CLEAR_MEDIAS ); + vlm_Control( p_vlm, VLM_CLEAR_SCHEDULES ); + + var_DelCallback( (vlc_object_t *)p_vlm, "intf-event", VlmEvent, + p_instance->libvlc_vlm.p_event_manager ); + p_instance->libvlc_vlm.pf_release = NULL; + libvlc_event_manager_release( p_instance->libvlc_vlm.p_event_manager ); + p_instance->libvlc_vlm.p_event_manager = NULL; + vlm_Delete( p_vlm ); + p_instance->libvlc_vlm.p_vlm = NULL; +} static int libvlc_vlm_init( libvlc_instance_t *p_instance, libvlc_exception_t *p_exception ) { - if( !p_instance->p_vlm ) - p_instance->p_vlm = vlm_New( p_instance->p_libvlc_int ); + if( !p_instance->libvlc_vlm.p_event_manager ) + { + p_instance->libvlc_vlm.p_event_manager = + libvlc_event_manager_new( p_instance->libvlc_vlm.p_vlm, + p_instance, p_exception ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaAdded, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaRemoved, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaChanged, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStarted, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStopped, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusInit, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusOpening, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusPlaying, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusPause, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusEnd, NULL ); + libvlc_event_manager_register_event_type( + p_instance->libvlc_vlm.p_event_manager, + libvlc_VlmMediaInstanceStatusError, NULL ); + } - if( !p_instance->p_vlm ) + if( !p_instance->libvlc_vlm.p_vlm ) { - libvlc_exception_raise( p_exception, - "Unable to create VLM." ); - return VLC_EGENERIC; + p_instance->libvlc_vlm.p_vlm = vlm_New( p_instance->p_libvlc_int ); + if( !p_instance->libvlc_vlm.p_vlm ) + { + libvlc_exception_raise( p_exception, + "Unable to create VLM." ); + return VLC_EGENERIC; + } + var_AddCallback( (vlc_object_t *)p_instance->libvlc_vlm.p_vlm, + "intf-event", VlmEvent, + p_instance->libvlc_vlm.p_event_manager ); + p_instance->libvlc_vlm.pf_release = libvlc_vlm_release_internal; } + return VLC_SUCCESS; } + +void libvlc_vlm_release( libvlc_instance_t *p_instance, + libvlc_exception_t *p_exception) +{ + libvlc_vlm_release_internal( p_instance ); +} + #define VLM_RET(p,ret) do { \ if( libvlc_vlm_init( p_instance, p_exception ) ) return ret;\ - (p) = p_instance->p_vlm; \ + (p) = p_instance->libvlc_vlm.p_vlm; \ } while(0) #define VLM(p) VLM_RET(p,) -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 ) +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; @@ -139,9 +278,11 @@ static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p 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 ) ) + 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 ); + libvlc_exception_raise( p_exception, "Unable to get %s instances", + psz_name ); return NULL; } p_minstance = NULL; @@ -156,16 +297,6 @@ static vlm_media_instance_t *libvlc_vlm_get_media_instance( libvlc_instance_t *p 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, @@ -195,7 +326,8 @@ void libvlc_vlm_add_broadcast( libvlc_instance_t *p_instance, 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 ); + 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, @@ -222,7 +354,8 @@ void libvlc_vlm_add_vod( libvlc_instance_t *p_instance, const char *psz_name, 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 ); + libvlc_exception_raise( p_exception, "Media %s creation failed", + psz_name ); } void libvlc_vlm_del_media( libvlc_instance_t *p_instance, const char *psz_name, @@ -286,7 +419,8 @@ void libvlc_vlm_set_mux( libvlc_instance_t *p_instance, const char *psz_name, { #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; \ + 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 @@ -308,7 +442,8 @@ void libvlc_vlm_set_input( libvlc_instance_t *p_instance, { #define VLM_CHANGE_CODE { while( p_media->i_input > 0 ) \ free( p_media->ppsz_input[--p_media->i_input] );\ - TAB_APPEND( p_media->i_input, p_media->ppsz_input, strdup(psz_input) ); } + 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 } @@ -317,7 +452,8 @@ 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) ); } +#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 } @@ -340,7 +476,8 @@ void libvlc_vlm_change_media( libvlc_instance_t *p_instance, while( p_media->i_option > 0 ) \ free( p_media->ppsz_option[--p_media->i_option] ); \ for( n = 0; n < i_options; n++ ) \ - TAB_APPEND( p_media->i_option, p_media->ppsz_option, strdup(ppsz_options[n]) ); \ + TAB_APPEND( p_media->i_option, p_media->ppsz_option, \ + strdup(ppsz_options[n]) ); \ } VLM_CHANGE( "Unable to change %s properties", VLM_CHANGE_CODE ); #undef VLM_CHANGE_CODE @@ -404,10 +541,10 @@ void libvlc_vlm_seek_media( libvlc_instance_t *p_instance, VLM(p_vlm); if( vlm_Control( p_vlm, VLM_GET_MEDIA_ID, psz_name, &id ) || - vlm_Control( p_vlm, VLM_SET_MEDIA_INSTANCE_POSITION, id, NULL, f_percentage ) ) - { - libvlc_exception_raise( p_exception, "Unable to seek %s to %f", psz_name, f_percentage ); - } + vlm_Control( p_vlm, VLM_SET_MEDIA_INSTANCE_POSITION, id, NULL, + f_percentage ) ) + libvlc_exception_raise( p_exception, "Unable to seek %s to %f", + psz_name, f_percentage ); } float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, @@ -415,14 +552,15 @@ float libvlc_vlm_get_media_instance_position( libvlc_instance_t *p_instance, 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 ); + vlm_media_instance_t *p_mi; + float result = -1.; + + 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; } return result; } @@ -431,14 +569,15 @@ int libvlc_vlm_get_media_instance_time( libvlc_instance_t *p_instance, const char *psz_name, int i_instance, libvlc_exception_t *p_exception ) { + vlm_media_instance_t *p_mi; int result = -1; - vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, + + 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; } return result; } @@ -448,14 +587,15 @@ int libvlc_vlm_get_media_instance_length( libvlc_instance_t *p_instance, int i_instance, libvlc_exception_t *p_exception ) { + vlm_media_instance_t *p_mi; int result = -1; - vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, - i_instance, p_exception ); + + 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; } return result; } @@ -464,14 +604,15 @@ int libvlc_vlm_get_media_instance_rate( libvlc_instance_t *p_instance, const char *psz_name, int i_instance, libvlc_exception_t *p_exception ) { + vlm_media_instance_t *p_mi; int result = -1; - vlm_media_instance_t *p_mi = libvlc_vlm_get_media_instance( p_instance, psz_name, - i_instance, p_exception ); + + 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; } return result; } @@ -480,15 +621,13 @@ 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 ); + vlm_media_instance_t *p_mi; + + 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; - } - return result; + return p_mi ? 0 : -1; } int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *p_instance, @@ -496,15 +635,13 @@ int libvlc_vlm_get_media_instance_chapter( libvlc_instance_t *p_instance, 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 ); + vlm_media_instance_t *p_mi; + + 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; - } - return result; + return p_mi ? 0 : -1; } int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, @@ -512,13 +649,19 @@ int libvlc_vlm_get_media_instance_seekable( libvlc_instance_t *p_instance, 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 ); + vlm_media_instance_t *p_mi; + + 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; - } - return result; + return p_mi ? 0 : -1; +} + +libvlc_event_manager_t * libvlc_vlm_get_event_manager( libvlc_instance_t *p_instance, + libvlc_exception_t *p_exception ) +{ + vlm_t *p_vlm; + VLM_RET( p_vlm, NULL); + return p_instance->libvlc_vlm.p_event_manager; }