X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcontrol%2Fdbus.c;h=64218720874beea7affd581d6b7f4c1fad1e63c8;hb=e783b74eca272d40c90c1bf3982894e074f11808;hp=9d4f0fbfa7aa97143ef95a865b66de47c4f4fb1c;hpb=df61d33b06e2b3cbbe746b2f5a9bea5b370c24ff;p=vlc diff --git a/modules/control/dbus.c b/modules/control/dbus.c index 9d4f0fbfa7..6421872087 100644 --- a/modules/control/dbus.c +++ b/modules/control/dbus.c @@ -47,13 +47,18 @@ # include "config.h" #endif -#include +#include +#include #include #include #include #include #include +#include + +#include + /***************************************************************************** * Local prototypes. *****************************************************************************/ @@ -103,10 +108,10 @@ struct intf_sys_t *****************************************************************************/ vlc_module_begin(); - set_shortname( _("dbus")); + set_shortname( N_("dbus")); set_category( CAT_INTERFACE ); set_subcategory( SUBCAT_INTERFACE_CONTROL ); - set_description( _("D-Bus control interface") ); + set_description( N_("D-Bus control interface") ); set_capability( "interface", 0 ); set_callbacks( Open, Close ); vlc_module_end(); @@ -221,7 +226,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; } @@ -248,7 +254,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; @@ -310,7 +317,22 @@ DBUS_METHOD( Play ) { REPLY_INIT; playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); - playlist_Play( p_playlist ); + + PL_LOCK; + input_thread_t *p_input = p_playlist->p_input; + if( p_input ) + vlc_object_yield( p_input ); + PL_UNLOCK; + + 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( p_playlist ); REPLY_SEND; } @@ -362,6 +384,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 ); @@ -389,6 +412,9 @@ DBUS_METHOD( AddTrack ) PLAYLIST_END, true, false ); pl_Release( p_playlist ); + dbus_int32_t i_success = 0; + ADD_INT32( &i_success ); + REPLY_SEND; } @@ -431,9 +457,9 @@ DBUS_METHOD( GetMetadata ) 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; @@ -447,7 +473,7 @@ DBUS_METHOD( GetLength ) OUT_ARGUMENTS; playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_this ); - dbus_int32_t i_elements = p_playlist->items.i_size / 2; + dbus_int32_t i_elements = p_playlist->current.i_size; pl_Release( p_playlist ); ADD_INT32( &i_elements ); @@ -476,19 +502,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, - false ); + p_playlist->current.p_elems[i_position]->p_input->i_id, + true ); } + PL_UNLOCK; pl_Release( p_playlist ); REPLY_SEND; } -DBUS_METHOD( Loop ) +DBUS_METHOD( SetLoop ) { REPLY_INIT; OUT_ARGUMENTS; @@ -551,7 +579,7 @@ DBUS_METHOD( Repeat ) REPLY_SEND; } -DBUS_METHOD( Random ) +DBUS_METHOD( SetRandom ) { REPLY_INIT; OUT_ARGUMENTS; @@ -632,6 +660,7 @@ DBUS_METHOD( handle_root ) METHOD_FUNC( "Identity", Identity ); METHOD_FUNC( "MprisVersion", MprisVersion ); + METHOD_FUNC( "Quit", Quit ); return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } @@ -647,7 +676,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 ); @@ -676,8 +704,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; } @@ -826,7 +854,7 @@ DBUS_SIGNAL( TrackListChangeSignal ) OUT_ARGUMENTS; playlist_t *p_playlist = pl_Yield( (vlc_object_t*) p_data ); - dbus_int32_t i_elements = p_playlist->items.i_size / 2; + dbus_int32_t i_elements = p_playlist->current.i_size; pl_Release( p_playlist ); ADD_INT32( &i_elements ); @@ -908,7 +936,7 @@ static int StateChange( vlc_object_t *p_this, const char* psz_var, if( p_intf->b_dead ) return VLC_SUCCESS; - UpdateCaps( p_intf, false ); + UpdateCaps( p_intf, true ); if( !p_sys->b_meta_read && newval.i_int == PLAYING_S ) { @@ -967,7 +995,6 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var, p_sys->b_meta_read = false; p_playlist = pl_Yield( p_intf ); - PL_LOCK; p_input = p_playlist->p_input; if( !p_input ) @@ -978,7 +1005,6 @@ static int TrackChange( vlc_object_t *p_this, const char *psz_var, } vlc_object_yield( p_input ); - PL_UNLOCK; pl_Release( p_playlist ); p_item = input_GetItem( p_input ); @@ -1010,7 +1036,7 @@ static int UpdateCaps( intf_thread_t* p_intf, bool b_playlist_locked ) playlist_t* p_playlist = pl_Yield( (vlc_object_t*)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( p_playlist->p_input ) @@ -1077,7 +1103,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" }; @@ -1150,14 +1176,11 @@ static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args, i_state = 0; } - 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;