* Preamble
*****************************************************************************/
-#include <dbus/dbus.h>
-
-#include "dbus.h"
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <dbus/dbus.h>
+#include "dbus.h"
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
#include <vlc_aout.h>
#include <vlc_interface.h>
#include <vlc_meta.h>
#include <math.h>
+#include <assert.h>
+
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
DBusConnection *p_conn;
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
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;
}
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;
{
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;
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;
}
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;
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;
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;
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;
}
{
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;
}
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 );
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, true, false );
- pl_Release( p_playlist );
+ pl_Release( (vlc_object_t*) p_this );
+
+ dbus_int32_t i_success = 0;
+ ADD_INT32( &i_success );
REPLY_SEND;
}
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;
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,
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;
}
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;
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,
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,
+ pl_Locked );
}
+ PL_UNLOCK;
- pl_Release( p_playlist );
+ pl_Release( (vlc_object_t*) p_this );
REPLY_SEND;
}
}
val.b_bool = ( b_loop == 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, "loop", val );
pl_Release( ((vlc_object_t*) p_this) );
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) );
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) );
p_sys->b_meta_read = false;
p_sys->i_caps = CAPS_NONE;
+ p_sys->b_dead = false;
dbus_error_init( &error );
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 );
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;
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 = 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 );
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 );
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 );
}
}
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;
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, 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;
return VLC_SUCCESS;
}
- if( p_intf->b_dead )
+ if( p_intf->p_sys->b_dead )
return VLC_SUCCESS;
UpdateCaps( p_intf, true );
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, true );
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, false );
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 = false;
- p_playlist = pl_Yield( p_intf );
- p_input = p_playlist->p_input;
-
+ 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_Release( p_playlist );
+ pl_Release( p_intf );
p_item = input_GetItem( p_input );
if( !p_item )
{
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 );
+ 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 )
{
/* XXX: if UpdateCaps() is called too early, these are
* unconditionnaly true */
- if( var_GetBool( p_playlist->p_input, "can-pause" ) )
+ if( var_GetBool( p_input, "can-pause" ) )
i_caps |= CAPS_CAN_PAUSE;
- if( var_GetBool( p_playlist->p_input, "seekable" ) )
+ if( var_GetBool( p_input, "can-seek" ) )
i_caps |= CAPS_CAN_SEEK;
+ vlc_object_release( p_input );
}
- if( !b_playlist_locked ) PL_UNLOCK;
- pl_Release( p_playlist );
+ pl_Release( p_intf );
if( p_sys->b_meta_read )
i_caps |= CAPS_CAN_PROVIDE_METADATA;
"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"
};
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 );
i_state = 1;
else if( val.i_int <= PLAYING_S )
i_state = 0;
+ vlc_object_release( p_input );
}
i_random = var_CreateGetBool( p_playlist, "random" );
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 );