[vlc-devel] commit: Use intf-change-vout to properly detect vout (close #1992 and #1950 ) (Laurent Aimar )

git version control git at videolan.org
Sat Sep 6 00:27:04 CEST 2008


vlc | branch: 0.9-bugfix | Laurent Aimar <fenrir at videolan.org> | Fri Sep  5 23:39:02 2008 +0200| [6bdf53c30d8613a3ecbcc2bb55f6854179dccc78] | committer: Jean-Baptiste Kempf 

Use intf-change-vout to properly detect vout (close #1992 and #1950)
(cherry picked from commit fccf6aa0ca7e534a6546f6150943e0befa694126)

And Fixed initial snpshot/fullscreen state.
It fixes a regression introduced by fccf6aa0ca7e534a6546f6150943e0befa694126

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

 modules/gui/qt4/components/interface_widgets.cpp |    6 ++-
 modules/gui/qt4/components/interface_widgets.hpp |    2 +-
 modules/gui/qt4/input_manager.cpp                |   53 ++++++++++++++++------
 modules/gui/qt4/input_manager.hpp                |    7 +++-
 4 files changed, 50 insertions(+), 18 deletions(-)

diff --git a/modules/gui/qt4/components/interface_widgets.cpp b/modules/gui/qt4/components/interface_widgets.cpp
index 216d26b..efc9d45 100644
--- a/modules/gui/qt4/components/interface_widgets.cpp
+++ b/modules/gui/qt4/components/interface_widgets.cpp
@@ -671,6 +671,9 @@ ControlsWidget::ControlsWidget( intf_thread_t *_p_i,
     /*
      * Other first Line buttons
      */
+    /* */
+    CONNECT( THEMIM->getIM(), voutChanged(bool), this, enableVideo(bool) );
+
     /** Fullscreen/Visualisation **/
     fullscreenButton = new QPushButton;
     BUTTON_SET_ACT_I( fullscreenButton, "", fullscreen,
@@ -909,7 +912,7 @@ void ControlsWidget::updateInput()
 {
     /* Activate the interface buttons according to the presence of the input */
     enableInput( THEMIM->getIM()->hasInput() );
-    enableVideo( THEMIM->getIM()->hasVideo() && THEMIM->getIM()->hasInput() );
+    enableVideo( THEMIM->getIM()->hasVideo() );
 }
 
 void ControlsWidget::setStatus( int status )
@@ -993,7 +996,6 @@ void ControlsWidget::toggleAdvanced()
     emit advancedControlsToggled( b_advancedVisible );
 }
 
-
 /**********************************************************************
  * Fullscrenn control widget
  **********************************************************************/
diff --git a/modules/gui/qt4/components/interface_widgets.hpp b/modules/gui/qt4/components/interface_widgets.hpp
index 1323ea6..847f948 100644
--- a/modules/gui/qt4/components/interface_widgets.hpp
+++ b/modules/gui/qt4/components/interface_widgets.hpp
@@ -174,7 +174,6 @@ public:
     QPushButton *playlistButton;
     void setStatus( int );
     void enableInput( bool );
-    void enableVideo( bool );
 public slots:
     void setNavigation( int );
 protected:
@@ -216,6 +215,7 @@ protected slots:
     void toggleTeletext();
     void toggleTeletextTransparency();
     void enableTeletext( bool );
+    void enableVideo( bool );
 signals:
     void advancedControlsToggled( bool );
 };
diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp
index 1a221fd..93af140 100644
--- a/modules/gui/qt4/input_manager.cpp
+++ b/modules/gui/qt4/input_manager.cpp
@@ -42,6 +42,8 @@ static int PLItemChanged( vlc_object_t *, const char *,
                         vlc_value_t, vlc_value_t, void * );
 static int InterfaceChanged( vlc_object_t *, const char *,
                             vlc_value_t, vlc_value_t, void * );
+static int InterfaceVoutChanged( vlc_object_t *, const char *,
+                                 vlc_value_t, vlc_value_t, void * );
 static int ItemStateChanged( vlc_object_t *, const char *,
                         vlc_value_t, vlc_value_t, void * );
 static int ItemRateChanged( vlc_object_t *, const char *,
@@ -67,6 +69,7 @@ InputManager::InputManager( QObject *parent, intf_thread_t *_p_intf) :
     p_input      = NULL;
     i_rate       = 0;
     i_input_id   = 0;
+    b_video      = false;
     b_transparentTelextext = false;
 }
 
@@ -91,6 +94,7 @@ void InputManager::setInput( input_thread_t *_p_input )
         UpdateSPU();
         UpdateTeletext();
         UpdateNavigation();
+        UpdateVout();
         addCallbacks();
         i_input_id = input_GetItem( p_input )->i_id;
     }
@@ -114,11 +118,13 @@ void InputManager::delInput()
         i_input_id = 0;
         old_name   = "";
         artUrl     = "";
+        b_video    = false;
         emit positionUpdated( -1.0, 0 ,0 );
         emit statusChanged( END_S );
         emit nameChanged( "" );
         emit artChanged( "" );
         emit rateChanged( INPUT_RATE_DEFAULT );
+        emit voutChanged( false );
         vlc_object_release( p_input );
         p_input = NULL;
         UpdateSPU();
@@ -152,6 +158,8 @@ void InputManager::addCallbacks()
     var_AddCallback( p_input, "title", ItemTitleChanged, this );
     /* src/input/input.c:734 for timers update*/
     var_AddCallback( p_input, "intf-change", InterfaceChanged, this );
+    /* src/input/input.c for vout creation/destruction */
+    var_AddCallback( p_input, "intf-change-vout", InterfaceVoutChanged, this );
 }
 
 /* Delete the callbacks on Input. Self explanatory */
