[vlc-commits] gestures: follow playlist, input, vout events and remove pollign thread
Rémi Denis-Courmont
git at videolan.org
Wed May 9 22:17:52 CEST 2012
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed May 9 23:16:52 2012 +0300| [a959f66bc4d7b4b836094fbc7739f1ef6450fe0e] | committer: Rémi Denis-Courmont
gestures: follow playlist, input, vout events and remove pollign thread
It probably wouldn't hurt to provide helpers for mouse events.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a959f66bc4d7b4b836094fbc7739f1ef6450fe0e
---
modules/control/gestures.c | 145 +++++++++++++++++++++++--------------------
1 files changed, 78 insertions(+), 67 deletions(-)
diff --git a/modules/control/gestures.c b/modules/control/gestures.c
index c40d0e3..05ecb25 100644
--- a/modules/control/gestures.c
+++ b/modules/control/gestures.c
@@ -35,10 +35,7 @@
#include <vlc_vout.h>
#include <vlc_aout_intf.h>
#include <vlc_playlist.h>
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
+#include <assert.h>
/*****************************************************************************
* intf_sys_t: description and status of interface
@@ -46,6 +43,7 @@
struct intf_sys_t
{
vlc_mutex_t lock;
+ input_thread_t *p_input;
vout_thread_t *p_vout;
bool b_button_pressed;
int i_last_x, i_last_y;
@@ -104,11 +102,14 @@ vlc_module_begin ()
set_callbacks( Open, Close )
vlc_module_end ()
+static int PlaylistEvent( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
+static int InputEvent( vlc_object_t *, char const *,
+ vlc_value_t, vlc_value_t, void * );
static int MovedEvent( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
static int ButtonEvent( vlc_object_t *, char const *,
vlc_value_t, vlc_value_t, void * );
-static void RunIntf ( intf_thread_t *p_intf );
/*****************************************************************************
* OpenIntf: initialize interface
@@ -119,13 +120,12 @@ static int Open ( vlc_object_t *p_this )
/* Allocate instance and initialize some members */
intf_sys_t *p_sys = p_intf->p_sys = malloc( sizeof( intf_sys_t ) );
- if( p_intf->p_sys == NULL )
+ if( unlikely(p_sys == NULL) )
return VLC_ENOMEM;
// Configure the module
- p_intf->pf_run = RunIntf;
-
vlc_mutex_init( &p_sys->lock );
+ p_sys->p_input = NULL;
p_sys->p_vout = NULL;
p_sys->b_button_pressed = false;
p_sys->i_threshold = var_InheritInteger( p_intf, "gestures-threshold" );
@@ -143,6 +143,8 @@ static int Open ( vlc_object_t *p_this )
p_sys->i_pattern = 0;
p_sys->i_num_gestures = 0;
+ var_AddCallback( pl_Get(p_intf), "input-current", PlaylistEvent, p_intf );
+
return VLC_SUCCESS;
}
@@ -162,11 +164,18 @@ static void Close ( vlc_object_t *p_this )
intf_thread_t *p_intf = (intf_thread_t *)p_this;
intf_sys_t *p_sys = p_intf->p_sys;
- // Destroy the callbacks
+ /* Destroy the callbacks (the order matters!) */
+ var_DelCallback( pl_Get(p_intf), "input-current", PlaylistEvent, p_intf );
+
+ if( p_sys->p_input )
+ {
+ var_DelCallback( p_sys->p_input, "intf-event", InputEvent, p_intf );
+ vlc_object_release( p_sys->p_input );
+ }
+
if( p_sys->p_vout )
{
- var_DelCallback( p_sys->p_vout, "mouse-moved",
- MovedEvent, p_intf );
+ var_DelCallback( p_sys->p_vout, "mouse-moved", MovedEvent, p_intf );
var_DelCallback( p_sys->p_vout, "mouse-button-down",
ButtonEvent, p_intf );
vlc_object_release( p_sys->p_vout );
@@ -177,60 +186,6 @@ static void Close ( vlc_object_t *p_this )
free( p_sys );
}
-
-/*****************************************************************************
- * RunIntf: main loop
- *****************************************************************************/
-static void RunIntf( intf_thread_t *p_intf )
-{
- intf_sys_t *p_sys = p_intf->p_sys;
- int canc = vlc_savecancel();
- input_thread_t *p_input;
-
- /* Main loop */
- while( vlc_object_alive( p_intf ) )
- {
- vlc_mutex_lock( &p_sys->lock );
-
- /*
- * video output
- */
- if( p_sys->p_vout && !vlc_object_alive( p_sys->p_vout ) )
- {
- var_DelCallback( p_sys->p_vout, "mouse-moved",
- MovedEvent, p_intf );
- var_DelCallback( p_sys->p_vout, "mouse-button-down",
- ButtonEvent, p_intf );
- vlc_object_release( p_sys->p_vout );
- p_sys->p_vout = NULL;
- }
-
- if( p_sys->p_vout == NULL )
- {
- p_input = playlist_CurrentInput( pl_Get( p_intf ) );
- if( p_input )
- {
- p_sys->p_vout = input_GetVout( p_input );
- vlc_object_release( p_input );
- }
- if( p_sys->p_vout )
- {
- var_AddCallback( p_sys->p_vout, "mouse-moved",
- MovedEvent, p_intf );
- var_AddCallback( p_sys->p_vout, "mouse-button-down",
- ButtonEvent, p_intf );
- }
- }
-
- vlc_mutex_unlock( &p_sys->lock );
-
- /* Wait a bit */
- msleep( INTF_IDLE_SLEEP );
- }
-
- vlc_restorecancel( canc );
-}
-
static void ProcessGesture( intf_thread_t *p_intf )
{
intf_sys_t *p_sys = p_intf->p_sys;
@@ -482,7 +437,7 @@ static int ButtonEvent( vlc_object_t *p_this, char const *psz_var,
intf_thread_t *p_intf = p_data;
intf_sys_t *p_sys = p_intf->p_sys;
- (void) p_this; (void) psz_var; (void) oldval;
+ (void) psz_var; (void) oldval;
vlc_mutex_lock( &p_sys->lock );
if( val.i_int & p_sys->i_button_mask )
@@ -490,7 +445,7 @@ static int ButtonEvent( vlc_object_t *p_this, char const *psz_var,
if( !p_sys->b_button_pressed )
{
p_sys->b_button_pressed = true;
- var_GetCoords( p_sys->p_vout, "mouse-moved",
+ var_GetCoords( p_this, "mouse-moved",
&p_sys->i_last_x, &p_sys->i_last_y );
}
}
@@ -506,3 +461,59 @@ static int ButtonEvent( vlc_object_t *p_this, char const *psz_var,
return VLC_SUCCESS;
}
+
+static int InputEvent( vlc_object_t *p_this, char const *psz_var,
+ vlc_value_t oldval, vlc_value_t val, void *p_data )
+{
+ input_thread_t *p_input = (input_thread_t *)p_this;
+ intf_thread_t *p_intf = p_data;
+ intf_sys_t *p_sys = p_intf->p_sys;
+
+ (void) psz_var; (void) oldval;
+
+ switch( val.i_int )
+ {
+ case INPUT_EVENT_DEAD:
+ vlc_object_release( p_input );
+ p_sys->p_input = NULL; /* FIXME: locking!! */
+ break;
+
+ case INPUT_EVENT_VOUT:
+ /* intf-event is serialized against itself and is the sole user of
+ * p_sys->p_vout. So there is no need to acquire the lock currently. */
+ if( p_sys->p_vout != NULL )
+ { /* /!\ Beware of lock inversion with var_DelCallback() /!\ */
+ var_DelCallback( p_sys->p_vout, "mouse-moved", MovedEvent,
+ p_intf );
+ var_DelCallback( p_sys->p_vout, "mouse-clicked", ButtonEvent,
+ p_intf );
+ vlc_object_release( p_sys->p_vout );
+ }
+
+ p_sys->p_vout = input_GetVout( p_input );
+ if( p_sys->p_vout != NULL )
+ {
+ var_AddCallback( p_sys->p_vout, "mouse-moved", MovedEvent,
+ p_intf );
+ var_AddCallback( p_sys->p_vout, "mouse-clicked", ButtonEvent,
+ p_intf );
+ }
+ break;
+ }
+ return VLC_SUCCESS;
+}
+
+static int PlaylistEvent( vlc_object_t *p_this, char const *psz_var,
+ vlc_value_t oldval, vlc_value_t val, void *p_data )
+{
+ intf_thread_t *p_intf = p_data;
+ intf_sys_t *p_sys = p_intf->p_sys;
+ input_thread_t *p_input = val.p_address;
+
+ (void) p_this; (void) psz_var; (void) oldval;
+
+ var_AddCallback( p_input, "intf-event", InputEvent, p_intf );
+ assert( p_sys->p_input == NULL );
+ p_sys->p_input = vlc_object_hold( p_input );
+ return VLC_SUCCESS;
+}
More information about the vlc-commits
mailing list