⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 input_manager.cpp

📁 VLC Player Source Code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * 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 + -