X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmediacontrol_core.c;h=bfe8bee9dbcea9921436f001ec525b91824dc4b4;hb=f85de941b2b2ac1952638ff335dc315c568a431c;hp=c0eb0cdd9cbaf3e3d0be60af0db443528d77036b;hpb=f1dd5a851706f98f493f290f3559db7805b40b8e;p=vlc diff --git a/src/control/mediacontrol_core.c b/src/control/mediacontrol_core.c index c0eb0cdd9c..bfe8bee9db 100644 --- a/src/control/mediacontrol_core.c +++ b/src/control/mediacontrol_core.c @@ -21,22 +21,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ -#include +#include "mediacontrol_internal.h" #include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #include -#define HAS_SNAPSHOT 1 - -#ifdef HAS_SNAPSHOT -#include -#endif - #include /* malloc(), free() */ #include @@ -54,46 +50,67 @@ # include #endif -#define RAISE( c, m ) exception->code = c; \ - exception->message = strdup(m); - -mediacontrol_Instance* mediacontrol_new_from_object( int vlc_object_id, - mediacontrol_Exception *exception ) +mediacontrol_Instance* mediacontrol_new( int argc, char** argv, mediacontrol_Exception *exception ) { - mediacontrol_Instance* retval = NULL; - vlc_object_t *p_vlc; - vlc_object_t *p_object; + mediacontrol_Instance* retval; + libvlc_exception_t ex; + char** ppsz_argv = NULL; + int i_index; - p_object = ( vlc_object_t* )vlc_current_object( vlc_object_id ); - if( ! p_object ) - { - RAISE( mediacontrol_InternalException, "Unable to find vlc object" ); - return NULL; - } + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); - p_vlc = vlc_object_find( p_object, VLC_OBJECT_ROOT, FIND_PARENT ); - if( ! p_vlc ) - { - RAISE( mediacontrol_InternalException, "Unable to initialize VLC" ); - return NULL; - } retval = ( mediacontrol_Instance* )malloc( sizeof( mediacontrol_Instance ) ); - retval->p_vlc = p_vlc; - retval->vlc_object_id = p_vlc->i_object_id; + if( !retval ) + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); + + /* Prepend a dummy argv[0] so that users of the API do not have to + do it themselves, and can simply provide the args list. */ + ppsz_argv = malloc( ( argc + 2 ) * sizeof( char * ) ) ; + if( ! ppsz_argv ) + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); + + ppsz_argv[0] = strdup("vlc"); + for ( i_index = 0; i_index < argc; i_index++ ) + ppsz_argv[i_index + 1] = argv[i_index]; + ppsz_argv[argc + 1] = NULL; + + retval->p_instance = libvlc_new( argc + 1, ppsz_argv, &ex ); + retval->p_playlist = retval->p_instance->p_libvlc_int->p_playlist; + HANDLE_LIBVLC_EXCEPTION_NULL( &ex ); + return retval; +}; - /* We can keep references on these, which should not change. Is it true ? */ - retval->p_playlist = vlc_object_find( p_vlc, - VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - retval->p_intf = vlc_object_find( p_vlc, VLC_OBJECT_INTF, FIND_ANYWHERE ); +void +mediacontrol_exit( mediacontrol_Instance *self ) +{ + libvlc_exception_t ex; + libvlc_exception_init( &ex ); - if( ! retval->p_playlist || ! retval->p_intf ) - { - RAISE( mediacontrol_InternalException, "No available interface" ); - return NULL; - } - return retval; -}; + libvlc_destroy( self->p_instance, &ex ); +} +libvlc_instance_t* +mediacontrol_get_libvlc_instance( mediacontrol_Instance *self ) +{ + return self->p_instance; +} + +mediacontrol_Instance * +mediacontrol_new_from_instance( libvlc_instance_t* p_instance, + mediacontrol_Exception *exception ) +{ + mediacontrol_Instance* retval; + + retval = ( mediacontrol_Instance* )malloc( sizeof( mediacontrol_Instance ) ); + if( ! retval ) + { + RAISE_NULL( mediacontrol_InternalException, "Out of memory" ); + } + retval->p_instance = p_instance; + retval->p_playlist = retval->p_instance->p_libvlc_int->p_playlist; + return retval; +} /************************************************************************** * Playback management @@ -105,37 +122,49 @@ mediacontrol_get_media_position( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { mediacontrol_Position* retval = NULL; - vlc_value_t val; - input_thread_t * p_input = self->p_playlist->p_input; + libvlc_exception_t ex; + vlc_int64_t pos; + libvlc_media_instance_t * p_mi; - exception = mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); retval = ( mediacontrol_Position* )malloc( sizeof( mediacontrol_Position ) ); retval->origin = an_origin; retval->key = a_key; - if( ! p_input ) - { - RAISE( mediacontrol_InternalException, "No input thread." ); - return NULL; - } + p_mi = libvlc_playlist_get_media_instance( self->p_instance, &ex); + HANDLE_LIBVLC_EXCEPTION_NULL( &ex ); if( an_origin != mediacontrol_AbsolutePosition ) { + libvlc_media_instance_release( p_mi ); /* Relative or ModuloPosition make no sense */ - RAISE( mediacontrol_PositionOriginNotSupported, "Only absolute position is valid." ); - return NULL; + RAISE_NULL( mediacontrol_PositionOriginNotSupported, + "Only absolute position is valid." ); } /* We are asked for an AbsolutePosition. */ - val.i_time = 0; - var_Get( p_input, "time", &val ); - /* FIXME: check val.i_time > 0 */ - - retval->value = mediacontrol_unit_convert( p_input, - mediacontrol_MediaTime, - a_key, - val.i_time / 1000 ); + pos = libvlc_media_instance_get_time( p_mi, &ex ); + + if( a_key == mediacontrol_MediaTime ) + { + retval->value = pos; + } + else + { + if( ! self->p_playlist->p_input ) + { + libvlc_media_instance_release( p_mi ); + RAISE_NULL( mediacontrol_InternalException, + "No input" ); + } + retval->value = private_mediacontrol_unit_convert( self->p_playlist->p_input, + mediacontrol_MediaTime, + a_key, + pos ); + } + libvlc_media_instance_release( p_mi ); return retval; } @@ -145,23 +174,20 @@ mediacontrol_set_media_position( mediacontrol_Instance *self, const mediacontrol_Position * a_position, mediacontrol_Exception *exception ) { - vlc_value_t val; - input_thread_t * p_input = self->p_playlist->p_input; + libvlc_media_instance_t * p_mi; + libvlc_exception_t ex; + vlc_int64_t i_pos; - exception=mediacontrol_exception_init( exception ); - if( ! p_input ) - { - RAISE( mediacontrol_InternalException, "No input thread." ); - } - else if( !var_GetBool( p_input, "seekable" ) ) - { - RAISE( mediacontrol_InvalidPosition, "Stream not seekable" ); - } - else - { - val.i_time = mediacontrol_position2microsecond( p_input, a_position ); - var_Set( p_input, "time", val ); - } + libvlc_exception_init( &ex ); + mediacontrol_exception_init( exception ); + + p_mi = libvlc_playlist_get_media_instance( self->p_instance, &ex); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); + + i_pos = private_mediacontrol_position2microsecond( self->p_playlist->p_input, a_position ); + libvlc_media_instance_set_time( p_mi, i_pos / 1000, &ex ); + libvlc_media_instance_release( p_mi ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } /* Starts playing a stream */ @@ -181,7 +207,7 @@ mediacontrol_start( mediacontrol_Instance *self, { playlist_t * p_playlist = self->p_playlist; - exception = mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); if( ! p_playlist ) { RAISE( mediacontrol_PlaylistException, "No available playlist" ); @@ -189,27 +215,19 @@ mediacontrol_start( mediacontrol_Instance *self, } vlc_mutex_lock( &p_playlist->object_lock ); - if( p_playlist->i_size ) + if( p_playlist->items.i_size ) { - int i_index; int i_from; char *psz_from = NULL; psz_from = ( char * )malloc( 20 * sizeof( char ) ); - if( psz_from ) + if( psz_from && p_playlist->status.p_item ) { - i_from = mediacontrol_position2microsecond( p_playlist->p_input, a_position ) / 1000000; - - i_index = p_playlist->i_index; - if( i_index < 0 ) - { - /* We know that there is at least 1 element, since i_size != 0 */ - i_index = 0; - } + i_from = private_mediacontrol_position2microsecond( p_playlist->p_input, a_position ) / 1000000; /* Set start time */ snprintf( psz_from, 20, "start-time=%i", i_from ); - playlist_ItemAddOption( p_playlist->pp_items[i_index], psz_from ); + input_ItemAddOption( p_playlist->status.p_item->p_input, psz_from ); free( psz_from ); } @@ -231,7 +249,7 @@ mediacontrol_pause( mediacontrol_Instance *self, input_thread_t *p_input = self->p_playlist->p_input; /* FIXME: use the a_position parameter */ - exception=mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); if( p_input != NULL ) { var_SetInteger( p_input, "state", PAUSE_S ); @@ -250,7 +268,7 @@ mediacontrol_resume( mediacontrol_Instance *self, input_thread_t *p_input = self->p_playlist->p_input; /* FIXME: use the a_position parameter */ - exception=mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); if( p_input != NULL ) { var_SetInteger( p_input, "state", PAUSE_S ); @@ -267,7 +285,7 @@ mediacontrol_stop( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { /* FIXME: use the a_position parameter */ - exception=mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); if( !self->p_playlist ) { RAISE( mediacontrol_PlaylistException, "No playlist" ); @@ -285,40 +303,39 @@ mediacontrol_playlist_add_item( mediacontrol_Instance *self, const char * psz_file, mediacontrol_Exception *exception ) { - exception=mediacontrol_exception_init( exception ); - if( !self->p_playlist ) - { - RAISE( mediacontrol_InternalException, "No playlist" ); - } - else - playlist_Add( self->p_playlist, psz_file, psz_file , PLAYLIST_INSERT, - PLAYLIST_END ); + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_playlist_add( self->p_instance, psz_file, psz_file, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } void mediacontrol_playlist_next_item( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { - exception=mediacontrol_exception_init( exception ); - if ( !self->p_playlist ) - { - RAISE( mediacontrol_InternalException, "No playlist" ); - } - else - playlist_Next( self->p_playlist ); + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_playlist_next( self->p_instance, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } void mediacontrol_playlist_clear( mediacontrol_Instance *self, mediacontrol_Exception *exception ) { - exception=mediacontrol_exception_init( exception ); - if( !self->p_playlist ) - { - RAISE( mediacontrol_PlaylistException, "No playlist" ); - } - else - playlist_Clear( self->p_playlist ); + libvlc_exception_t ex; + + mediacontrol_exception_init( exception ); + libvlc_exception_init( &ex ); + + libvlc_playlist_clear( self->p_instance, &ex ); + HANDLE_LIBVLC_EXCEPTION_VOID( &ex ); } mediacontrol_PlaylistSeq * @@ -330,7 +347,7 @@ mediacontrol_playlist_get_list( mediacontrol_Instance *self, playlist_t * p_playlist = self->p_playlist; int i_playlist_size; - exception=mediacontrol_exception_init( exception ); + mediacontrol_exception_init( exception ); if( !p_playlist ) { RAISE( mediacontrol_PlaylistException, "No playlist" ); @@ -338,13 +355,13 @@ mediacontrol_playlist_get_list( mediacontrol_Instance *self, } vlc_mutex_lock( &p_playlist->object_lock ); - i_playlist_size = p_playlist->i_size; + i_playlist_size = p_playlist->current.i_size; - retval = mediacontrol_PlaylistSeq__alloc( i_playlist_size ); + retval = private_mediacontrol_PlaylistSeq__alloc( i_playlist_size ); for( i_index = 0 ; i_index < i_playlist_size ; i_index++ ) { - retval->data[i_index] = strdup( p_playlist->pp_items[i_index]->input.psz_uri ); + retval->data[i_index] = strdup( ARRAY_VAL(p_playlist->current, i_index)->p_input->psz_uri ); } vlc_mutex_unlock( &p_playlist->object_lock ); @@ -364,7 +381,8 @@ mediacontrol_get_stream_information( mediacontrol_Instance *self, input_thread_t *p_input = self->p_playlist->p_input; vlc_value_t val; - retval = ( mediacontrol_StreamInformation* )malloc( sizeof( mediacontrol_StreamInformation ) ); + retval = ( mediacontrol_StreamInformation* ) + malloc( sizeof( mediacontrol_StreamInformation ) ); if( ! retval ) { RAISE( mediacontrol_InternalException, "Out of memory" ); @@ -400,7 +418,7 @@ mediacontrol_get_stream_information( mediacontrol_Instance *self, break; } - retval->url = strdup( p_input->input.p_item->psz_uri ); + retval->url = strdup( input_GetItem(p_input)->psz_uri ); /* TIME and LENGTH are in microseconds. We want them in ms */ var_Get( p_input, "time", &val); @@ -409,12 +427,12 @@ mediacontrol_get_stream_information( mediacontrol_Instance *self, var_Get( p_input, "length", &val); retval->length = val.i_time / 1000; - retval->position = mediacontrol_unit_convert( p_input, - mediacontrol_MediaTime, a_key, - retval->position ); - retval->length = mediacontrol_unit_convert( p_input, - mediacontrol_MediaTime, a_key, - retval->length ); + retval->position = private_mediacontrol_unit_convert( p_input, + mediacontrol_MediaTime, a_key, + retval->position ); + retval->length = private_mediacontrol_unit_convert( p_input, + mediacontrol_MediaTime, a_key, + retval->length ); } return retval; }