X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmedia_player.c;h=a0e117542aca43cda792662d75c1324f19263e30;hb=ae47c1c8c8996c4cc3b7b737775e92a8a663a727;hp=347fdf0d2eaaf0bd6c46a43dc1889a99177334c1;hpb=ad77d955a5dc051976d94d6e08ee0f717ec3a938;p=vlc diff --git a/src/control/media_player.c b/src/control/media_player.c index 347fdf0d2e..a0e117542a 100644 --- a/src/control/media_player.c +++ b/src/control/media_player.c @@ -57,23 +57,7 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd, static int SnapshotTakenCallback( vlc_object_t *p_this, char const *psz_cmd, vlc_value_t oldval, vlc_value_t newval, void *p_data ); -static const libvlc_state_t vlc_to_libvlc_state_array[] = -{ - [INIT_S] = libvlc_NothingSpecial, - [OPENING_S] = libvlc_Opening, - [PLAYING_S] = libvlc_Playing, - [PAUSE_S] = libvlc_Paused, - [END_S] = libvlc_Ended, - [ERROR_S] = libvlc_Error, -}; - -static inline libvlc_state_t vlc_to_libvlc_state( int vlc_state ) -{ - if( vlc_state < 0 || vlc_state > 6 ) - return libvlc_Ended; - - return vlc_to_libvlc_state_array[vlc_state]; -} +static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi ); /* * Release the associated input thread. @@ -226,6 +210,14 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd, libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL ); libvlc_event_send( p_mi->p_event_manager, &event ); } + else if( newval.i_int == INPUT_EVENT_ABORT ) + { + libvlc_state_t libvlc_state = libvlc_Stopped; + event.type = libvlc_MediaPlayerStopped; + + libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL ); + libvlc_event_send( p_mi->p_event_manager, &event ); + } else if( newval.i_int == INPUT_EVENT_POSITION ) { if( var_GetInteger( p_input, "state" ) != PLAYING_S ) @@ -286,7 +278,7 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance, p_mi = malloc( sizeof(libvlc_media_player_t) ); if( !p_mi ) { - libvlc_exception_raise( p_e, "Not enough memory" ); + libvlc_exception_raise( p_e, "not enough memory" ); return NULL; } p_mi->p_md = NULL; @@ -384,23 +376,14 @@ libvlc_media_player_new_from_media( **************************************************************************/ static void libvlc_media_player_destroy( libvlc_media_player_t *p_mi ) { - input_thread_t *p_input_thread; - libvlc_exception_t p_e; - assert( p_mi ); /* Detach Callback from the main libvlc object */ var_DelCallback( p_mi->p_libvlc_instance->p_libvlc_int, "vout-snapshottaken", SnapshotTakenCallback, p_mi ); - libvlc_exception_init( &p_e ); - p_input_thread = libvlc_get_input_thread( p_mi, &p_e ); - - if( libvlc_exception_raised( &p_e ) ) - /* no need to worry about no input thread */ - libvlc_exception_clear( &p_e ); - else - release_input_thread( p_mi, true ); + /* Realease the input thread */ + release_input_thread( p_mi, true ); libvlc_event_manager_release( p_mi->p_event_manager ); libvlc_media_release( p_mi->p_md ); @@ -494,12 +477,14 @@ libvlc_media_player_get_media( libvlc_media_player_t *p_mi, libvlc_exception_t *p_e ) { + libvlc_media_t *p_m; VLC_UNUSED(p_e); - if( !p_mi->p_md ) - return NULL; - - libvlc_media_retain( p_mi->p_md ); + vlc_mutex_lock( &p_mi->object_lock ); + p_m = p_mi->p_md; + if( p_m ) + libvlc_media_retain( p_mi->p_md ); + vlc_mutex_unlock( &p_mi->object_lock ); return p_mi->p_md; } @@ -588,18 +573,12 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi, var_Create( p_input_thread, "drawable-hwnd", VLC_VAR_ADDRESS ); if( p_mi->drawable.hwnd != NULL ) - { - vlc_value_t val = { .p_address = p_mi->drawable.hwnd }; - var_Set( p_input_thread, "drawable-hwnd", val ); - } + var_SetAddress( p_input_thread, "drawable-hwnd", p_mi->drawable.hwnd ); - var_Create( p_input_thread, "drawable-nsobject", VLC_VAR_ADDRESS ); + var_Create( p_input_thread, "drawable-nsobject", VLC_VAR_ADDRESS ); if( p_mi->drawable.nsobject != NULL ) - { - vlc_value_t val = { .p_address = p_mi->drawable.nsobject }; - var_Set( p_input_thread, "drawable-nsobject", val ); - } - + var_SetAddress( p_input_thread, "drawable-nsobject", p_mi->drawable.nsobject ); + var_AddCallback( p_input_thread, "can-seek", input_seekable_changed, p_mi ); var_AddCallback( p_input_thread, "can-pause", input_pausable_changed, p_mi ); var_AddCallback( p_input_thread, "intf-event", input_event_changed, p_mi ); @@ -663,7 +642,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi, { /* Send a stop notification event only if we are in playing, * buffering or paused states */ - libvlc_media_set_state( p_mi->p_md, libvlc_Ended, p_e ); + libvlc_media_set_state( p_mi->p_md, libvlc_Stopped, p_e ); /* Construct and send the event */ libvlc_event_t event; @@ -802,16 +781,16 @@ libvlc_time_t libvlc_media_player_get_length( libvlc_exception_t *p_e ) { input_thread_t *p_input_thread; - vlc_value_t val; + libvlc_time_t i_time; p_input_thread = libvlc_get_input_thread ( p_mi, p_e); if( !p_input_thread ) return -1; - var_Get( p_input_thread, "length", &val ); + i_time = var_GetTime( p_input_thread, "length" ); vlc_object_release( p_input_thread ); - return (val.i_time+500LL)/1000LL; + return (i_time+500LL)/1000LL; } libvlc_time_t libvlc_media_player_get_time( @@ -819,20 +798,20 @@ libvlc_time_t libvlc_media_player_get_time( libvlc_exception_t *p_e ) { input_thread_t *p_input_thread; - vlc_value_t val; + libvlc_time_t i_time; p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); if( !p_input_thread ) return -1; - var_Get( p_input_thread , "time", &val ); + i_time = var_GetTime( p_input_thread , "time" ); vlc_object_release( p_input_thread ); - return (val.i_time+500LL)/1000LL; + return (i_time+500LL)/1000LL; } void libvlc_media_player_set_time( libvlc_media_player_t *p_mi, - libvlc_time_t time, + libvlc_time_t i_time, libvlc_exception_t *p_e ) { input_thread_t *p_input_thread; @@ -841,7 +820,7 @@ void libvlc_media_player_set_time( if( !p_input_thread ) return; - var_SetTime( p_input_thread, "time", time*1000LL ); + var_SetTime( p_input_thread, "time", i_time*1000LL ); vlc_object_release( p_input_thread ); } @@ -1138,9 +1117,7 @@ libvlc_state_t libvlc_media_player_get_state( return state; } - var_Get( p_input_thread, "state", &val ); - state = vlc_to_libvlc_state(val.i_int); - + state = libvlc_media_get_state( p_mi->p_md, NULL ); if( state == libvlc_Playing ) { float caching; @@ -1196,7 +1173,7 @@ libvlc_track_description_t * malloc( sizeof( libvlc_track_description_t ) ); if ( !p_track_description ) { - libvlc_exception_raise( p_e, "no enough memory" ); + libvlc_exception_raise( p_e, "not enough memory" ); goto end; } p_actual = p_track_description; @@ -1210,7 +1187,7 @@ libvlc_track_description_t * if ( !p_actual ) { libvlc_track_description_release( p_track_description ); - libvlc_exception_raise( p_e, "no enough memory" ); + libvlc_exception_raise( p_e, "not enough memory" ); goto end; } }