]> git.sesse.net Git - vlc/blobdiff - modules/gui/qt4/input_manager.cpp
Mark qt-blingbling as deleted
[vlc] / modules / gui / qt4 / input_manager.cpp
index 28820747606789cb403c197d8b056269777c7249..535bfd84ce28e8d00888ed513b23d0017e0061ab 100644 (file)
@@ -31,6 +31,8 @@
 
 #include <QApplication>
 
+#include <assert.h>
+
 static int ItemChanged( vlc_object_t *, const char *,
                         vlc_value_t, vlc_value_t, void * );
 static int PLItemChanged( vlc_object_t *, const char *,
@@ -61,7 +63,7 @@ InputManager::InputManager( QObject *parent, intf_thread_t *_p_intf) :
     b_video      = false;
     timeA        = 0;
     timeB        = 0;
-
+    f_cache      = -1.; /* impossible initial value, different from all */
 }
 
 InputManager::~InputManager()
@@ -127,6 +129,7 @@ void InputManager::delInput()
     emit teletextPossible( false );
     emit AtoBchanged( false, false );
     emit voutChanged( false );
+    emit voutListChanged( NULL, 0 );
 
     /* Reset all InfoPanels but stats */
     emit artChanged( NULL );
@@ -140,7 +143,7 @@ void InputManager::customEvent( QEvent *event )
     int i_type = event->type();
     IMEvent *ple = static_cast<IMEvent *>(event);
 
-    if ( i_type != PositionUpdate_Type &&
+    assert( !( i_type != PositionUpdate_Type &&
          i_type != ItemChanged_Type &&
          i_type != ItemRateChanged_Type &&
          i_type != ItemTitleChanged_Type &&
@@ -154,14 +157,15 @@ void InputManager::customEvent( QEvent *event )
          i_type != InfoChanged_Type &&
          i_type != SynchroChanged_Type &&
          i_type != CachingEvent_Type &&
-         i_type != BookmarksChanged_Type )
-        return;
+         i_type != BookmarksChanged_Type &&
+         i_type != InterfaceAoutUpdate_Type &&
+         i_type != RecordingEvent_Type ) );
+
+    if( !hasInput() ) return;
 
     if( i_type == CachingEvent_Type )
         UpdateCaching();
 
-    if( !hasInput() ) return;
-
     if( ( i_type != PositionUpdate_Type  &&
           i_type != ItemRateChanged_Type &&
           i_type != ItemEsChanged_Type &&
@@ -173,7 +177,9 @@ void InputManager::customEvent( QEvent *event )
           i_type != NameChanged_Type &&
           i_type != InfoChanged_Type &&
           i_type != SynchroChanged_Type &&
-          i_type != BookmarksChanged_Type
+          i_type != BookmarksChanged_Type &&
+          i_type != InterfaceAoutUpdate_Type &&
+          i_type != RecordingEvent_Type
         )
         && ( i_input_id != ple->i_id ) )
         return;
@@ -196,7 +202,7 @@ void InputManager::customEvent( QEvent *event )
     case ItemChanged_Type:
         UpdateStatus();
         // UpdateName();
-        // UpdateArt();
+        UpdateArt();
         break;
     case ItemStateChanged_Type:
         // TODO: Fusion with above state
@@ -241,6 +247,12 @@ void InputManager::customEvent( QEvent *event )
     case BookmarksChanged_Type:
         emit bookmarksChanged();
         break;
+    case InterfaceAoutUpdate_Type:
+        UpdateAout();
+        break;
+    case RecordingEvent_Type:
+        UpdateRecord();
+        break;
     default:
         msg_Warn( p_intf, "This shouldn't happen: %i", i_type );
     }
