From 96067e4922878b125f86509a83c3495670bcb450 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C3=ABl=20Carr=C3=A9?= Date: Mon, 12 Jul 2010 17:32:41 +0200 Subject: [PATCH] dbus: monitor input state change through "intf-event" End of playlist is still not notified --- modules/control/dbus/dbus.c | 39 ++++++++++++++++-------------- modules/control/dbus/dbus_common.h | 1 + modules/control/dbus/dbus_player.c | 19 +++------------ 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/modules/control/dbus/dbus.c b/modules/control/dbus/dbus.c index afc7fa68ba..9fe72e6235 100644 --- a/modules/control/dbus/dbus.c +++ b/modules/control/dbus/dbus.c @@ -67,7 +67,7 @@ static int Open ( vlc_object_t * ); static void Close ( vlc_object_t * ); static void Run ( intf_thread_t * ); -static int StateChange( intf_thread_t *, int ); +static int StateChange( intf_thread_t * ); static int TrackChange( intf_thread_t * ); static int AllCallback( vlc_object_t*, const char*, vlc_value_t, vlc_value_t, void* ); @@ -75,7 +75,6 @@ typedef struct { int signal; int i_node; - int i_input_state; } callback_info_t; /***************************************************************************** @@ -117,6 +116,7 @@ static int Open( vlc_object_t *p_this ) p_sys->i_caps = CAPS_NONE; p_sys->b_dead = false; p_sys->p_input = NULL; + p_sys->i_playing_state = -1; p_sys->b_unique = var_CreateGetBool( p_intf, "dbus-unique-service-id" ); if( p_sys->b_unique ) @@ -212,7 +212,7 @@ static void Close ( vlc_object_t *p_this ) if( p_sys->p_input ) { - var_DelCallback( p_sys->p_input, "state", AllCallback, p_intf ); + var_DelCallback( p_sys->p_input, "intf-event", AllCallback, p_intf ); vlc_object_release( p_sys->p_input ); } @@ -280,7 +280,7 @@ static void Run ( intf_thread_t *p_intf ) StatusChangeEmit( p_intf ); break; case SIGNAL_STATE: - StateChange( p_intf, info[i]->i_input_state ); + StateChange( p_intf ); break; default: assert(0); @@ -342,6 +342,8 @@ static int AllCallback( vlc_object_t *p_this, const char *psz_var, if( !info ) return VLC_ENOMEM; + vlc_mutex_lock( &p_intf->p_sys->lock ); + // Wich event is it ? if( !strcmp( "item-current", psz_var ) ) info->signal = SIGNAL_ITEM_CURRENT; @@ -360,17 +362,24 @@ 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 ) ) + else if( !strcmp( "intf-event", psz_var ) ) { + dbus_int32_t state; + state = (var_GetInteger(p_this, "state") == PAUSE_S) ? 1 : 0; + + if( state == p_intf->p_sys->i_playing_state ) + goto end; + + p_intf->p_sys->i_playing_state = state; info->signal = SIGNAL_STATE; - info->i_input_state = newval.i_int; } else assert(0); // Append the event - vlc_mutex_lock( &p_intf->p_sys->lock ); vlc_array_append( p_intf->p_sys->p_events, info ); + +end: vlc_mutex_unlock( &p_intf->p_sys->lock ); return VLC_SUCCESS; } @@ -378,9 +387,7 @@ static int AllCallback( vlc_object_t *p_this, const char *psz_var, /***************************************************************************** * 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( intf_thread_t *p_intf, int i_input_state ) +static int StateChange( intf_thread_t *p_intf ) { intf_sys_t *p_sys = p_intf->p_sys; playlist_t *p_playlist = p_sys->p_playlist; @@ -392,7 +399,7 @@ static int StateChange( intf_thread_t *p_intf, int i_input_state ) UpdateCaps( p_intf ); - if( !p_sys->b_meta_read && i_input_state == PLAYING_S ) + if( !p_sys->b_meta_read && p_sys->i_playing_state == 0) { p_input = playlist_CurrentInput( p_playlist ); if( p_input ) @@ -407,11 +414,7 @@ static int StateChange( intf_thread_t *p_intf, int i_input_state ) } } - if( i_input_state == PLAYING_S || i_input_state == PAUSE_S || - i_input_state == END_S ) - { - StatusChangeEmit( p_intf ); - } + StatusChangeEmit( p_intf ); return VLC_SUCCESS; } @@ -431,7 +434,7 @@ static int TrackChange( intf_thread_t *p_intf ) if( p_sys->p_input ) { - var_DelCallback( p_sys->p_input, "state", AllCallback, p_intf ); + var_DelCallback( p_sys->p_input, "intf-event", AllCallback, p_intf ); vlc_object_release( p_sys->p_input ); p_sys->p_input = NULL; } @@ -458,7 +461,7 @@ static int TrackChange( intf_thread_t *p_intf ) } p_sys->p_input = p_input; - var_AddCallback( p_input, "state", AllCallback, p_intf ); + var_AddCallback( p_input, "intf-event", AllCallback, p_intf ); return VLC_SUCCESS; } diff --git a/modules/control/dbus/dbus_common.h b/modules/control/dbus/dbus_common.h index 7007d4d8a2..a7db1ef54c 100644 --- a/modules/control/dbus/dbus_common.h +++ b/modules/control/dbus/dbus_common.h @@ -85,6 +85,7 @@ struct intf_sys_t playlist_t *p_playlist; bool b_meta_read; dbus_int32_t i_caps; + dbus_int32_t i_playing_state; bool b_dead; vlc_array_t *p_events; vlc_mutex_t lock; diff --git a/modules/control/dbus/dbus_player.c b/modules/control/dbus/dbus_player.c index 4189a254b9..39d6e62b27 100644 --- a/modules/control/dbus/dbus_player.c +++ b/modules/control/dbus/dbus_player.c @@ -446,24 +446,11 @@ static int MarshalStatus( intf_thread_t* p_intf, DBusMessageIter* args ) DBusMessageIter status; dbus_int32_t i_state, i_random, i_repeat, i_loop; - int i_val; playlist_t* p_playlist = p_intf->p_sys->p_playlist; - input_thread_t* p_input = NULL; - i_state = 2; - - p_input = playlist_CurrentInput( p_playlist ); - if( p_input ) - { - i_val = var_GetInteger( p_input, "state" ); - if( i_val >= END_S ) - i_state = 2; - else if( i_val == PAUSE_S ) - i_state = 1; - else if( i_val <= PLAYING_S ) - i_state = 0; - vlc_object_release( p_input ); - } + vlc_mutex_lock( &p_intf->p_sys->lock ); + i_state = p_intf->p_sys->i_playing_state; + vlc_mutex_unlock( &p_intf->p_sys->lock ); i_random = var_CreateGetBool( p_playlist, "random" ); -- 2.39.2