@@ -164,6 +172,7 @@ void InputManager::delCallbacks()
     var_DelCallback( p_input, "rate-change", ItemRateChanged, this );
     var_DelCallback( p_input, "title", ItemTitleChanged, this );
     var_DelCallback( p_input, "intf-change", InterfaceChanged, this );
+    var_DelCallback( p_input, "intf-change-vout", InterfaceVoutChanged, this );
 }
 
 /* Convert the event from the callbacks in actions */
@@ -178,7 +187,8 @@ void InputManager::customEvent( QEvent *event )
          type != ItemTitleChanged_Type &&
          type != ItemSpuChanged_Type &&
          type != ItemTeletextChanged_Type &&
-         type != ItemStateChanged_Type )
+         type != ItemStateChanged_Type &&
+         type != InterfaceVoutUpdate_Type )
         return;
 
     if( type == ItemStateChanged_Type )
@@ -193,7 +203,8 @@ void InputManager::customEvent( QEvent *event )
           type != ItemRateChanged_Type &&
           type != ItemSpuChanged_Type &&
           type != ItemTeletextChanged_Type &&
-          type != ItemStateChanged_Type
+          type != ItemStateChanged_Type &&
+          type != InterfaceVoutUpdate_Type
         )
         && ( i_input_id != ple->i_id ) )
         return;
@@ -230,6 +241,9 @@ void InputManager::customEvent( QEvent *event )
     case ItemTeletextChanged_Type:
         UpdateTeletext();
         break;
+    case InterfaceVoutUpdate_Type:
+        UpdateVout();
+        break;
     }
 }
 
@@ -338,18 +352,6 @@ bool InputManager::hasAudio()
     return false;
 }
 
-bool InputManager::hasVideo()
-{
-    if( hasInput() )
-    {
-        vlc_value_t val;
-        var_Change( p_input, "video-es", VLC_VAR_CHOICESCOUNT, &val, NULL );
-        return val.i_int > 0;
-    }
-    return false;
-
-}
-
 void InputManager::UpdateSPU()
 {
     UpdateTeletext();
@@ -363,6 +365,18 @@ void InputManager::UpdateTeletext()
         telexToggle( false );
 }
 
+void InputManager::UpdateVout()
+{
+    if( hasInput() )
+    {
+        vlc_object_t *p_vout = (vlc_object_t*)vlc_object_find( p_input, VLC_OBJECT_VOUT, FIND_CHILD );
+        b_video = p_vout != NULL;
+        if( p_vout )
+            vlc_object_release( p_vout );
+        emit voutChanged( b_video );
+    }
+}
+
 void InputManager::UpdateArt()
 {
     /* Update Art meta */
@@ -703,6 +717,7 @@ bool MainInputManager::teletextState()
 static int InterfaceChanged( vlc_object_t *p_this, const char *psz_var,
                            vlc_value_t oldval, vlc_value_t newval, void *param )
 {
+    /* FIXME remove that static variable */
     static int counter = 0;
     InputManager *im = (InputManager*)param;
 
@@ -714,6 +729,16 @@ static int InterfaceChanged( vlc_object_t *p_this, const char *psz_var,
     return VLC_SUCCESS;
 }
 
+static int InterfaceVoutChanged( vlc_object_t *p_this, const char *psz_var,
+                                 vlc_value_t oldval, vlc_value_t newval, void *param )
+{
+    InputManager *im = (InputManager*)param;
+
+    IMEvent *event = new IMEvent( InterfaceVoutUpdate_Type, 0 );
+    QApplication::postEvent( im, static_cast<QEvent*>(event) );
+    return VLC_SUCCESS;
+}
+
 static int ItemStateChanged( vlc_object_t *p_this, const char *psz_var,
                            vlc_value_t oldval, vlc_value_t newval, void *param )
 {
diff --git a/modules/gui/qt4/input_manager.hpp b/modules/gui/qt4/input_manager.hpp
index 6cccdf7..4d4ef5d 100644
--- a/modules/gui/qt4/input_manager.hpp
+++ b/modules/gui/qt4/input_manager.hpp
@@ -44,6 +44,7 @@ static int const ItemRateChanged_Type    = QEvent::User + IMEventType + 5;
 static int const VolumeChanged_Type      = QEvent::User + IMEventType + 6;
 static int const ItemSpuChanged_Type     = QEvent::User + IMEventType + 7;
 static int const ItemTeletextChanged_Type= QEvent::User + IMEventType + 8;
+static int const InterfaceVoutUpdate_Type= QEvent::User + IMEventType + 9;
 
 static int const FullscreenControlToggle_Type = QEvent::User + IMEventType + 10;
 static int const FullscreenControlShow_Type = QEvent::User + IMEventType + 11;
@@ -70,7 +71,7 @@ public:
     void delInput();
     bool hasInput() { return p_input && !p_input->b_dead && vlc_object_alive (p_input); }
     bool hasAudio();
-    bool hasVideo();
+    bool hasVideo() { return hasInput() && b_video; }
 
     QString getName() { return old_name; }
 
@@ -83,6 +84,7 @@ private:
     QString         artUrl;
     int             i_rate;
     bool            b_transparentTelextext;
+    bool            b_video;
 
     void customEvent( QEvent * );
     void addCallbacks();
@@ -95,6 +97,7 @@ private:
     void UpdateSPU();
     void UpdateTeletext();
     void UpdateArt();
+    void UpdateVout();
 
 public slots:
     void setInput( input_thread_t * ); ///< Our controlled input changed
@@ -129,6 +132,8 @@ signals:
     void setNewTelexPage( int );
     /// Advanced buttons
     void advControlsSetIcon();
+    /// Vout
+    void voutChanged( bool );
 };
 
 class MainInputManager : public QObject




More information about the vlc-devel mailing list