]> git.sesse.net Git - vlc/commitdiff
Add state-callback to check item-change, change playlist-current to
authorIlkka Ollakka <ileoo@videolan.org>
Sun, 10 Feb 2008 11:16:51 +0000 (11:16 +0000)
committerIlkka Ollakka <ileoo@videolan.org>
Sun, 10 Feb 2008 11:16:51 +0000 (11:16 +0000)
item-change for IM callback.
Check callback and handle other than interface-update stuff only if they
have same id than current input

Should fix that meta not showing/too many signals sended in beginning.
Shouldn't break anything (as always ;)

modules/gui/qt4/input_manager.cpp
modules/gui/qt4/input_manager.hpp

index 258580b5f73f31017a85971936be9aca24e8afaf..2a37393ce1434a0554e1f459e02c0d0d1acd13aa 100644 (file)
@@ -78,11 +78,19 @@ void InputManager::setInput( input_thread_t *_p_input )
     delInput();
     p_input = _p_input;
     b_had_audio = b_had_video = b_has_audio = b_has_video = false;
-    if( p_input )
+    if( p_input && !( p_input->b_dead || p_input->b_die ) )
     {
         vlc_object_yield( p_input );
         emit statusChanged( PLAYING_S );
+        UpdateMeta();
+        UpdateTracks();
+        UpdateTitle();
+        UpdateArt();
         addCallbacks();
+        i_input_id = input_GetItem( p_input )->i_id; 
+    } else {
+        p_input = NULL;
+        i_input_id = 0;
     }
 }
 
@@ -97,6 +105,7 @@ void InputManager::delInput()
         vlc_object_release( p_input );
         i_old_playing_status = END_S;
 
+        i_input_id = 0;
         old_name=qfu("");
         artUrl = qfu("");
         emit positionUpdated( 0.0, 0 ,0 );
@@ -148,6 +157,7 @@ void InputManager::delCallbacks()
 void InputManager::customEvent( QEvent *event )
 {
     int type = event->type();
+    IMEvent *ple = static_cast<IMEvent *>(event);
     //msg_Dbg( p_intf, "New IM Event of type: %i", type );
     if ( type != PositionUpdate_Type &&
          type != ItemChanged_Type &&
@@ -155,16 +165,14 @@ void InputManager::customEvent( QEvent *event )
          type != ItemTitleChanged_Type &&
          type != ItemStateChanged_Type )
         return;
-
+    
+    if( !p_input || p_input->b_die || p_input->b_dead )
+        return;
+    if( type != PositionUpdate_Type && ( i_input_id != ple->i_id )  )
+        return;
     if( type != PositionUpdate_Type )
         msg_Dbg( p_intf, "New Event: type %i", type );
 
-    /* Delete the input */
-    if( !p_input || p_input->b_dead || p_input->b_die )
-    {
-         delInput();
-         return;
-    }
 
     /* Actions */
     switch( type )
@@ -442,11 +450,10 @@ MainInputManager::MainInputManager( intf_thread_t *_p_intf )
     im = new InputManager( this, p_intf );
 
     var_AddCallback( THEPL, "item-change", PLItemChanged, this );
+    var_AddCallback( THEPL, "item-change", ItemChanged, im );
     var_AddCallback( THEPL, "playlist-current", PLItemChanged, this );
     var_AddCallback( THEPL, "activity", PLItemChanged, this );
 
-    var_AddCallback( THEPL, "playlist-current", ItemChanged, im );
-
     var_AddCallback( p_intf->p_libvlc, "volume-change", VolumeChanged, this );
 
     // No necessary, I think TODO REMOVE ME at the end
@@ -461,16 +468,18 @@ MainInputManager::~MainInputManager()
 {
     if( p_input )
     {
+       var_DelCallback( p_input, "state", PLItemChanged, this );
+       vlc_object_release( p_input );
        emit inputChanged( NULL );
     }
 
     var_DelCallback( p_intf->p_libvlc, "volume-change", VolumeChanged, this );
 
-    var_DelCallback( THEPL, "playlist-current", PLItemChanged, this );
     var_DelCallback( THEPL, "activity", PLItemChanged, this );
+    var_DelCallback( THEPL, "item-change", ItemChanged, im );
     var_DelCallback( THEPL, "item-change", PLItemChanged, this );
 
-    var_DelCallback( THEPL, "playlist-current", ItemChanged, im );
+    var_DelCallback( THEPL, "playlist-current", PLItemChanged, this );
 }
 
 void MainInputManager::customEvent( QEvent *event )
@@ -492,9 +501,12 @@ void MainInputManager::customEvent( QEvent *event )
         vlc_mutex_lock( &p_intf->change_lock );
         if( p_input && ( p_input->b_dead || p_input->b_die ) )
         {
-            im->delInput();
+            var_DelCallback( p_input, "state", PLItemChanged, this );
+            vlc_object_release( p_input );
             emit inputChanged( NULL );
             p_input = NULL;
+            vlc_mutex_unlock( &p_intf->change_lock );
+            return;
         }
 
         if( !p_input )
@@ -503,6 +515,8 @@ void MainInputManager::customEvent( QEvent *event )
             p_input = THEPL->p_input;
             if( p_input && !( p_input->b_die || p_input->b_dead) )
             {
+                vlc_object_yield( p_input );
+                var_AddCallback( p_input, "state", PLItemChanged, this );
                 emit inputChanged( p_input );
             }
             else
index 0cc7b4153db71c73c1232836ffc6f900b3d51923..1532a294b3b7cfe74fba9d115d6b10210220e7c8 100644 (file)
@@ -76,6 +76,7 @@ private:
     void UpdateArt();
     intf_thread_t  *p_intf;
     input_thread_t *p_input;
+    int             i_input_id;
     int             i_old_playing_status;
     QString         old_name;
     QString         artUrl;