[vlc-devel] commit: dbus: fix another locking problem. ( Rémi Duraffort )
git version control
git at videolan.org
Sat Mar 21 08:59:50 CET 2009
vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Sat Mar 21 08:54:39 2009 +0100| [cccd154d86cbf26348603534f20b80472d39d81e] | committer: Rémi Duraffort
dbus: fix another locking problem.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cccd154d86cbf26348603534f20b80472d39d81e
---
modules/control/dbus.c | 52 +++++++++++++++++++++++++++++++----------------
1 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/modules/control/dbus.c b/modules/control/dbus.c
index a007daf..c86e918 100644
--- a/modules/control/dbus.c
+++ b/modules/control/dbus.c
@@ -65,9 +65,7 @@ static int Open ( vlc_object_t * );
static void Close ( vlc_object_t * );
static void Run ( intf_thread_t * );
-static int StateChange( vlc_object_t *, const char *, vlc_value_t,
- vlc_value_t, void * );
-
+static int StateChange( intf_thread_t *, int );
static int TrackChange( intf_thread_t * );
static int StatusChangeEmit( intf_thread_t *);
static int TrackListChangeEmit( intf_thread_t *, int, int );
@@ -118,6 +116,7 @@ typedef struct
{
int signal;
int i_node;
+ int i_input_state;
} callback_info_t;
@@ -808,7 +807,7 @@ static void Close ( vlc_object_t *p_this )
p_input = playlist_CurrentInput( p_playlist );
if ( p_input )
{
- var_DelCallback( p_input, "state", StateChange, p_intf );
+ var_DelCallback( p_input, "state", AllCallback, p_intf );
vlc_object_release( p_input );
}
@@ -853,6 +852,9 @@ static void Run ( intf_thread_t *p_intf )
case SIGNAL_LOOP:
StatusChangeEmit( p_intf );
break;
+ case SIGNAL_STATE:
+ StateChange( p_intf, info->i_input_state );
+ break;
default:
assert(0);
}
@@ -895,6 +897,11 @@ static int AllCallback( vlc_object_t *p_this, const char *psz_var,
info->signal = SIGNAL_REPEAT;
else if( !strcmp( "loop", psz_var ) )
info->signal = SIGNAL_LOOP;
+ else if( !strcmp( "state", psz_var ) )
+ {
+ info->signal = SIGNAL_STATE;
+ info->i_input_state = newval.i_int;
+ }
else
assert(0);
@@ -1000,32 +1007,41 @@ DBUS_SIGNAL( StatusChangeSignal )
/*****************************************************************************
* StateChange: callback on input "state"
*****************************************************************************/
-static int StateChange( vlc_object_t *p_this, const char* psz_var,
- vlc_value_t oldval, vlc_value_t newval, void *p_data )
+//static int StateChange( vlc_object_t *p_this, const char* psz_var,
+// vlc_value_t oldval, vlc_value_t newval, void *p_data )
+static int StateChange( intf_thread_t *p_intf, int i_input_state )
{
- VLC_UNUSED(psz_var); VLC_UNUSED(oldval);
- intf_thread_t *p_intf = ( intf_thread_t* ) p_data;
intf_sys_t *p_sys = p_intf->p_sys;
+ playlist_t *p_playlist;
+ input_thread_t *p_input;
+ input_item_t *p_item;
if( p_intf->p_sys->b_dead )
return VLC_SUCCESS;
- UpdateCaps( p_intf, true );
+ UpdateCaps( p_intf, pl_Unlocked );
- if( !p_sys->b_meta_read && newval.i_int == PLAYING_S )
+ if( !p_sys->b_meta_read && i_input_state == PLAYING_S )
{
- input_item_t *p_item = input_GetItem( (input_thread_t*)p_this );
- if( p_item )
+ p_playlist = pl_Hold( p_intf );
+ p_input = playlist_CurrentInput( p_playlist );
+ if( p_input )
{
- p_sys->b_meta_read = true;
- TrackChangeSignal( p_sys->p_conn, p_item );
+ p_item = input_GetItem( p_input );
+ if( p_item )
+ {
+ p_sys->b_meta_read = true;
+ TrackChangeSignal( p_sys->p_conn, p_item );
+ }
+ vlc_object_release( p_input );
}
+ pl_Release( p_intf );
}
- if( newval.i_int == PLAYING_S || newval.i_int == PAUSE_S ||
- newval.i_int == END_S )
+ if( i_input_state == PLAYING_S || i_input_state == PAUSE_S ||
+ i_input_state == END_S )
{
- StatusChangeSignal( p_sys->p_conn, (void*) p_intf );
+ StatusChangeSignal( p_sys->p_conn, p_intf );
}
return VLC_SUCCESS;
@@ -1082,7 +1098,7 @@ static int TrackChange( intf_thread_t *p_intf )
TrackChangeSignal( p_sys->p_conn, p_item );
}
- var_AddCallback( p_input, "state", StateChange, p_intf );
+ var_AddCallback( p_input, "state", AllCallback, p_intf );
vlc_object_release( p_input );
return VLC_SUCCESS;
More information about the vlc-devel
mailing list