[vlc-devel] commit: dvdnav: find vout through interface events instead of polling ( Rémi Denis-Courmont )

git version control git at videolan.org
Sat Apr 4 17:42:55 CEST 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Apr  4 17:44:49 2009 +0300| [308d526f2e901132068fed4002fe1fb3f89b9ff1] | committer: Rémi Denis-Courmont 

dvdnav: find vout through interface events instead of polling

We may want to factor some of that marshalling into libvlc later on.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=308d526f2e901132068fed4002fe1fb3f89b9ff1
---

 modules/access/dvdnav.c |   88 ++++++++++++++++++++++++++++------------------
 1 files changed, 53 insertions(+), 35 deletions(-)

diff --git a/modules/access/dvdnav.c b/modules/access/dvdnav.c
index b5aeb2f..bc7a9ac 100644
--- a/modules/access/dvdnav.c
+++ b/modules/access/dvdnav.c
@@ -174,6 +174,10 @@ static int ControlInternal( demux_t *, int, ... );
 
 static int EventKey( vlc_object_t *, char const *,
                      vlc_value_t, vlc_value_t, void * );
+static int EventMouse( vlc_object_t *, char const *,
+                       vlc_value_t, vlc_value_t, void * );
+static int EventIntf( vlc_object_t *, char const *,
+                      vlc_value_t, vlc_value_t, void * );
 
 /*****************************************************************************
  * DemuxOpen:
@@ -362,6 +366,8 @@ static int Open( vlc_object_t *p_this )
 
     /* catch all key event */
     var_AddCallback( p_demux->p_libvlc, "key-action", EventKey, p_demux );
+    /* catch vout creation event */
+    var_AddCallback( p_sys->p_input, "intf-event", EventIntf, p_sys );
 
     vlc_thread_create( p_sys->p_ev, "dvdnav event thread handler", EventThread,
                        VLC_THREAD_PRIORITY_LOW );
@@ -378,6 +384,16 @@ static void Close( vlc_object_t *p_this )
     demux_sys_t *p_sys = p_demux->p_sys;
     int i;
 
+    var_DelCallback( p_sys->p_input, "intf-event", EventIntf, p_sys );
+    if( p_sys->p_vout != NULL )
+    {   /* Should not happen, but better be safe than sorry. */
+        msg_Warn( p_sys->p_vout, "removing dangling mouse DVD callbacks" );
+        var_DelCallback( p_sys->p_vout, "mouse-moved", EventMouse,
+                         p_sys->p_ev );
+        var_DelCallback( p_sys->p_vout, "mouse-clicked", EventMouse,
+                         p_sys->p_ev );
+    }
+
     /* stop the event handler */
     vlc_object_kill( p_sys->p_ev );
     var_DelCallback( p_demux->p_libvlc, "key-action", EventKey, p_demux );
@@ -1293,28 +1309,24 @@ static void ESNew( demux_t *p_demux, int i_id )
 /*****************************************************************************
  * Event handler code
  *****************************************************************************/
-static int  EventMouse( vlc_object_t *, char const *,
-                        vlc_value_t, vlc_value_t, void * );
-
 static void* EventThread( vlc_object_t *p_this )
 {
     event_thread_t *p_ev = (event_thread_t*)p_this;
     demux_sys_t    *p_sys = p_ev->p_demux->p_sys;
-    vlc_object_t   *p_vout = NULL;
     int canc = vlc_savecancel ();
 
     /* main loop */
     while( vlc_object_alive( p_ev ) )
     {
+        vlc_mutex_lock( &p_ev->lock );
         /* VOUT part */
-        if( p_vout && ( p_ev->b_moved || p_ev->b_clicked ) )
+        if( p_sys->p_vout && ( p_ev->b_moved || p_ev->b_clicked ) )
         {
             pci_t *pci = dvdnav_get_current_nav_pci( p_sys->dvdnav );
             vlc_value_t valx, valy;
 
-            vlc_mutex_lock( &p_ev->lock );
-            var_Get( p_vout, "mouse-x", &valx );
-            var_Get( p_vout, "mouse-y", &valy );
+            var_Get( p_sys->p_vout, "mouse-x", &valx );
+            var_Get( p_sys->p_vout, "mouse-y", &valy );
 
             if( p_ev->b_moved )
             {
@@ -1330,28 +1342,9 @@ static void* EventThread( vlc_object_t *p_this )
 
             p_ev->b_moved = false;
             p_ev->b_clicked = false;
-            vlc_mutex_unlock( &p_ev->lock );
-        }
-        if( p_vout && !vlc_object_alive (p_vout) )
-        {
-            var_DelCallback( p_vout, "mouse-moved", EventMouse, p_ev );
-            var_DelCallback( p_vout, "mouse-clicked", EventMouse, p_ev );
-            vlc_object_release( p_vout );
-            p_vout = NULL;
-        }
-        if( p_vout == NULL )
-        {
-            p_vout = vlc_object_find( p_sys->p_input, VLC_OBJECT_VOUT,
-                                      FIND_CHILD );
-            if( p_vout)
-            {
-                var_AddCallback( p_vout, "mouse-moved", EventMouse, p_ev );
-                var_AddCallback( p_vout, "mouse-clicked", EventMouse, p_ev );
-            }
         }
 
         /* Still part */
-        vlc_mutex_lock( &p_ev->lock );
         if( p_ev->b_still )
         {
             if( p_ev->i_still_end > 0 && p_ev->i_still_end < mdate() )
@@ -1365,14 +1358,6 @@ static void* EventThread( vlc_object_t *p_this )
         /* Wait a bit */
         msleep( 10000 );
     }
-
-    /* Release callback */
-    if( p_vout )
-    {
-        var_DelCallback( p_vout, "mouse-moved", EventMouse, p_ev );
-        var_DelCallback( p_vout, "mouse-clicked", EventMouse, p_ev );
-        vlc_object_release( p_vout );
-    }
     vlc_restorecancel (canc);
 
     return NULL;
@@ -1428,6 +1413,39 @@ static int EventKey( vlc_object_t *p_this, char const *psz_var,
     return VLC_SUCCESS;
 }
 
+static int EventIntf( vlc_object_t *p_input, char const *psz_var,
+                      vlc_value_t oldval, vlc_value_t val, void *p_data )
+{
+    demux_sys_t *p_sys = p_data;
+
+    if (val.i_int == INPUT_EVENT_VOUT)
+    {
+        vlc_object_t *p_vout;
+
+        vlc_mutex_lock( &p_sys->p_ev->lock );
+        p_vout = p_sys->p_vout;
+        if( p_vout != NULL )
+        {
+            var_DelCallback( p_vout, "mouse-moved", EventMouse, p_sys->p_ev );
+            var_DelCallback( p_vout, "mouse-clicked", EventMouse, p_sys->p_ev );
+            vlc_object_release( p_vout );
+        }
+
+        p_vout = (vlc_object_t *)input_GetVout( (input_thread_t *)p_input );
+        p_sys->p_vout = p_vout;
+        if( p_vout != NULL )
+        {
+            var_AddCallback( p_vout, "mouse-moved", EventMouse,
+                             p_sys->p_ev );
+            var_AddCallback( p_vout, "mouse-clicked", EventMouse,
+                             p_sys->p_ev );
+        }
+        vlc_mutex_unlock( &p_sys->p_ev->lock );
+    }
+    (void) psz_var; (void) oldval;
+    return VLC_SUCCESS;
+}
+
 /*****************************************************************************
  * ProbeDVD: very weak probing that avoids going too often into a dvdnav_open()
  *****************************************************************************/




More information about the vlc-devel mailing list