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

📄 vlcproc.cpp

📁 uclinux 下的vlc播放器源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * vlcproc.cpp ***************************************************************************** * Copyright (C) 2003 the VideoLAN team * $Id: vlcproc.cpp 18010 2006-11-24 09:05:31Z damienf $ * * Authors: Cyril Deguet     <asmax@via.ecp.fr> *          Olivier Teuli�e <ipkiss@via.ecp.fr> * * 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. *****************************************************************************/#include <vlc/aout.h>#include <vlc/vout.h>#include <aout_internal.h>#include "vlcproc.hpp"#include "os_factory.hpp"#include "os_timer.hpp"#include "var_manager.hpp"#include "theme.hpp"#include "window_manager.hpp"#include "../commands/async_queue.hpp"#include "../commands/cmd_change_skin.hpp"#include "../commands/cmd_show_window.hpp"#include "../commands/cmd_quit.hpp"#include "../commands/cmd_resize.hpp"#include "../commands/cmd_vars.hpp"#include "../commands/cmd_dialogs.hpp"#include "../utils/var_bool.hpp"#include <sstream>VlcProc *VlcProc::instance( intf_thread_t *pIntf ){    if( pIntf->p_sys->p_vlcProc == NULL )    {        pIntf->p_sys->p_vlcProc = new VlcProc( pIntf );    }    return pIntf->p_sys->p_vlcProc;}void VlcProc::destroy( intf_thread_t *pIntf ){    if( pIntf->p_sys->p_vlcProc )    {        delete pIntf->p_sys->p_vlcProc;        pIntf->p_sys->p_vlcProc = NULL;    }}VlcProc::VlcProc( intf_thread_t *pIntf ): SkinObject( pIntf ),    m_varVoutSize( pIntf ), m_varEqBands( pIntf ),    m_pVout( NULL ), m_pAout( NULL ), m_cmdManage( this ){    // Create a timer to poll the status of the vlc    OSFactory *pOsFactory = OSFactory::instance( pIntf );    m_pTimer = pOsFactory->createOSTimer( m_cmdManage );    m_pTimer->start( 100, false );    // Create and register VLC variables    VarManager *pVarManager = VarManager::instance( getIntf() );#define REGISTER_VAR( var, type, name ) \    var = VariablePtr( new type( getIntf() ) ); \    pVarManager->registerVar( var, name );    /* Playlist variables */    REGISTER_VAR( m_cPlaylist, Playlist, "playlist" )    pVarManager->registerVar( getPlaylistVar().getPositionVarPtr(),                              "playlist.slider" );    REGISTER_VAR( m_cVarRandom, VarBoolImpl, "playlist.isRandom" )    REGISTER_VAR( m_cVarLoop, VarBoolImpl, "playlist.isLoop" )    REGISTER_VAR( m_cVarRepeat, VarBoolImpl, "playlist.isRepeat" )    REGISTER_VAR( m_cPlaytree, Playtree, "playtree" )    pVarManager->registerVar( getPlaytreeVar().getPositionVarPtr(),                              "playtree.slider" );    pVarManager->registerVar( m_cVarRandom, "playtree.isRandom" );    pVarManager->registerVar( m_cVarLoop, "playtree.isLoop" );    REGISTER_VAR( m_cVarPlaying, VarBoolImpl, "vlc.isPlaying" )    REGISTER_VAR( m_cVarStopped, VarBoolImpl, "vlc.isStopped" )    REGISTER_VAR( m_cVarPaused, VarBoolImpl, "vlc.isPaused" )    /* Input variables */    pVarManager->registerVar( m_cVarRepeat, "playtree.isRepeat" );    REGISTER_VAR( m_cVarTime, StreamTime, "time" )    REGISTER_VAR( m_cVarSeekable, VarBoolImpl, "vlc.isSeekable" )    REGISTER_VAR( m_cVarDvdActive, VarBoolImpl, "dvd.isActive" )    /* Vout variables */    REGISTER_VAR( m_cVarFullscreen, VarBoolImpl, "vlc.isFullscreen" )    REGISTER_VAR( m_cVarHasVout, VarBoolImpl, "vlc.hasVout" )    /* Aout variables */    REGISTER_VAR( m_cVarHasAudio, VarBoolImpl, "vlc.hasAudio" )    REGISTER_VAR( m_cVarVolume, Volume, "volume" )    REGISTER_VAR( m_cVarMute, VarBoolImpl, "vlc.isMute" )    REGISTER_VAR( m_cVarEqualizer, VarBoolImpl, "equalizer.isEnabled" )    REGISTER_VAR( m_cVarEqPreamp, EqualizerPreamp, "equalizer.preamp" )#undef REGISTER_VAR    m_cVarStreamName = VariablePtr( new VarText( getIntf(), false ) );    pVarManager->registerVar( m_cVarStreamName, "streamName" );    m_cVarStreamURI = VariablePtr( new VarText( getIntf(), false ) );    pVarManager->registerVar( m_cVarStreamURI, "streamURI" );    m_cVarStreamBitRate = VariablePtr( new VarText( getIntf(), false ) );    pVarManager->registerVar( m_cVarStreamBitRate, "bitrate" );    m_cVarStreamSampleRate = VariablePtr( new VarText( getIntf(), false ) );    pVarManager->registerVar( m_cVarStreamSampleRate, "samplerate" );    // Register the equalizer bands    for( int i = 0; i < EqualizerBands::kNbBands; i++)    {        stringstream ss;        ss << "equalizer.band(" << i << ")";        pVarManager->registerVar( m_varEqBands.getBand( i ), ss.str() );    }    // XXX WARNING XXX    // The object variable callbacks are called from other VLC threads,    // so they must put commands in the queue and NOT do anything else    // (X11 calls are not reentrant)    // Called when the playlist changes    var_AddCallback( pIntf->p_sys->p_playlist, "intf-change",                     onIntfChange, this );    // Called when a playlist item is added    var_AddCallback( pIntf->p_sys->p_playlist, "item-append",                     onItemAppend, this );    // Called when a playlist item is deleted    // TODO: properly handle item-deleted    var_AddCallback( pIntf->p_sys->p_playlist, "item-deleted",                     onItemDelete, this );    // Called when the "interface shower" wants us to show the skin    var_AddCallback( pIntf->p_sys->p_playlist, "intf-show",                     onIntfShow, this );    // Called when the current played item changes    var_AddCallback( pIntf->p_sys->p_playlist, "playlist-current",                     onPlaylistChange, this );    // Called when a playlist item changed    var_AddCallback( pIntf->p_sys->p_playlist, "item-change",                     onItemChange, this );    // Called when our skins2 demux wants us to load a new skin    var_AddCallback( pIntf, "skin-to-load", onSkinToLoad, this );    // Called when we have an interaction dialog to display    var_Create( pIntf, "interaction", VLC_VAR_ADDRESS );    var_AddCallback( pIntf, "interaction", onInteraction, this );    pIntf->b_interaction = VLC_TRUE;    // Callbacks for vout requests    getIntf()->pf_request_window = &getWindow;    getIntf()->pf_release_window = &releaseWindow;    getIntf()->pf_control_window = &controlWindow;    getIntf()->p_sys->p_input = NULL;}VlcProc::~VlcProc(){    m_pTimer->stop();    delete( m_pTimer );    if( getIntf()->p_sys->p_input )    {        vlc_object_release( getIntf()->p_sys->p_input );    }    // Callbacks for vout requests    getIntf()->pf_request_window = NULL;    getIntf()->pf_release_window = NULL;    getIntf()->pf_control_window = NULL;    var_DelCallback( getIntf()->p_sys->p_playlist, "intf-change",                     onIntfChange, this );    var_DelCallback( getIntf()->p_sys->p_playlist, "item-append",                     onItemAppend, this );    var_DelCallback( getIntf()->p_sys->p_playlist, "item-deleted",                     onItemDelete, this );    var_DelCallback( getIntf()->p_sys->p_playlist, "intf-show",                     onIntfShow, this );    var_DelCallback( getIntf()->p_sys->p_playlist, "playlist-current",                     onPlaylistChange, this );    var_DelCallback( getIntf()->p_sys->p_playlist, "item-change",                     onItemChange, this );    var_DelCallback( getIntf(), "skin-to-load", onSkinToLoad, this );}void VlcProc::registerVoutWindow( void *pVoutWindow ){    m_handleSet.insert( pVoutWindow );    // Reparent the vout window    if( m_pVout )    {        if( vout_Control( m_pVout, VOUT_REPARENT, 0 ) != VLC_SUCCESS )            vout_Control( m_pVout, VOUT_CLOSE );    }}void VlcProc::unregisterVoutWindow( void *pVoutWindow ){    m_handleSet.erase( pVoutWindow );}void VlcProc::dropVout(){    if( m_pVout )    {        vout_Control( m_pVout, VOUT_CLOSE );        m_pVout = NULL;    }}void VlcProc::manage(){    // Did the user request to quit vlc ?    if( getIntf()->b_die || getIntf()->p_vlc->b_die )    {        CmdQuit *pCmd = new CmdQuit( getIntf() );        AsyncQueue *pQueue = AsyncQueue::instance( getIntf() );        pQueue->push( CmdGenericPtr( pCmd ) );    }    refreshPlaylist();    refreshAudio();    refreshInput();}void VlcProc::CmdManage::execute(){    // Just forward to VlcProc    m_pParent->manage();}void VlcProc::refreshAudio(){    char *pFilters = NULL;    // Check if the audio output has changed    aout_instance_t *pAout = (aout_instance_t *)vlc_object_find( getIntf(),            VLC_OBJECT_AOUT, FIND_ANYWHERE );    if( pAout )    {        if( pAout != m_pAout )        {            // Register the equalizer callbacks            if( !var_AddCallback( pAout, "equalizer-bands",                                  onEqBandsChange, this ) &&                !var_AddCallback( pAout, "equalizer-preamp",                                  onEqPreampChange, this ) )            {                m_pAout = pAout;                //char * psz_bands = var_GetString( p_aout, "equalizer-bands" );            }        }        // Get the audio filters        pFilters = var_GetString( pAout, "audio-filter" );        vlc_object_release( pAout );    }    else    {        // Get the audio filters        pFilters = config_GetPsz( getIntf(), "audio-filter" );    }    // Refresh sound volume    audio_volume_t volume;    aout_VolumeGet( getIntf(), &volume );    Volume *pVolume = (Volume*)m_cVarVolume.get();    pVolume->set( (double)volume * 2.0 / AOUT_VOLUME_MAX );    // Set the mute variable    VarBoolImpl *pVarMute = (VarBoolImpl*)m_cVarMute.get();    pVarMute->set( volume == 0 );    // Refresh the equalizer variable    VarBoolImpl *pVarEqualizer = (VarBoolImpl*)m_cVarEqualizer.get();    pVarEqualizer->set( pFilters && strstr( pFilters, "equalizer" ) );}void VlcProc::refreshPlaylist(){    // Refresh the random variable    VarBoolImpl *pVarRandom = (VarBoolImpl*)m_cVarRandom.get();    vlc_value_t val;    var_Get( getIntf()->p_sys->p_playlist, "random", &val );    pVarRandom->set( val.b_bool != 0 );    // Refresh the loop variable    VarBoolImpl *pVarLoop = (VarBoolImpl*)m_cVarLoop.get();    var_Get( getIntf()->p_sys->p_playlist, "loop", &val );    pVarLoop->set( val.b_bool != 0 );    // Refresh the repeat variable    VarBoolImpl *pVarRepeat = (VarBoolImpl*)m_cVarRepeat.get();    var_Get( getIntf()->p_sys->p_playlist, "repeat", &val );    pVarRepeat->set( val.b_bool != 0 );}void VlcProc::refreshInput(){    StreamTime *pTime = (StreamTime*)m_cVarTime.get();    VarBoolImpl *pVarSeekable = (VarBoolImpl*)m_cVarSeekable.get();    VarBoolImpl *pVarDvdActive = (VarBoolImpl*)m_cVarDvdActive.get();    VarBoolImpl *pVarHasVout = (VarBoolImpl*)m_cVarHasVout.get();    VarBoolImpl *pVarHasAudio = (VarBoolImpl*)m_cVarHasAudio.get();    VarText *pBitrate = (VarText*)m_cVarStreamBitRate.get();    VarText *pSampleRate = (VarText*)m_cVarStreamSampleRate.get();    VarBoolImpl *pVarFullscreen = (VarBoolImpl*)m_cVarFullscreen.get();    VarBoolImpl *pVarPlaying = (VarBoolImpl*)m_cVarPlaying.get();    VarBoolImpl *pVarStopped = (VarBoolImpl*)m_cVarStopped.get();    VarBoolImpl *pVarPaused = (VarBoolImpl*)m_cVarPaused.get();    input_thread_t *pInput = getIntf()->p_sys->p_input;    // Update the input    if( getIntf()->p_sys->p_input == NULL )    {        getIntf()->p_sys->p_input = getIntf()->p_sys->p_playlist->p_input;        if( getIntf()->p_sys->p_input )            vlc_object_yield( getIntf()->p_sys->p_input );    }    else if( getIntf()->p_sys->p_input->b_dead )    {        vlc_object_release( getIntf()->p_sys->p_input );        getIntf()->p_sys->p_input = NULL;    }    if( pInput && !pInput->b_die )    {        // Refresh time variables        vlc_value_t pos;        var_Get( pInput, "position", &pos );        pTime->set( pos.f_float, false );        pVarSeekable->set( pos.f_float != 0.0 );        // Refresh DVD detection        vlc_value_t chapters_count;        var_Change( pInput, "chapter", VLC_VAR_CHOICESCOUNT,                        &chapters_count, NULL );        pVarDvdActive->set( chapters_count.i_int > 0 );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -