X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fcontrol%2Fmedia_player.c;h=6ae4b41b54cdb06efc06ca6ada5ebab6bbf1632b;hb=0392f8be2186d67ae86e9fdc1f809af34e623352;hp=b2ee0962012b2be6df0235c49a91c01444d2826e;hpb=1361fddf71b42c85660bd37e06b87d01f2aa26bf;p=vlc diff --git a/src/control/media_player.c b/src/control/media_player.c index b2ee096201..6ae4b41b54 100644 --- a/src/control/media_player.c +++ b/src/control/media_player.c @@ -69,7 +69,7 @@ static inline libvlc_state_t vlc_to_libvlc_state( int vlc_state ) * * Object lock is NOT held. */ -static void release_input_thread( libvlc_media_player_t *p_mi ) +static void release_input_thread( libvlc_media_player_t *p_mi, bool b_input_abort ) { input_thread_t * p_input_thread; @@ -89,11 +89,12 @@ static void release_input_thread( libvlc_media_player_t *p_mi ) input_event_changed, p_mi ); /* We owned this one */ - input_StopThread( p_input_thread ); + input_StopThread( p_input_thread, b_input_abort ); vlc_thread_join( p_input_thread ); var_Destroy( p_input_thread, "drawable-hwnd" ); var_Destroy( p_input_thread, "drawable-xid" ); + var_Destroy( p_input_thread, "drawable-agl" ); } vlc_object_release( p_input_thread ); @@ -215,7 +216,7 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd, return VLC_SUCCESS; } - libvlc_media_set_state( p_mi->p_md, libvlc_state, NULL); + 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_TIMES ) @@ -274,6 +275,7 @@ libvlc_media_player_new( libvlc_instance_t * p_libvlc_instance, return NULL; } p_mi->p_md = NULL; + p_mi->drawable.agl = 0; p_mi->drawable.xid = 0; p_mi->drawable.hwnd = NULL; p_mi->p_libvlc_instance = p_libvlc_instance; @@ -455,7 +457,7 @@ void libvlc_media_player_release( libvlc_media_player_t *p_mi ) vlc_mutex_unlock( &p_mi->object_lock ); vlc_mutex_destroy( &p_mi->object_lock ); - release_input_thread( p_mi ); + release_input_thread( p_mi, true ); libvlc_event_manager_release( p_mi->p_event_manager ); @@ -494,7 +496,12 @@ void libvlc_media_player_set_media( vlc_mutex_lock( &p_mi->object_lock ); - release_input_thread( p_mi ); + /* FIXME I am not sure if it is a user request or on die(eof/error) + * request here */ + release_input_thread( p_mi, + p_mi->p_input_thread && + !p_mi->p_input_thread->b_eof && + !p_mi->p_input_thread->b_error ); if( p_mi->p_md ) libvlc_media_set_state( p_mi->p_md, libvlc_NothingSpecial, p_e ); @@ -602,7 +609,6 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi, p_mi->p_input_thread = input_CreateThread( p_mi->p_libvlc_instance->p_libvlc_int, p_mi->p_md->p_input_item ); - if( !p_mi->p_input_thread ) { vlc_mutex_unlock( &p_mi->object_lock ); @@ -611,6 +617,10 @@ void libvlc_media_player_play( libvlc_media_player_t *p_mi, p_input_thread = p_mi->p_input_thread; + var_Create( p_input_thread, "drawable-agl", VLC_VAR_INTEGER ); + if( p_mi->drawable.agl ) + var_SetInteger( p_input_thread, "drawable-agl", p_mi->drawable.agl ); + var_Create( p_input_thread, "drawable-xid", VLC_VAR_INTEGER ); if( p_mi->drawable.xid ) var_SetInteger( p_input_thread, "drawable-xid", p_mi->drawable.xid ); @@ -666,12 +676,17 @@ int libvlc_media_player_is_playing( libvlc_media_player_t *p_mi, input_thread_t * p_input_thread = libvlc_get_input_thread( p_mi, p_e ); if( !p_input_thread ) + { + /* We do return the right value, no need to throw an exception */ + if( libvlc_exception_raised( p_e ) ) + libvlc_exception_clear( p_e ); return 0; + } libvlc_state_t state = libvlc_media_player_get_state( p_mi, p_e ); vlc_object_release( p_input_thread ); - + if( state == libvlc_Playing ) { return 1; @@ -690,7 +705,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi, if( state == libvlc_Playing || state == libvlc_Paused ) { - /* Send a stop notification event only of we are in playing or + /* Send a stop notification event only if we are in playing or * paused states */ libvlc_media_set_state( p_mi->p_md, libvlc_Ended, p_e ); @@ -703,7 +718,7 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi, if( p_mi->b_own_its_input_thread ) { vlc_mutex_lock( &p_mi->object_lock ); - release_input_thread( p_mi ); /* This will stop the input thread */ + release_input_thread( p_mi, true ); /* This will stop the input thread */ vlc_mutex_unlock( &p_mi->object_lock ); } else @@ -713,11 +728,31 @@ void libvlc_media_player_stop( libvlc_media_player_t *p_mi, if( !p_input_thread ) return; - input_StopThread( p_input_thread ); + input_StopThread( p_input_thread, true ); vlc_object_release( p_input_thread ); + p_mi->p_input_thread = NULL; } } +/************************************************************************** + * set_agl + **************************************************************************/ +void libvlc_media_player_set_agl( libvlc_media_player_t *p_mi, + uint32_t drawable, + libvlc_exception_t *p_e ) +{ + (void) p_e; + p_mi->drawable.agl = drawable; +} + +/************************************************************************** + * get_agl + **************************************************************************/ +uint32_t libvlc_media_player_get_agl( libvlc_media_player_t *p_mi ) +{ + return p_mi->drawable.agl; +} + /************************************************************************** * set_xwindow **************************************************************************/ @@ -768,6 +803,8 @@ void libvlc_media_player_set_drawable( libvlc_media_player_t *p_mi, p_mi->drawable.hwnd = (HWND)drawable; else libvlc_exception_raise(p_e, "Operation not supported"); +#elif defined(__APPLE__) + p_mi->drawable.agl = drawable; #else p_mi->drawable.xid = drawable; #endif @@ -787,6 +824,8 @@ libvlc_media_player_get_drawable ( libvlc_media_player_t *p_mi, return (libvlc_drawable_t)p_mi->drawable.hwnd; else return 0; +#elif defined(__APPLE__) + return p_mi->drawable.agl; #else return p_mi->drawable.xid; #endif @@ -1092,15 +1131,12 @@ void libvlc_media_player_set_rate( vlc_value_t val; bool b_can_rewind; - if( rate != 0 ) - RAISEVOID( "Rate value is invalid" ); - - p_input_thread = libvlc_get_input_thread ( p_mi, p_e); + p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); if( !p_input_thread ) return; b_can_rewind = var_GetBool( p_input_thread, "can-rewind" ); - if( (rate < 0) && !b_can_rewind ) + if( (rate < 0.0) && !b_can_rewind ) { vlc_object_release( p_input_thread ); libvlc_exception_raise( p_e, "Rate value is invalid" ); @@ -1141,21 +1177,30 @@ libvlc_state_t libvlc_media_player_get_state( libvlc_exception_t *p_e ) { input_thread_t *p_input_thread; + libvlc_state_t state = libvlc_Ended; vlc_value_t val; p_input_thread = libvlc_get_input_thread ( p_mi, p_e ); - if ( !p_input_thread ) + if( !p_input_thread ) { /* We do return the right value, no need to throw an exception */ if( libvlc_exception_raised( p_e ) ) libvlc_exception_clear( p_e ); - return libvlc_Ended; + return state; } var_Get( p_input_thread, "state", &val ); - vlc_object_release( p_input_thread ); + state = vlc_to_libvlc_state(val.i_int); - return vlc_to_libvlc_state(val.i_int); + if( state == libvlc_Playing ) + { + float caching; + caching = var_GetFloat( p_input_thread, "cache" ); + if( caching > 0.0 && caching < 1.0 ) + state = libvlc_Buffering; + } + vlc_object_release( p_input_thread ); + return state; } int libvlc_media_player_is_seekable( libvlc_media_player_t *p_mi,