@@ -299,12 +311,15 @@ static int InputEvent( vlc_object_t *p_this, const char *,
         event = new IMEvent( ItemTeletextChanged_Type, 0 );
         break;
 
+    case INPUT_EVENT_STATISTICS:
+        event = new IMEvent( StatisticsUpdate_Type, 0 );
+        break;
+
     case INPUT_EVENT_VOUT:
         event = new IMEvent( InterfaceVoutUpdate_Type, 0 );
         break;
-
-    case INPUT_EVENT_STATISTICS:
-        event = new IMEvent( StatisticsUpdate_Type, 0 );
+    case INPUT_EVENT_AOUT:
+        event = new IMEvent( InterfaceAoutUpdate_Type, 0 );
         break;
 
     case INPUT_EVENT_ITEM_META: /* Codec MetaData + Art */
@@ -331,10 +346,8 @@ static int InputEvent( vlc_object_t *p_this, const char *,
         break;
 
     case INPUT_EVENT_RECORD:
-        /* This happens when a recording starts. What do we do then?
-           Display a red light? */
-        /* event = new IMEvent( RecordingEvent_Type, 0 );
-        break; */
+        event = new IMEvent( RecordingEvent_Type, 0 );
+        break;
 
     case INPUT_EVENT_PROGRAM:
         /* This is for PID changes */
@@ -375,10 +388,12 @@ void InputManager::UpdateNavigation()
     if( val.i_int > 0 )
     {
         emit titleChanged( true );
+        msg_Dbg( p_intf, "Title %i", val.i_int );
         /* p_input != NULL since val.i_int != 0 */
         val.i_int = 0;
         var_Change( p_input, "chapter", VLC_VAR_CHOICESCOUNT, &val, NULL );
         emit chapterChanged( (val.i_int > 0) );
+        msg_Dbg( p_intf, "Chapter: %i", val.i_int );
     }
     else
         emit titleChanged( false );
@@ -482,33 +497,81 @@ void InputManager::UpdateVout()
 {
     if( hasInput() )
     {
-        bool b_old_video = b_video;
+        /* Get current vout lists from input */
+        int i_vout;
+        vout_thread_t **pp_vout;
+        if( input_Control( p_input, INPUT_GET_VOUTS, &pp_vout, &i_vout ) )
+        {
+            i_vout = 0;
+            pp_vout = NULL;
+        }
+
+        /* */
+        emit voutListChanged( pp_vout, i_vout );
 
-        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 );
+        /* */
+        bool b_old_video = b_video;
+        b_video = i_vout > 0;
         if( !!b_old_video != !!b_video )
             emit voutChanged( b_video );
+
+        /* Release the vout list */
+        for( int i = 0; i < i_vout; i++ )
+            vlc_object_release( (vlc_object_t*)pp_vout[i] );
+        free( pp_vout );
+    }
+}
+void InputManager::UpdateAout()
+{
+    if( hasInput() )
+    {
+        /* TODO */
     }
 }
-
 void InputManager::UpdateCaching()
 {
-    float f_newCache = var_GetFloat( p_input, "cache" );
+    if(!hasInput()) return;
+
+    float f_newCache = var_GetFloat ( p_input, "cache" );
     if( f_newCache != f_cache )
     {
-        f_newCache = f_cache;
+        f_cache = f_newCache;
         /* Update rate */
         emit cachingChanged( f_cache );
     }
 }
 
-inline void InputManager::UpdateArt()
+void InputManager::requestArtUpdate()
 {
+    if( hasInput() )
+    {
+        playlist_t *p_playlist = pl_Hold( p_intf );
+        playlist_AskForArtEnqueue( p_playlist, input_GetItem( p_input ), pl_Unlocked );
+        pl_Release( p_intf );
+    }
+    else
+    {
+        /* No input will signal the cover art to update,
+         * let's do it ourself */
+        UpdateArt();
+    }
+}
+
+void InputManager::UpdateArt()
+{
+    QString url;
+
+    if( hasInput() )
+    {
+        char *psz_art = input_item_GetArtURL( input_GetItem( p_input ) );
+        url = psz_art;
+        free( psz_art );
+    }
+    url = url.replace( "file://", QString("" ) );
+    /* Taglib seems to define a attachment://, It won't work yet */
+    url = url.replace( "attachment://", QString("" ) );
     /* Update Art meta */
-    emit artChanged( input_GetItem( p_input ) );
+    emit artChanged( url );
 }
 
 inline void InputManager::UpdateStats()
@@ -526,6 +589,14 @@ inline void InputManager::UpdateInfo()
     emit infoChanged( input_GetItem( p_input ) );
 }
 
+void InputManager::UpdateRecord()
+{
+    if( hasInput() )
+    {
+        emit recordingStateChanged( var_GetBool( p_input, "record" ) );
+    }
+}
+
 /* User update of the slider */
 void InputManager::sliderUpdate( float new_pos )
 {
@@ -768,17 +839,18 @@ MainInputManager::MainInputManager( intf_thread_t *_p_intf )
     /* emit check if playlist has allready started playing */
     vlc_value_t val;
     var_Change( THEPL, "playlist-current", VLC_VAR_CHOICESCOUNT, &val, NULL );
+
     IMEvent *event = new IMEvent( ItemChanged_Type, val.i_int);
-    QApplication::postEvent( this, static_cast<QEvent*>(event) );
+    customEvent( static_cast<QEvent*>(event) );
 }
 
 MainInputManager::~MainInputManager()
 {
     if( p_input )
     {
+       emit inputChanged( NULL );
        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 );
@@ -789,6 +861,16 @@ MainInputManager::~MainInputManager()
     var_DelCallback( THEPL, "playlist-current", PLItemChanged, this );
 }
 
+vout_thread_t* MainInputManager::getVout()
+{
+    return p_input ? input_GetVout( p_input ) : NULL;
+}
+
+aout_instance_t * MainInputManager::getAout()
+{
+    return p_input ? input_GetAout( p_input ) : NULL;
+}
+
 void MainInputManager::customEvent( QEvent *event )
 {
     int type = event->type();
@@ -808,9 +890,9 @@ void MainInputManager::customEvent( QEvent *event )
         vlc_mutex_lock( &p_intf->change_lock );
         if( p_input && ( p_input->b_dead || !vlc_object_alive (p_input) ) )
         {
+            emit inputChanged( NULL );
             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;