📄 input_manager.cpp
字号:
/***************************************************************************** * input_manager.cpp : Manage an input and interact with its GUI elements **************************************************************************** * Copyright (C) 2006-2008 the VideoLAN team * $Id: 62d91be48af147c39475fee317bb63dace6e2515 $ * * Authors: Clément Stenac <zorglub@videolan.org> * Ilkka Ollakka <ileoo@videolan.org> * Jean-Baptiste <jb@videolan.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include "qt4.hpp"#include "input_manager.hpp"#include "dialogs_provider.hpp"static int ChangeSPU( vlc_object_t *p_this, const char *var, vlc_value_t o, vlc_value_t n, void *param );static int ChangeTeletext( vlc_object_t *p_this, const char *var, vlc_value_t o, vlc_value_t n, void *param );static int ItemChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * );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 *, vlc_value_t, vlc_value_t, void * );static int ItemTitleChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * );static int VolumeChanged( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * );/********************************************************************** * InputManager implementation ********************************************************************** * The Input Manager can be the main one around the playlist * But can also be used for VLM dialog or similar **********************************************************************/InputManager::InputManager( QObject *parent, intf_thread_t *_p_intf) : QObject( parent ), p_intf( _p_intf ){ i_old_playing_status = END_S; old_name = ""; artUrl = ""; p_input = NULL; i_rate = 0; i_input_id = 0; b_video = false; b_transparentTelextext = false;}InputManager::~InputManager(){ delInput();}/* Define the Input used. Add the callbacks on input p_input is yield once here */void InputManager::setInput( input_thread_t *_p_input ){ delInput(); p_input = _p_input; if( p_input && !( p_input->b_dead || !vlc_object_alive (p_input) ) ) { vlc_object_yield( p_input ); emit statusChanged( PLAYING_S ); UpdateMeta(); UpdateArt(); UpdateSPU(); UpdateTeletext(); UpdateNavigation(); UpdateVout(); addCallbacks(); i_input_id = input_GetItem( p_input )->i_id; } else { p_input = NULL; i_input_id = 0; emit rateChanged( INPUT_RATE_DEFAULT ); }}/* delete Input if it ever existed. Delete the callbacls on input p_input is released once here */void InputManager::delInput(){ if( p_input ) { delCallbacks(); i_old_playing_status = END_S; i_input_id = 0; old_name = ""; artUrl = ""; b_video = false; emit positionUpdated( -1.0, 0 ,0 ); emit statusChanged( END_S ); emit nameChanged( "" ); emit artChanged( NULL ); emit rateChanged( INPUT_RATE_DEFAULT ); emit voutChanged( false ); vlc_object_release( p_input ); p_input = NULL; UpdateSPU(); UpdateTeletext(); }}/* Add the callbacks on Input. Self explanatory */void InputManager::addCallbacks(){ /* We don't care about: - chapter - programs - audio-delay - spu-delay - bookmark - position, time, length, because they are included in intf-change */ /* src/input/input.c:1629 */ var_AddCallback( p_input, "state", ItemStateChanged, this ); /* src/input/es-out.c:552 */ var_AddCallback( p_input, "spu-es", ChangeSPU, this ); /* emit UpdateStatus so that main_interface updates controls * if there is new videotracks (mpeg-ts)*/ var_AddCallback( p_input, "video-es", ItemStateChanged, this ); /* src/input/es-out.c: */ var_AddCallback( p_input, "teletext-es", ChangeTeletext, this ); /* src/input/input.c:1765 */ var_AddCallback( p_input, "rate-change", ItemRateChanged, this ); /* src/input/input.c:2003 */ 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 */void InputManager::delCallbacks(){ var_DelCallback( p_input, "spu-es", ChangeSPU, this ); var_DelCallback( p_input, "video-es", ItemStateChanged, this ); var_DelCallback( p_input, "teletext-es", ChangeTeletext, this ); var_DelCallback( p_input, "state", ItemStateChanged, this ); 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 */void InputManager::customEvent( QEvent *event ){ int type = event->type(); IMEvent *ple = static_cast<IMEvent *>(event); if ( type != PositionUpdate_Type && type != ItemChanged_Type && type != ItemRateChanged_Type && type != ItemTitleChanged_Type && type != ItemSpuChanged_Type && type != ItemTeletextChanged_Type && type != ItemStateChanged_Type && type != InterfaceVoutUpdate_Type ) return; if( type == ItemStateChanged_Type ) { UpdateNavigation(); UpdateTeletext(); } if( !hasInput() ) return; if( ( type != PositionUpdate_Type && type != ItemRateChanged_Type && type != ItemSpuChanged_Type && type != ItemTeletextChanged_Type && type != ItemStateChanged_Type && type != InterfaceVoutUpdate_Type ) && ( i_input_id != ple->i_id ) ) return; if( type != PositionUpdate_Type ) msg_Dbg( p_intf, "New Event: type %i", type ); /* Actions */ switch( type ) { case PositionUpdate_Type: UpdatePosition(); break; case ItemChanged_Type: UpdateMeta(); UpdateStatus(); UpdateArt(); break; case ItemStateChanged_Type: UpdateStatus(); UpdateNavigation(); UpdateMeta(); break; case ItemTitleChanged_Type: UpdateNavigation(); UpdateMeta(); break; case ItemRateChanged_Type: UpdateRate(); break; case ItemSpuChanged_Type: UpdateSPU(); break; case ItemTeletextChanged_Type: UpdateTeletext(); break; case InterfaceVoutUpdate_Type: UpdateVout(); break; }}void InputManager::UpdatePosition(){ /* Update position */ int i_length, i_time; /* Int is enough, since we store seconds */ float f_pos; i_length = var_GetTime( p_input , "length" ) / 1000000; i_time = var_GetTime( p_input , "time") / 1000000; f_pos = var_GetFloat( p_input , "position" ); emit positionUpdated( f_pos, i_time, i_length );}void InputManager::UpdateNavigation(){ /* Update navigation status */ vlc_value_t val; val.i_int = 0; if( hasInput() ) var_Change( p_input, "title", VLC_VAR_CHOICESCOUNT, &val, NULL ); if( val.i_int > 0 ) { val.i_int = 0; var_Change( p_input, "chapter", VLC_VAR_CHOICESCOUNT, &val, NULL ); emit navigationChanged( (val.i_int > 0) ? 1 : 2 ); } else { emit navigationChanged( 0 ); }}void InputManager::UpdateStatus(){ /* Update playing status */ vlc_value_t val; val.i_int = 0; var_Get( p_input, "state", &val ); if( i_old_playing_status != val.i_int ) { i_old_playing_status = val.i_int; emit statusChanged( val.i_int ); }}void InputManager::UpdateRate(){ /* Update Rate */ int i_new_rate = var_GetInteger( p_input, "rate"); if( i_new_rate != i_rate ) { i_rate = i_new_rate; /* Update rate */ emit rateChanged( i_rate ); }}void InputManager::UpdateMeta(){ /* Update text, name and nowplaying */ QString text; /* Try to get the Title, then the Name */ char *psz_name = input_item_GetTitle( input_GetItem( p_input ) ); if( EMPTY_STR( psz_name ) ) { free( psz_name ); psz_name = input_item_GetName( input_GetItem( p_input ) ); } /* Try to get the nowplaying */ char *psz_nowplaying = input_item_GetNowPlaying( input_GetItem( p_input ) ); if( !EMPTY_STR( psz_nowplaying ) ) { text.sprintf( "%s - %s", psz_nowplaying, psz_name ); } else /* Do it ourself */ { char *psz_artist = input_item_GetArtist( input_GetItem( p_input ) ); if( !EMPTY_STR( psz_artist ) ) text.sprintf( "%s - %s", psz_artist, psz_name ); else text.sprintf( "%s", psz_name ); free( psz_artist ); } /* Free everything */ free( psz_name ); free( psz_nowplaying ); /* If we have Nothing */ if( text.isEmpty() ) { psz_name = input_item_GetURI( input_GetItem( p_input ) ); text.sprintf( "%s", psz_name ); text = text.remove( 0, text.lastIndexOf( DIR_SEP ) + 1 ); free( psz_name ); } if( old_name != text ) { emit nameChanged( text ); old_name=text; }}bool InputManager::hasAudio(){ if( hasInput() ) { vlc_value_t val; var_Change( p_input, "audio-es", VLC_VAR_CHOICESCOUNT, &val, NULL ); return val.i_int > 0; } return false;}void InputManager::UpdateSPU(){ UpdateTeletext();}void InputManager::UpdateTeletext(){ if( hasInput() ) telexToggle( var_GetInteger( p_input, "teletext-es" ) >= 0 ); else telexToggle( false );}void InputManager::UpdateVout(){ if( hasInput() ) { bool b_old_video = b_video; 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 ); if( !!b_old_video != !!b_video ) emit voutChanged( b_video ); }}void InputManager::UpdateArt(){ /* Update Art meta */ emit artChanged( input_GetItem( p_input ) );}/* User update of the slider */void InputManager::sliderUpdate( float new_pos ){ if( hasInput() ) var_SetFloat( p_input, "position", new_pos );}/* User togglePlayPause */void InputManager::togglePlayPause(){ vlc_value_t state; var_Get( p_input, "state", &state ); state.i_int = ( state.i_int != PLAYING_S ) ? PLAYING_S : PAUSE_S; var_Set( p_input, "state", state );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -