📄 input_manager.cpp
字号:
emit statusChanged( state.i_int );}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 ); }}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 ); }}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; 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; } var_Change( p_input, "title 0", VLC_VAR_FREELIST, &val, &text ); var_Set( p_input, "title 0", root ); }}void InputManager::telexGotoPage( 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 ) { vlc_object_t *p_vbi; p_vbi = (vlc_object_t *) vlc_object_find_name( p_input, "zvbi", FIND_ANYWHERE ); if( p_vbi ) { var_SetInteger( p_vbi, "vbi-page", page ); vlc_object_release( p_vbi ); } } } emit setNewTelexPage( page );}void InputManager::telexToggle( bool b_enabled ){ if( hasInput() ) { const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); const int i_spu_es = var_GetInteger( p_input, "spu-es" ); b_enabled = (i_teletext_es >= 0); emit teletextEnabled( b_enabled ); if( b_enabled && (i_teletext_es == i_spu_es) ) { vlc_object_t *p_vbi; int i_page = 100; p_vbi = (vlc_object_t *) vlc_object_find_name( p_input, "zvbi", FIND_ANYWHERE ); if( p_vbi ) { i_page = var_GetInteger( p_vbi, "vbi-page" ); vlc_object_release( p_vbi ); i_page = b_enabled ? i_page : 0; telexGotoPage( i_page ); } } } else emit teletextEnabled( b_enabled );}void InputManager::telexToggleButtons(){ if( hasInput() ) { const int i_teletext_es = var_GetInteger( p_input, "teletext-es" ); if( i_teletext_es >= 0 ) { const int i_spu_es = var_GetInteger( p_input, "spu-es" ); if( i_teletext_es == i_spu_es ) var_SetInteger( p_input, "spu-es", -1 ); else var_SetInteger( p_input, "spu-es", i_teletext_es ); emit toggleTelexButtons(); } }}void InputManager::telexSetTransparency(){ if( hasInput() ) { vlc_object_t *p_vbi; p_vbi = (vlc_object_t *) vlc_object_find_name( p_input, "zvbi", FIND_ANYWHERE ); if( p_vbi ) { var_SetBool( p_vbi, "vbi-opaque", b_transparentTelextext ); b_transparentTelextext = !b_transparentTelextext; vlc_object_release( p_vbi ); } } emit toggleTelexTransparency();}void InputManager::slower(){ if( hasInput() ) var_SetVoid( p_input, "rate-slower" );}void InputManager::faster(){ if( hasInput() ) var_SetVoid( p_input, "rate-faster" );}void InputManager::normalRate(){ if( hasInput() ) var_SetInteger( p_input, "rate", INPUT_RATE_DEFAULT );}void InputManager::setRate( int new_rate ){ if( hasInput() ) var_SetInteger( p_input, "rate", new_rate );}/********************************************************************** * MainInputManager implementation. Wrap an input manager and * take care of updating the main playlist input. * Used in the main playlist Dialog **********************************************************************/MainInputManager * MainInputManager::instance = NULL;MainInputManager::MainInputManager( intf_thread_t *_p_intf ) : QObject(NULL), p_intf( _p_intf ){ p_input = NULL; 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( p_intf->p_libvlc, "volume-change", VolumeChanged, this ); /* Warn our embedded IM about input changes */ CONNECT( this, inputChanged( input_thread_t * ), im, setInput( input_thread_t * ) ); /* 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) );}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, "activity", PLItemChanged, this ); var_DelCallback( THEPL, "item-change", ItemChanged, im );// var_DelCallback( THEPL, "item-change", PLItemChanged, this ); var_DelCallback( THEPL, "playlist-current", PLItemChanged, this );}void MainInputManager::customEvent( QEvent *event ){ int type = event->type(); if ( type != ItemChanged_Type && type != VolumeChanged_Type ) return; // msg_Dbg( p_intf, "New MainIM Event of type: %i", type ); if( type == VolumeChanged_Type ) { emit volumeChanged(); return; } /* Should be PLItemChanged Event */ if( VLC_OBJECT_INTF == p_intf->i_object_type ) /* FIXME: don't use object type */ { vlc_mutex_lock( &p_intf->change_lock ); if( p_input && ( p_input->b_dead || !vlc_object_alive (p_input) ) ) { 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 ) { QPL_LOCK; p_input = THEPL->p_input; if( p_input && !( !vlc_object_alive (p_input) || p_input->b_dead) ) { vlc_object_yield( p_input ); var_AddCallback( p_input, "state", PLItemChanged, this ); emit inputChanged( p_input ); } else p_input = NULL; QPL_UNLOCK; } vlc_mutex_unlock( &p_intf->change_lock ); } else { /* we are working as a dialogs provider */ playlist_t *p_playlist = pl_Yield( p_intf ); p_input = playlist_CurrentInput( p_playlist ); if( p_input ) { emit inputChanged( p_input ); vlc_object_release( p_input ); } pl_Release( p_intf ); }}/* Playlist Control functions */void MainInputManager::stop(){ playlist_Stop( THEPL );}void MainInputManager::next(){ playlist_Next( THEPL );}void MainInputManager::prev(){ playlist_Prev( THEPL );}void MainInputManager::togglePlayPause(){ if( p_input == NULL ) { playlist_Play( THEPL ); return; } getIM()->togglePlayPause();}bool MainInputManager::teletextState(){ im = getIM(); if( im->hasInput() ) { const int i_teletext_es = var_GetInteger( getInput(), "teletext-es" ); const int i_spu_es = var_GetInteger( getInput(), "spu-es" ); return i_teletext_es >= 0 && i_teletext_es == i_spu_es; } return false;}/* Static callbacks *//* IM */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; counter = ++counter % 4; if(!counter) return VLC_SUCCESS; IMEvent *event = new IMEvent( PositionUpdate_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); 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 ){ InputManager *im = (InputManager*)param; IMEvent *event = new IMEvent( ItemStateChanged_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int ItemRateChanged( 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( ItemRateChanged_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int ItemTitleChanged( 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( ItemTitleChanged_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int ItemChanged( 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( ItemChanged_Type, newval.i_int ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int ChangeSPU( vlc_object_t *p_this, const char *var, vlc_value_t o, vlc_value_t n, void *param ){ InputManager *im = (InputManager*)param; IMEvent *event = new IMEvent( ItemSpuChanged_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int ChangeTeletext( vlc_object_t *p_this, const char *var, vlc_value_t o, vlc_value_t n, void *param ){ InputManager *im = (InputManager*)param; IMEvent *event = new IMEvent( ItemTeletextChanged_Type, 0 ); QApplication::postEvent( im, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}/* MIM */static int PLItemChanged( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ){ MainInputManager *mim = (MainInputManager*)param; IMEvent *event = new IMEvent( ItemChanged_Type, newval.i_int ); QApplication::postEvent( mim, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}static int VolumeChanged( vlc_object_t *p_this, const char *psz_var, vlc_value_t oldval, vlc_value_t newval, void *param ){ MainInputManager *mim = (MainInputManager*)param; IMEvent *event = new IMEvent( VolumeChanged_Type, newval.i_int ); QApplication::postEvent( mim, static_cast<QEvent*>(event) ); return VLC_SUCCESS;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -