X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fdbus.c;h=fe3b771a356b79e88601f56494b73df1dabdf2bc;hb=be84b46a573e5717204c0ac8d1a012a6c1140265;hp=b53f5d28006098eef82cb15a80d74750bc6ee763;hpb=13fac46da68e7c2218d0318014f33f2bbbf0a9fb;p=vlc diff --git a/modules/control/dbus.c b/modules/control/dbus.c index b53f5d2800..fe3b771a35 100644 --- a/modules/control/dbus.c +++ b/modules/control/dbus.c @@ -39,22 +39,24 @@ * Preamble *****************************************************************************/ -#include - -#include "dbus.h" - #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include +#include +#include "dbus.h" + +#include +#include #include #include #include #include #include -#include -#include + +#include + +#include /***************************************************************************** * Local prototypes. @@ -77,8 +79,8 @@ static int TrackListChangeEmit( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); static int GetInputMeta ( input_item_t *, DBusMessageIter * ); -static int MarshalStatus ( intf_thread_t *, DBusMessageIter *, vlc_bool_t ); -static int UpdateCaps( intf_thread_t* ); +static int MarshalStatus ( intf_thread_t *, DBusMessageIter *, bool ); +static int UpdateCaps( intf_thread_t*, bool ); /* GetCaps() capabilities */ enum @@ -96,22 +98,23 @@ enum struct intf_sys_t { DBusConnection *p_conn; - vlc_bool_t b_meta_read; + bool b_meta_read; dbus_int32_t i_caps; + bool b_dead; }; /***************************************************************************** * Module descriptor *****************************************************************************/ -vlc_module_begin(); - set_shortname( _("dbus")); - set_category( CAT_INTERFACE ); - set_subcategory( SUBCAT_INTERFACE_CONTROL ); - set_description( _("D-Bus control interface") ); - set_capability( "interface", 0 ); - set_callbacks( Open, Close ); -vlc_module_end(); +vlc_module_begin () + set_shortname( N_("dbus")) + set_category( CAT_INTERFACE ) + set_subcategory( SUBCAT_INTERFACE_CONTROL ) + set_description( N_("D-Bus control interface") ) + set_capability( "interface", 0 ) + set_callbacks( Open, Close ) +vlc_module_end () /***************************************************************************** * Methods @@ -122,13 +125,36 @@ vlc_module_end(); DBUS_METHOD( Quit ) { /* exits vlc */ REPLY_INIT; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); - playlist_Stop( p_playlist ); - pl_Release( ((vlc_object_t*) p_this) ); vlc_object_kill(((vlc_object_t*)p_this)->p_libvlc); REPLY_SEND; } +DBUS_METHOD( MprisVersion ) +{ /*implemented version of the mpris spec */ + REPLY_INIT; + OUT_ARGUMENTS; + VLC_UNUSED( p_this ); + dbus_uint16_t i_major = VLC_MPRIS_VERSION_MAJOR; + dbus_uint16_t i_minor = VLC_MPRIS_VERSION_MINOR; + DBusMessageIter version; + + if( !dbus_message_iter_open_container( &args, DBUS_TYPE_STRUCT, NULL, + &version ) ) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + if( !dbus_message_iter_append_basic( &version, DBUS_TYPE_UINT16, + &i_major ) ) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + if( !dbus_message_iter_append_basic( &version, DBUS_TYPE_UINT16, + &i_minor ) ) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + if( !dbus_message_iter_close_container( &args, &version ) ) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + REPLY_SEND; +} + DBUS_METHOD( PositionGet ) { /* returns position in milliseconds */ REPLY_INIT; @@ -136,9 +162,8 @@ DBUS_METHOD( PositionGet ) vlc_value_t position; dbus_int32_t i_pos; - playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) ); - PL_LOCK; - input_thread_t *p_input = p_playlist->p_input; + playlist_t *p_playlist = pl_Hold( ((vlc_object_t*) p_this) ); + input_thread_t *p_input = playlist_CurrentInput( p_playlist ); if( !p_input ) i_pos = 0; @@ -146,8 +171,8 @@ DBUS_METHOD( PositionGet ) { var_Get( p_input, "time", &position ); i_pos = position.i_time / 1000; + vlc_object_release( p_input ); } - PL_UNLOCK; pl_Release( ((vlc_object_t*) p_this) ); ADD_INT32( &i_pos ); REPLY_SEND; @@ -175,16 +200,15 @@ DBUS_METHOD( PositionSet ) dbus_error_free( &error ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - p_playlist = pl_Yield( ((vlc_object_t*) p_this) ); - PL_LOCK; - input_thread_t *p_input = p_playlist->p_input; + p_playlist = pl_Hold( ((vlc_object_t*) p_this) ); + input_thread_t *p_input = playlist_CurrentInput( p_playlist ); if( p_input ) { position.i_time = i_pos * 1000; var_Set( p_input, "time", position ); + vlc_object_release( p_input ); } - PL_UNLOCK; pl_Release( ((vlc_object_t*) p_this) ); REPLY_SEND; } @@ -197,7 +221,8 @@ DBUS_METHOD( VolumeGet ) audio_volume_t i_vol; /* 2nd argument of aout_VolumeGet is int32 */ aout_VolumeGet( (vlc_object_t*) p_this, &i_vol ); - i_dbus_vol = ( 100 * i_vol ) / AOUT_VOLUME_MAX; + double f_vol = 100. * i_vol / AOUT_VOLUME_MAX; + i_dbus_vol = round( f_vol ); ADD_INT32( &i_dbus_vol ); REPLY_SEND; } @@ -224,7 +249,8 @@ DBUS_METHOD( VolumeSet ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - i_vol = ( AOUT_VOLUME_MAX / 100 ) *i_dbus_vol; + double f_vol = AOUT_VOLUME_MAX * i_dbus_vol / 100.; + i_vol = round( f_vol ); aout_VolumeSet( (vlc_object_t*) p_this, i_vol ); REPLY_SEND; @@ -233,7 +259,7 @@ DBUS_METHOD( VolumeSet ) DBUS_METHOD( Next ) { /* next playlist item */ REPLY_INIT; - playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) ); + playlist_t *p_playlist = pl_Hold( ((vlc_object_t*) p_this) ); playlist_Next( p_playlist ); pl_Release( ((vlc_object_t*) p_this) ); REPLY_SEND; @@ -242,7 +268,7 @@ DBUS_METHOD( Next ) DBUS_METHOD( Prev ) { /* previous playlist item */ REPLY_INIT; - playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) ); + playlist_t *p_playlist = pl_Hold( ((vlc_object_t*) p_this) ); playlist_Prev( p_playlist ); pl_Release( ((vlc_object_t*) p_this) ); REPLY_SEND; @@ -251,7 +277,7 @@ DBUS_METHOD( Prev ) DBUS_METHOD( Stop ) { /* stop playing */ REPLY_INIT; - playlist_t *p_playlist = pl_Yield( ((vlc_object_t*) p_this) ); + playlist_t *p_playlist = pl_Hold( ((vlc_object_t*) p_this) ); playlist_Stop( p_playlist ); pl_Release( ((vlc_object_t*) p_this) ); REPLY_SEND; @@ -268,7 +294,7 @@ DBUS_METHOD( GetStatus ) REPLY_INIT; OUT_ARGUMENTS; - MarshalStatus( p_this, &args, VLC_TRUE ); + MarshalStatus( p_this, &args, true ); REPLY_SEND; } @@ -276,18 +302,29 @@ DBUS_METHOD( GetStatus ) DBUS_METHOD( Pause ) { REPLY_INIT; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); playlist_Pause( p_playlist ); - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); REPLY_SEND; } DBUS_METHOD( Play ) { REPLY_INIT; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); - playlist_Play( p_playlist ); - pl_Release( p_playlist ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); + + input_thread_t *p_input = playlist_CurrentInput( p_playlist ); + + if( p_input ) + { + double i_pos = 0; + input_Control( p_input, INPUT_SET_POSITION, i_pos ); + vlc_object_release( p_input ); + } + else + playlist_Play( p_playlist ); + + pl_Release( (vlc_object_t*) p_this ); REPLY_SEND; } @@ -295,12 +332,13 @@ DBUS_METHOD( GetCurrentMetadata ) { REPLY_INIT; OUT_ARGUMENTS; - playlist_t* p_playlist = pl_Yield( (vlc_object_t*) p_this ); + playlist_t* p_playlist = pl_Hold( (vlc_object_t*) p_this ); PL_LOCK; - if( p_playlist->status.p_item ) - GetInputMeta( p_playlist->status.p_item->p_input, &args ); + playlist_item_t* p_item = playlist_CurrentPlayingItem( p_playlist ); + if( p_item ) + GetInputMeta( p_item->p_input, &args ); PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); REPLY_SEND; } @@ -338,6 +376,7 @@ DBUS_METHOD( Identity ) DBUS_METHOD( AddTrack ) { /* add the string to the playlist, and play it if the boolean is true */ REPLY_INIT; + OUT_ARGUMENTS; DBusError error; dbus_error_init( &error ); @@ -359,11 +398,14 @@ DBUS_METHOD( AddTrack ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - p_playlist = pl_Yield( (vlc_object_t*) p_this ); + p_playlist = pl_Hold( (vlc_object_t*) p_this ); playlist_Add( p_playlist, psz_mrl, NULL, PLAYLIST_APPEND | ( ( b_play == TRUE ) ? PLAYLIST_GO : 0 ) , - PLAYLIST_END, VLC_TRUE, VLC_FALSE ); - pl_Release( p_playlist ); + PLAYLIST_END, true, false ); + pl_Release( (vlc_object_t*) p_this ); + + dbus_int32_t i_success = 0; + ADD_INT32( &i_success ); REPLY_SEND; } @@ -373,9 +415,9 @@ DBUS_METHOD( GetCurrentTrack ) REPLY_INIT; OUT_ARGUMENTS; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); dbus_int32_t i_position = p_playlist->i_current_index; - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); ADD_INT32( &i_position ); REPLY_SEND; @@ -390,7 +432,7 @@ DBUS_METHOD( GetMetadata ) dbus_int32_t i_position; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); PL_LOCK; dbus_message_get_args( p_from, &error, @@ -400,20 +442,20 @@ DBUS_METHOD( GetMetadata ) if( dbus_error_is_set( &error ) ) { PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); msg_Err( (vlc_object_t*) p_this, "D-Bus message reading : %s\n", error.message ); dbus_error_free( &error ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - if( i_position <= p_playlist->items.i_size / 2 ) + if( i_position < p_playlist->current.i_size ) { - GetInputMeta( p_playlist->items.p_elems[i_position*2-1]->p_input, &args ); + GetInputMeta( p_playlist->current.p_elems[i_position]->p_input, &args ); } PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); REPLY_SEND; } @@ -422,9 +464,9 @@ DBUS_METHOD( GetLength ) REPLY_INIT; OUT_ARGUMENTS; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); - dbus_int32_t i_elements = p_playlist->items.i_size / 2; - pl_Release( p_playlist ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); + dbus_int32_t i_elements = p_playlist->current.i_size; + pl_Release( (vlc_object_t*) p_this ); ADD_INT32( &i_elements ); REPLY_SEND; @@ -438,7 +480,7 @@ DBUS_METHOD( DelTrack ) dbus_error_init( &error ); dbus_int32_t i_position; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_this ); dbus_message_get_args( p_from, &error, DBUS_TYPE_INT32, &i_position, @@ -452,19 +494,21 @@ DBUS_METHOD( DelTrack ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - if( i_position <= p_playlist->items.i_size / 2 ) + PL_LOCK; + if( i_position < p_playlist->current.i_size ) { playlist_DeleteFromInput( p_playlist, - p_playlist->items.p_elems[i_position*2-1]->i_id, - VLC_FALSE ); + p_playlist->current.p_elems[i_position]->p_input->i_id, + pl_Locked ); } + PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( (vlc_object_t*) p_this ); REPLY_SEND; } -DBUS_METHOD( Loop ) +DBUS_METHOD( SetLoop ) { REPLY_INIT; OUT_ARGUMENTS; @@ -487,8 +531,8 @@ DBUS_METHOD( Loop ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - val.b_bool = ( b_loop == TRUE ) ? VLC_TRUE : VLC_FALSE ; - p_playlist = pl_Yield( (vlc_object_t*) p_this ); + val.b_bool = ( b_loop == TRUE ) ? true : false ; + p_playlist = pl_Hold( (vlc_object_t*) p_this ); var_Set ( p_playlist, "loop", val ); pl_Release( ((vlc_object_t*) p_this) ); @@ -518,16 +562,16 @@ DBUS_METHOD( Repeat ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - val.b_bool = ( b_repeat == TRUE ) ? VLC_TRUE : VLC_FALSE ; + val.b_bool = ( b_repeat == TRUE ) ? true : false ; - p_playlist = pl_Yield( (vlc_object_t*) p_this ); + p_playlist = pl_Hold( (vlc_object_t*) p_this ); var_Set ( p_playlist, "repeat", val ); pl_Release( ((vlc_object_t*) p_this) ); REPLY_SEND; } -DBUS_METHOD( Random ) +DBUS_METHOD( SetRandom ) { REPLY_INIT; OUT_ARGUMENTS; @@ -550,9 +594,9 @@ DBUS_METHOD( Random ) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } - val.b_bool = ( b_random == TRUE ) ? VLC_TRUE : VLC_FALSE ; + val.b_bool = ( b_random == TRUE ) ? true : false ; - p_playlist = pl_Yield( (vlc_object_t*) p_this ); + p_playlist = pl_Hold( (vlc_object_t*) p_this ); var_Set ( p_playlist, "random", val ); pl_Release( ((vlc_object_t*) p_this) ); @@ -607,6 +651,8 @@ DBUS_METHOD( handle_root ) /* here D-Bus method's names are associated to an handler */ METHOD_FUNC( "Identity", Identity ); + METHOD_FUNC( "MprisVersion", MprisVersion ); + METHOD_FUNC( "Quit", Quit ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -622,7 +668,6 @@ DBUS_METHOD( handle_player ) METHOD_FUNC( "Prev", Prev ); METHOD_FUNC( "Next", Next ); - METHOD_FUNC( "Quit", Quit ); METHOD_FUNC( "Stop", Stop ); METHOD_FUNC( "Play", Play ); METHOD_FUNC( "Pause", Pause ); @@ -651,8 +696,8 @@ DBUS_METHOD( handle_tracklist ) METHOD_FUNC( "GetLength", GetLength ); METHOD_FUNC( "AddTrack", AddTrack ); METHOD_FUNC( "DelTrack", DelTrack ); - METHOD_FUNC( "Loop", Loop ); - METHOD_FUNC( "Random", Random ); + METHOD_FUNC( "SetLoop", SetLoop ); + METHOD_FUNC( "SetRandom", SetRandom ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -672,8 +717,9 @@ static int Open( vlc_object_t *p_this ) if( !p_sys ) return VLC_ENOMEM; - p_sys->b_meta_read = VLC_FALSE; + p_sys->b_meta_read = false; p_sys->i_caps = CAPS_NONE; + p_sys->b_dead = false; dbus_error_init( &error ); @@ -709,7 +755,7 @@ static int Open( vlc_object_t *p_this ) dbus_connection_flush( p_conn ); - p_playlist = pl_Yield( p_intf ); + p_playlist = pl_Hold( p_intf ); PL_LOCK; var_AddCallback( p_playlist, "playlist-current", TrackChange, p_intf ); var_AddCallback( p_playlist, "intf-change", TrackListChangeEmit, p_intf ); @@ -719,13 +765,13 @@ static int Open( vlc_object_t *p_this ) var_AddCallback( p_playlist, "repeat", StatusChangeEmit, p_intf ); var_AddCallback( p_playlist, "loop", StatusChangeEmit, p_intf ); PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); p_intf->pf_run = Run; p_intf->p_sys = p_sys; p_sys->p_conn = p_conn; - UpdateCaps( p_intf ); + UpdateCaps( p_intf, false ); return VLC_SUCCESS; } @@ -737,12 +783,9 @@ static int Open( vlc_object_t *p_this ) static void Close ( vlc_object_t *p_this ) { intf_thread_t *p_intf = (intf_thread_t*) p_this; - playlist_t *p_playlist = pl_Yield( p_intf );; + playlist_t *p_playlist = pl_Hold( p_intf );; input_thread_t *p_input; - p_this->b_dead = VLC_TRUE; - - PL_LOCK; var_DelCallback( p_playlist, "playlist-current", TrackChange, p_intf ); var_DelCallback( p_playlist, "intf-change", TrackListChangeEmit, p_intf ); var_DelCallback( p_playlist, "item-append", TrackListChangeEmit, p_intf ); @@ -751,16 +794,14 @@ static void Close ( vlc_object_t *p_this ) var_DelCallback( p_playlist, "repeat", StatusChangeEmit, p_intf ); var_DelCallback( p_playlist, "loop", StatusChangeEmit, p_intf ); - p_input = p_playlist->p_input; + p_input = playlist_CurrentInput( p_playlist ); if ( p_input ) { - vlc_object_yield( p_input ); var_DelCallback( p_input, "state", StateChange, p_intf ); vlc_object_release( p_input ); } - PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); dbus_connection_unref( p_intf->p_sys->p_conn ); @@ -773,10 +814,12 @@ static void Close ( vlc_object_t *p_this ) static void Run ( intf_thread_t *p_intf ) { - while( !intf_ShouldDie( p_intf ) ) + for( ;; ) { msleep( INTF_IDLE_SLEEP ); + int canc = vlc_savecancel(); dbus_connection_read_write_dispatch( p_intf->p_sys->p_conn, 0 ); + vlc_restorecancel( canc ); } } @@ -800,9 +843,9 @@ DBUS_SIGNAL( TrackListChangeSignal ) SIGNAL_INIT("TrackListChange"); OUT_ARGUMENTS; - playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_data ); - dbus_int32_t i_elements = p_playlist->items.i_size / 2; - pl_Release( p_playlist ); + playlist_t *p_playlist = pl_Hold( (vlc_object_t*) p_data ); + dbus_int32_t i_elements = p_playlist->current.i_size; + pl_Release( (vlc_object_t*) p_data ); ADD_INT32( &i_elements ); SIGNAL_SEND; @@ -824,7 +867,7 @@ static int TrackListChangeEmit( vlc_object_t *p_this, const char *psz_var, playlist_t *p_playlist = (playlist_t*)p_this; playlist_add_t *p_add = newval.p_address; playlist_item_t *p_item; - p_item = playlist_ItemGetById( p_playlist, p_add->i_node, VLC_TRUE ); + p_item = playlist_ItemGetById( p_playlist, p_add->i_node, pl_Locked ); assert( p_item ); while( p_item->p_parent ) p_item = p_item->p_parent; @@ -832,11 +875,10 @@ static int TrackListChangeEmit( vlc_object_t *p_this, const char *psz_var, return VLC_SUCCESS; } - if( p_intf->b_dead ) + if( p_intf->p_sys->b_dead ) return VLC_SUCCESS; - /* We're called from the playlist, so that would cause locking issues */ - /* UpdateCaps( p_intf ); */ + UpdateCaps( p_intf, true ); TrackListChangeSignal( p_intf->p_sys->p_conn, p_data ); return VLC_SUCCESS; } @@ -866,7 +908,7 @@ DBUS_SIGNAL( StatusChangeSignal ) /* we're called from a callback of input_thread_t, so it can not be * destroyed before we return */ - MarshalStatus( (intf_thread_t*) p_data, &args, VLC_FALSE ); + MarshalStatus( (intf_thread_t*) p_data, &args, false ); SIGNAL_SEND; } @@ -881,17 +923,17 @@ static int StateChange( vlc_object_t *p_this, const char* psz_var, intf_thread_t *p_intf = ( intf_thread_t* ) p_data; intf_sys_t *p_sys = p_intf->p_sys; - if( p_intf->b_dead ) + if( p_intf->p_sys->b_dead ) return VLC_SUCCESS; - UpdateCaps( p_intf ); + UpdateCaps( p_intf, true ); if( !p_sys->b_meta_read && newval.i_int == PLAYING_S ) { input_item_t *p_item = input_GetItem( (input_thread_t*)p_this ); if( p_item ) { - p_sys->b_meta_read = VLC_TRUE; + p_sys->b_meta_read = true; TrackChangeSignal( p_sys->p_conn, p_item ); } } @@ -915,10 +957,10 @@ static int StatusChangeEmit( vlc_object_t *p_this, const char *psz_var, VLC_UNUSED(oldval); VLC_UNUSED(newval); intf_thread_t *p_intf = p_data; - if( p_intf->b_dead ) + if( p_intf->p_sys->b_dead ) return VLC_SUCCESS; - UpdateCaps( p_intf ); + UpdateCaps( p_intf, false ); StatusChangeSignal( p_intf->p_sys->p_conn, p_data ); return VLC_SUCCESS; } @@ -937,25 +979,20 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var, VLC_UNUSED( p_this ); VLC_UNUSED( psz_var ); VLC_UNUSED( oldval ); VLC_UNUSED( newval ); - if( p_intf->b_dead ) + if( p_intf->p_sys->b_dead ) return VLC_SUCCESS; - p_sys->b_meta_read = VLC_FALSE; - - p_playlist = pl_Yield( p_intf ); - PL_LOCK; - p_input = p_playlist->p_input; + p_sys->b_meta_read = false; + p_playlist = pl_Hold( p_intf ); + p_input = playlist_CurrentInput( p_playlist ); if( !p_input ) { - PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); return VLC_SUCCESS; } - vlc_object_yield( p_input ); - PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); p_item = input_GetItem( p_input ); if( !p_item ) @@ -966,7 +1003,7 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var, if( input_item_IsPreparsed( p_item ) ) { - p_sys->b_meta_read = VLC_TRUE; + p_sys->b_meta_read = true; TrackChangeSignal( p_sys->p_conn, p_item ); } @@ -979,48 +1016,37 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var, /***************************************************************************** * UpdateCaps: update p_sys->i_caps ****************************************************************************/ -static int UpdateCaps( intf_thread_t* p_intf ) +static int UpdateCaps( intf_thread_t* p_intf, bool b_playlist_locked ) { + intf_sys_t* p_sys = p_intf->p_sys; dbus_int32_t i_caps = CAPS_CAN_HAS_TRACKLIST; - playlist_t* p_playlist = pl_Yield( (vlc_object_t*)p_intf ); - PL_LOCK; + playlist_t* p_playlist = pl_Hold( p_intf ); + if( !b_playlist_locked ) PL_LOCK; - if( p_playlist->items.i_size > 0 ) + if( p_playlist->current.i_size > 0 ) i_caps |= CAPS_CAN_PLAY | CAPS_CAN_GO_PREV | CAPS_CAN_GO_NEXT; + if( !b_playlist_locked ) PL_UNLOCK; - if( p_playlist->p_input ) + input_thread_t* p_input = playlist_CurrentInput( p_playlist ); + if( p_input ) { - access_t *p_access = (access_t*)vlc_object_find( p_playlist->p_input, - VLC_OBJECT_ACCESS, FIND_CHILD ); - if( p_access ) - { - vlc_bool_t b_can_pause; - if( !access2_Control( p_access, ACCESS_CAN_PAUSE, &b_can_pause ) && - b_can_pause ) - i_caps |= CAPS_CAN_PAUSE; - vlc_object_release( p_access ); - } - demux_t *p_demux = (demux_t*)vlc_object_find( p_playlist->p_input, - VLC_OBJECT_DEMUX, FIND_CHILD ); - if( p_demux ) - { /* XXX: is: demux can seek and access can not a possibility ? */ - vlc_bool_t b_can_seek; - if( !stream_Control( p_demux->s, STREAM_CAN_SEEK, &b_can_seek ) && - b_can_seek ) - i_caps |= CAPS_CAN_SEEK; - vlc_object_release( p_demux ); - } + /* XXX: if UpdateCaps() is called too early, these are + * unconditionnaly true */ + if( var_GetBool( p_input, "can-pause" ) ) + i_caps |= CAPS_CAN_PAUSE; + if( var_GetBool( p_input, "can-seek" ) ) + i_caps |= CAPS_CAN_SEEK; + vlc_object_release( p_input ); } - PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); - if( p_intf->p_sys->b_meta_read ) + if( p_sys->b_meta_read ) i_caps |= CAPS_CAN_PROVIDE_METADATA; if( i_caps != p_intf->p_sys->i_caps ) { - p_intf->p_sys->i_caps = i_caps; + p_sys->i_caps = i_caps; CapsChangeSignal( p_intf->p_sys->p_conn, (vlc_object_t*)p_intf ); } @@ -1066,7 +1092,7 @@ static int GetInputMeta( input_item_t* p_input, "title", "artist", "genre", "copyright", "album", "tracknum", "description", "rating", "date", "setting", "url", "language", "nowplaying", "publisher", "encodedby", "arturl", "trackid", - "status", "URI", "length", "video-codec", "audio-codec", + "status", "location", "length", "video-codec", "audio-codec", "video-bitrate", "audio-bitrate", "audio-samplerate" }; @@ -1110,7 +1136,7 @@ static int GetInputMeta( input_item_t* p_input, *****************************************************************************/ static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args, - vlc_bool_t lock ) + bool lock ) { /* This is NOT the right way to do that, it would be better to sore the status information in p_sys and update it on change, thus avoiding a long lock */ @@ -1121,13 +1147,11 @@ static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args, playlist_t* p_playlist = NULL; input_thread_t* p_input = NULL; - p_playlist = pl_Yield( (vlc_object_t*) p_intf ); - if( lock ) - PL_LOCK; + p_playlist = pl_Hold( p_intf ); i_state = 2; - p_input = p_playlist->p_input; + p_input = playlist_CurrentInput( p_playlist ); if( p_input ) { var_Get( p_input, "state", &val ); @@ -1137,20 +1161,16 @@ static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args, i_state = 1; else if( val.i_int <= PLAYING_S ) i_state = 0; + vlc_object_release( p_input ); } - var_Get( p_playlist, "random", &val ); - i_random = val.i_int; + i_random = var_CreateGetBool( p_playlist, "random" ); - var_Get( p_playlist, "repeat", &val ); - i_repeat = val.i_int; + i_repeat = var_CreateGetBool( p_playlist, "repeat" ); - var_Get( p_playlist, "loop", &val ); - i_loop = val.i_int; + i_loop = var_CreateGetBool( p_playlist, "loop" ); - if( lock ) - PL_UNLOCK; - pl_Release( p_playlist ); + pl_Release( p_intf ); dbus_message_iter_open_container( args, DBUS_TYPE_STRUCT, NULL, &status ); dbus_message_iter_append_basic( &status, DBUS_TYPE_INT32, &i_state );