X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fgui%2Fqt4%2Finput_manager.cpp;h=13149bd6a744b487db83b95342a6b9588ff2498b;hb=59b66be9b1ea3b3f2976f29cde4a0ee3932abf1a;hp=2dc83e7fc057e506e5b73176a6dcf4834f3b45b5;hpb=b91b84d6f18cc8855cc9349ff6999b26247ef38d;p=vlc diff --git a/modules/gui/qt4/input_manager.cpp b/modules/gui/qt4/input_manager.cpp index 2dc83e7fc0..13149bd6a7 100644 --- a/modules/gui/qt4/input_manager.cpp +++ b/modules/gui/qt4/input_manager.cpp @@ -28,6 +28,7 @@ #endif #include "input_manager.hpp" +#include #include @@ -42,6 +43,8 @@ static int VolumeChanged( vlc_object_t *, const char *, static int InputEvent( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * ); +static int VbiEvent( vlc_object_t *, const char *, + vlc_value_t, vlc_value_t, void * ); /********************************************************************** @@ -134,7 +137,9 @@ void InputManager::delInput() /* Reset all InfoPanels but stats */ emit artChanged( NULL ); emit infoChanged( NULL ); - emit metaChanged( NULL ); + emit metaChanged( (input_item_t *)NULL ); + + emit encryptionChanged( false ); } /* Convert the event from the callbacks in actions */ @@ -143,50 +148,13 @@ void InputManager::customEvent( QEvent *event ) int i_type = event->type(); IMEvent *ple = static_cast(event); - assert( !( i_type != PositionUpdate_Type && - i_type != ItemChanged_Type && - i_type != ItemRateChanged_Type && - i_type != ItemTitleChanged_Type && - i_type != ItemEsChanged_Type && - i_type != ItemTeletextChanged_Type && - i_type != ItemStateChanged_Type && - i_type != StatisticsUpdate_Type && - i_type != InterfaceVoutUpdate_Type && - i_type != MetaChanged_Type && - i_type != NameChanged_Type && - i_type != InfoChanged_Type && - i_type != SynchroChanged_Type && - i_type != CachingEvent_Type && - i_type != BookmarksChanged_Type && - i_type != InterfaceAoutUpdate_Type && - i_type != RecordingEvent_Type ) ); - - if( !hasInput() ) return; - - if( i_type == CachingEvent_Type ) - UpdateCaching(); - - if( ( i_type != PositionUpdate_Type && - i_type != ItemRateChanged_Type && - i_type != ItemEsChanged_Type && - i_type != ItemTeletextChanged_Type && - i_type != ItemStateChanged_Type && - i_type != StatisticsUpdate_Type && - i_type != InterfaceVoutUpdate_Type && - i_type != MetaChanged_Type && - i_type != NameChanged_Type && - i_type != InfoChanged_Type && - i_type != SynchroChanged_Type && - i_type != BookmarksChanged_Type && - i_type != InterfaceAoutUpdate_Type && - i_type != RecordingEvent_Type - ) - && ( i_input_id != ple->i_id ) ) + if( !hasInput() ) return; #ifndef NDEBUG if( i_type != PositionUpdate_Type && - i_type != StatisticsUpdate_Type ) + i_type != StatisticsUpdate_Type && + i_type != ItemChanged_Type ) msg_Dbg( p_intf, "New Event: type %i", i_type ); #endif @@ -200,9 +168,15 @@ void InputManager::customEvent( QEvent *event ) UpdateStats(); break; case ItemChanged_Type: - UpdateStatus(); - // UpdateName(); - UpdateArt(); + /* Ignore ItemChanged_Type event that does not apply to our input */ + if( i_input_id == ple->i_id ) + { + UpdateStatus(); + // UpdateName(); + UpdateArt(); + /* Update duration of file */ + } + UpdateMeta( ple->i_id ); break; case ItemStateChanged_Type: // TODO: Fusion with above state @@ -230,7 +204,8 @@ void InputManager::customEvent( QEvent *event ) UpdateRate(); break; case ItemEsChanged_Type: - // We don't do anything. Why ? + UpdateTeletext(); + // We don't do anything ES related. Why ? break; case ItemTeletextChanged_Type: UpdateTeletext(); @@ -253,8 +228,12 @@ void InputManager::customEvent( QEvent *event ) case RecordingEvent_Type: UpdateRecord(); break; + case ProgramChanged_Type: + UpdateProgramEvent(); + break; default: msg_Warn( p_intf, "This shouldn't happen: %i", i_type ); + assert(0); } } @@ -351,8 +330,9 @@ static int InputEvent( vlc_object_t *p_this, const char *, case INPUT_EVENT_PROGRAM: /* This is for PID changes */ - /* event = new IMEvent( ProgramChanged_Type, 0 ); - break; */ + event = new IMEvent( ProgramChanged_Type, 0 ); + break; + case INPUT_EVENT_SIGNAL: /* This is for capture-card signals */ /* event = new IMEvent( SignalChanged_Type, 0 ); @@ -366,6 +346,17 @@ static int InputEvent( vlc_object_t *p_this, const char *, QApplication::postEvent( im, event ); return VLC_SUCCESS; } + +static int VbiEvent( vlc_object_t *, const char *, + vlc_value_t, vlc_value_t, void *param ) +{ + InputManager *im = (InputManager*)param; + IMEvent *event = new IMEvent( ItemTeletextChanged_Type, 0 ); + + QApplication::postEvent( im, event ); + return VLC_SUCCESS; +} + void InputManager::UpdatePosition() { /* Update position */ @@ -488,9 +479,47 @@ bool InputManager::hasAudio() void InputManager::UpdateTeletext() { if( hasInput() ) - telexActivation( var_GetInteger( p_input, "teletext-es" ) >= 0 ); + { + const bool b_enabled = var_CountChoices( p_input, "teletext-es" ) > 0; + const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); + + /* Teletext is possible. Show the buttons */ + emit teletextPossible( b_enabled ); + + /* If Teletext is selected */ + if( b_enabled && i_teletext_es >= 0 ) + { + /* Then, find the current page */ + int i_page = 100; + bool b_transparent = false; + + vlc_object_t *p_vbi = (vlc_object_t *) + vlc_object_find_name( p_input, "zvbi", FIND_CHILD ); + + if( p_vbi ) + { + /* We deleted it (if not here, it does not harm), because + * var_AddCallback will silently add a duplicated one */ + var_DelCallback( p_vbi, "vbi-page", VbiEvent, this ); + /* This callback is not remove explicitly, but interfaces + * are guaranted to outlive input */ + var_AddCallback( p_vbi, "vbi-page", VbiEvent, this ); + + i_page = var_GetInteger( p_vbi, "vbi-page" ); + b_transparent = !var_GetBool( p_vbi, "vbi-opaque" ); + vlc_object_release( p_vbi ); + } + emit newTelexPageSet( i_page ); + emit teletextTransparencyActivated( b_transparent ); + + } + emit teletextActivated( b_enabled && i_teletext_es >= 0 ); + } else - telexActivation( false ); + { + emit teletextActivated( false ); + emit teletextPossible( false ); + } } void InputManager::UpdateVout() @@ -579,6 +608,11 @@ inline void InputManager::UpdateStats() emit statisticsUpdated( input_GetItem( p_input ) ); } +inline void InputManager::UpdateMeta( int id ) +{ + emit metaChanged( id ); +} + inline void InputManager::UpdateMeta() { emit metaChanged( input_GetItem( p_input ) ); @@ -597,6 +631,15 @@ void InputManager::UpdateRecord() } } +void InputManager::UpdateProgramEvent() +{ + if( hasInput() ) + { + bool b_scrambled = var_GetBool( p_input, "program-scrambled" ); + emit encryptionChanged( b_scrambled ); + } +} + /* User update of the slider */ void InputManager::sliderUpdate( float new_pos ) { @@ -607,13 +650,12 @@ void InputManager::sliderUpdate( float new_pos ) /* User togglePlayPause */ void InputManager::togglePlayPause() { - vlc_value_t state; if( hasInput() ) { - var_Get( p_input, "state", &state ); - state.i_int = ( state.i_int != PLAYING_S ) ? PLAYING_S : PAUSE_S; - var_Set( p_input, "state", state ); - emit statusChanged( state.i_int ); + int state = var_GetInteger( p_input, "state" ); + state = ( state != PLAYING_S ) ? PLAYING_S : PAUSE_S; + var_SetInteger( p_input, "state", state ); + emit statusChanged( state ); } } @@ -622,9 +664,8 @@ void InputManager::sectionPrev() if( hasInput() ) { int i_type = var_Type( p_input, "next-chapter" ); - vlc_value_t val; val.b_bool = true; - var_Set( p_input, (i_type & VLC_VAR_TYPE) != 0 ? - "prev-chapter":"prev-title", val ); + var_SetBool( p_input, (i_type & VLC_VAR_TYPE) != 0 ? + "prev-chapter":"prev-title", true ); } } @@ -633,9 +674,8 @@ void InputManager::sectionNext() if( hasInput() ) { int i_type = var_Type( p_input, "next-chapter" ); - vlc_value_t val; val.b_bool = true; - var_Set( p_input, (i_type & VLC_VAR_TYPE) != 0 ? - "next-chapter":"next-title", val ); + var_SetBool( p_input, (i_type & VLC_VAR_TYPE) != 0 ? + "next-chapter":"next-title", true ); } } @@ -644,21 +684,20 @@ void InputManager::sectionMenu() if( hasInput() ) { vlc_value_t val, text; - vlc_value_t root; if( var_Change( p_input, "title 0", VLC_VAR_GETLIST, &val, &text ) < 0 ) return; /* XXX is it "Root" or "Title" we want here ?" (set 0 by default) */ - root.i_int = 0; + int root = 0; for( int i = 0; i < val.p_list->i_count; i++ ) { if( !strcmp( text.p_list->p_values[i].psz_string, "Title" ) ) - root.i_int = i; + root = i; } var_Change( p_input, "title 0", VLC_VAR_FREELIST, &val, &text ); - var_Set( p_input, "title 0", root ); + var_SetInteger( p_input, "title 0", root ); } } @@ -672,12 +711,11 @@ void InputManager::telexSetPage( int page ) if( hasInput() ) { const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); - const int i_spu_es = var_GetInteger( p_input, "spu-es" ); - if( i_teletext_es >= 0 && i_teletext_es == i_spu_es ) + if( i_teletext_es >= 0 ) { vlc_object_t *p_vbi = (vlc_object_t *) vlc_object_find_name( p_input, - "zvbi", FIND_ANYWHERE ); + "zvbi", FIND_CHILD ); if( p_vbi ) { var_SetInteger( p_vbi, "vbi-page", page ); @@ -694,59 +732,38 @@ void InputManager::telexSetTransparency( bool b_transparentTelextext ) if( hasInput() ) { vlc_object_t *p_vbi = (vlc_object_t *) vlc_object_find_name( p_input, - "zvbi", FIND_ANYWHERE ); + "zvbi", FIND_CHILD ); if( p_vbi ) { - var_SetBool( p_vbi, "vbi-opaque", b_transparentTelextext ); + var_SetBool( p_vbi, "vbi-opaque", !b_transparentTelextext ); vlc_object_release( p_vbi ); emit teletextTransparencyActivated( b_transparentTelextext ); } } } -void InputManager::telexActivation( bool b_enabled ) +void InputManager::activateTeletext( bool b_enable ) { - if( hasInput() ) + vlc_value_t list; + vlc_value_t text; + if( hasInput() && !var_Change( p_input, "teletext-es", VLC_VAR_GETLIST, &list, &text ) ) { - const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); - const int i_spu_es = var_GetInteger( p_input, "spu-es" ); - - /* Teletext is possible. Show the buttons */ - b_enabled = (i_teletext_es >= 0); - emit teletextPossible( b_enabled ); - if( !b_enabled ) return; - - /* If Teletext is selected */ - if( i_teletext_es == i_spu_es ) + if( list.p_list->i_count > 0 ) { - /* Activate the buttons */ - teletextActivated( true ); - - /* Then, find the current page */ - int i_page = 100; - vlc_object_t *p_vbi = (vlc_object_t *) - vlc_object_find_name( p_input, "zvbi", FIND_ANYWHERE ); - if( p_vbi ) + /* Prefer the page 100 if it is present */ + int i; + for( i = 0; i < text.p_list->i_count; i++ ) { - i_page = var_GetInteger( p_vbi, "vbi-page" ); - vlc_object_release( p_vbi ); - emit newTelexPageSet( i_page ); + /* The description is the page number as a string */ + const char *psz_page = text.p_list->p_values[i].psz_string; + if( psz_page && !strcmp( psz_page, "100" ) ) + break; } + if( i >= list.p_list->i_count ) + i = 0; + var_SetInteger( p_input, "spu-es", b_enable ? list.p_list->p_values[i].i_int : -1 ); } - } - else - emit teletextPossible( b_enabled ); -} - -void InputManager::activateTeletext( bool b_enable ) -{ - if( hasInput() ) - { - const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); - if( i_teletext_es >= 0 ) - { - var_SetInteger( p_input, "spu-es", b_enable ? i_teletext_es : -1 ); - } + var_Change( p_input, "teletext-es", VLC_VAR_FREELIST, &list, &text ); } } @@ -771,6 +788,16 @@ void InputManager::faster() var_SetVoid( p_input, "rate-faster" ); } +void InputManager::littlefaster() +{ + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_RATE_FASTER_FINE ); +} + +void InputManager::littleslower() +{ + var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_RATE_SLOWER_FINE ); +} + void InputManager::normalRate() { if( hasInput() ) @@ -783,6 +810,26 @@ void InputManager::setRate( int new_rate ) var_SetInteger( p_input, "rate", new_rate ); } +void InputManager::jumpFwd() +{ + int i_interval = config_GetInt( p_input, "short-jump-size" ); + if( i_interval > 0 ) + { + mtime_t val = (mtime_t)(i_interval) * 1000000L; + var_SetTime( p_input, "time-offset", val ); + } +} + +void InputManager::jumpBwd() +{ + int i_interval = config_GetInt( p_input, "short-jump-size" ); + if( i_interval > 0 ) + { + mtime_t val = -1 *(mtime_t)(i_interval) * 1000000L; + var_SetTime( p_input, "time-offset", val ); + } +} + void InputManager::setAtoB() { if( !timeA ) @@ -793,17 +840,21 @@ void InputManager::setAtoB() { timeB = var_GetTime( THEMIM->getInput(), "time" ); var_SetTime( THEMIM->getInput(), "time" , timeA ); + CONNECT( this, positionUpdated( float, int, int ), + this, AtoBLoop( float, int, int ) ); } else { timeA = 0; timeB = 0; + disconnect( this, SIGNAL( positionUpdated( float, int, int ) ), + this, SLOT( AtoBLoop( float, int, int ) ) ); } emit AtoBchanged( (timeA != 0 ), (timeB != 0 ) ); } /* Function called regularly when in an AtoB loop */ -void InputManager::AtoBLoop( int i_time ) +void InputManager::AtoBLoop( float, int i_time, int ) { if( timeB ) { @@ -827,7 +878,7 @@ MainInputManager::MainInputManager( intf_thread_t *_p_intf ) im = new InputManager( this, p_intf ); var_AddCallback( THEPL, "item-change", ItemChanged, im ); - var_AddCallback( THEPL, "playlist-current", PLItemChanged, this ); + var_AddCallback( THEPL, "item-current", PLItemChanged, this ); var_AddCallback( THEPL, "activity", PLItemChanged, this ); var_AddCallback( p_intf->p_libvlc, "volume-change", VolumeChanged, this ); @@ -838,7 +889,7 @@ 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 ); + var_Change( THEPL, "item-current", VLC_VAR_CHOICESCOUNT, &val, NULL ); IMEvent *event = new IMEvent( ItemChanged_Type, val.i_int); customEvent( event ); @@ -859,7 +910,7 @@ MainInputManager::~MainInputManager() var_DelCallback( THEPL, "activity", PLItemChanged, this ); var_DelCallback( THEPL, "item-change", ItemChanged, im ); - var_DelCallback( THEPL, "playlist-current", PLItemChanged, this ); + var_DelCallback( THEPL, "item-current", PLItemChanged, this ); } vout_thread_t* MainInputManager::getVout() @@ -912,13 +963,18 @@ void MainInputManager::customEvent( QEvent *event ) } else { + /* remove previous stored p_input */ + if( p_input ) + { + vlc_object_release( p_input ); + p_input = NULL; + } /* we are working as a dialogs provider */ playlist_t *p_playlist = pl_Hold( p_intf ); p_input = playlist_CurrentInput( p_playlist ); if( p_input ) { emit inputChanged( p_input ); - vlc_object_release( p_input ); } pl_Release( p_intf ); } @@ -949,6 +1005,11 @@ void MainInputManager::togglePlayPause() getIM()->togglePlayPause(); } +void MainInputManager::activatePlayQuit( bool b_exit ) +{ + var_SetBool( THEPL, "play-and-exit", b_exit ); +} + /* Static callbacks for MIM */ static int PLItemChanged( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param )