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

📄 vlcwrapper.cpp

📁 VLC媒体播放程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************** * VlcWrapper.cpp: BeOS plugin for vlc (derived from MacOS X port) ***************************************************************************** * Copyright (C) 2001 VideoLAN * $Id: VlcWrapper.cpp,v 1.42 2004/01/17 12:28:57 gbazin Exp $ * * Authors: Florian G. Pflug <fgp@phlo.org> *          Jon Lech Johansen <jon-vl@nanocrew.net> *          Tony Casltey <tony@castley.net> *          Stephan Aßmus <stippi@yellowbites.com> *          Eric Petit <titer@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., 59 Temple Place - Suite 330, Boston, MA  02111, USA. *****************************************************************************/#include <AppKit.h>#include <InterfaceKit.h>#include <SupportKit.h>#include <vlc/vlc.h>#include <vlc/intf.h>#include <vlc/vout.h>extern "C"{  #include <input_ext-plugins.h> // needed here when compiling without plugins  #include <audio_output.h>  #include <aout_internal.h>}#include "VlcWrapper.h"#include "MsgVals.h"const char * _AddEllipsis( char * string ){    char * temp;    temp = (char*) calloc( strlen( string ) + 4, 1 );    sprintf( temp, "%s%s", string, B_UTF8_ELLIPSIS );    return temp;}/* constructor */VlcWrapper::VlcWrapper( intf_thread_t *p_interface ){    p_intf = p_interface;    p_input = NULL;    p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,                                                FIND_ANYWHERE );}/* destructor */VlcWrapper::~VlcWrapper(){    if( p_input )        vlc_object_release( p_input );    if( p_playlist )        vlc_object_release( p_playlist );}/* UpdateInput: updates p_input */void VlcWrapper::UpdateInput(){    if( !p_input )        p_input = (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT,                                                     FIND_ANYWHERE );            if( p_input )        if( p_input->b_dead )        {            vlc_object_release( p_input );            p_input = NULL;        }}/*************************** * input infos and control * ***************************/bool VlcWrapper::HasInput(){    return ( p_input != NULL );}int VlcWrapper::InputStatus(){    if( !p_input )    {        return UNDEF_S;    }        vlc_value_t state;    var_Get( p_input, "state", &state );    return state.i_int;}int VlcWrapper::InputRate(){    if( !p_input )    {        return DEFAULT_RATE;    }        return p_input->stream.control.i_rate;}void VlcWrapper::InputSetRate( int rate ){    if( !p_input )    {        return;    }    input_SetRate( p_input, rate );}BList * VlcWrapper::GetChannels( int i_cat ){    if( p_input )    {        unsigned int i;        uint32 what;        const char* fieldName;        switch( i_cat )        {            case AUDIO_ES:            {                what = SELECT_CHANNEL;                fieldName = "channel";                break;            }            case SPU_ES:            {                what = SELECT_SUBTITLE;                fieldName = "subtitle";                break;            }            default:            return NULL;       }        vlc_mutex_lock( &p_input->stream.stream_lock );              /* find which track is currently playing */        es_descriptor_t *p_es = NULL;        for( i = 0; i < p_input->stream.i_selected_es_number; i++ )        {            if( p_input->stream.pp_selected_es[i]->i_cat == i_cat )                p_es = p_input->stream.pp_selected_es[i];        }                /* build a list of all tracks */        BList *list = new BList( p_input->stream.i_es_number );        BMenuItem *menuItem;        BMessage *message;        char *trackName;                /* "None" */        message = new BMessage( what );        message->AddInt32( fieldName, -1 );        menuItem = new BMenuItem( _("None"), message );        if( !p_es )            menuItem->SetMarked( true );        list->AddItem( menuItem );                for( i = 0; i < p_input->stream.i_es_number; i++ )        {            if( p_input->stream.pp_es[i]->i_cat == i_cat )            {                message = new BMessage( what );                message->AddInt32( fieldName, i );                if( !p_input->stream.pp_es[i]->psz_desc ||                    !*p_input->stream.pp_es[i]->psz_desc )                    trackName = _("<unknown>");                else                    trackName = strdup( p_input->stream.pp_es[i]->psz_desc );                menuItem = new BMenuItem( trackName, message );                if( p_input->stream.pp_es[i] == p_es )                    menuItem->SetMarked( true );                list->AddItem( menuItem );            }        }                vlc_mutex_unlock( &p_input->stream.stream_lock );        return list;    }    return NULL;}void VlcWrapper::ToggleLanguage( int i_language ){    es_descriptor_t * p_es = NULL;    es_descriptor_t * p_es_old = NULL;    vlc_mutex_lock( &p_input->stream.stream_lock );    for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ )    {        if( p_input->stream.pp_selected_es[i]->i_cat == AUDIO_ES )        {            p_es_old = p_input->stream.pp_selected_es[i];            break;        }    }    vlc_mutex_unlock( &p_input->stream.stream_lock );        if( i_language != -1 )    {        p_es = p_input->stream.pp_es[i_language];    }    if( p_es == p_es_old )    {        return;    }    if( p_es_old )    {        input_ToggleES( p_input, p_es_old, VLC_FALSE );    }    if( p_es )    {        input_ToggleES( p_input, p_es, VLC_TRUE );    }}void VlcWrapper::ToggleSubtitle( int i_subtitle ){    es_descriptor_t * p_es = NULL;    es_descriptor_t * p_es_old = NULL;    vlc_mutex_lock( &p_input->stream.stream_lock );    for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ )    {        if( p_input->stream.pp_selected_es[i]->i_cat == SPU_ES )        {            p_es_old = p_input->stream.pp_selected_es[i];            break;        }    }    vlc_mutex_unlock( &p_input->stream.stream_lock );        if( i_subtitle != -1 )    {        p_es = p_input->stream.pp_es[i_subtitle];    }    if( p_es == p_es_old )    {        return;    }    if( p_es_old )    {        input_ToggleES( p_input, p_es_old, VLC_FALSE );    }    if( p_es )    {        input_ToggleES( p_input, p_es, VLC_TRUE );    }}const char * VlcWrapper::GetTimeAsString(){    static char psz_time[ MSTRTIME_MAX_SIZE ];            if( !p_input )    {        return ("-:--:--");    }            vlc_value_t time;    var_Get( p_input, "time", &time );        mtime_t seconds = time.i_time / 1000000;    sprintf( psz_time, "%d:%02d:%02d",             (int) ( seconds / (60 * 60 ) ),             (int) ( ( seconds / 60 ) % 60 ),             (int) ( seconds % 60 ) );    return psz_time;}float VlcWrapper::GetTimeAsFloat(){    if( !p_input )    {        return 0.0;    }        vlc_value_t pos;    var_Get( p_input, "position", &pos );    return pos.f_float;}void VlcWrapper::SetTimeAsFloat( float f_position ){    if( !p_input )    {        return;    }        vlc_value_t pos;    pos.f_float = f_position / SEEKSLIDER_RANGE;    var_Set( p_input, "position", pos );}bool VlcWrapper::IsPlaying(){	bool playing = false;	if( p_input )	{		switch( p_input->stream.control.i_status )		{			case PLAYING_S:			case FORWARD_S:			case BACKWARD_S:				playing = true;	            break;			case PAUSE_S:			case UNDEF_S:			default:				break;		}	}	return playing;}/************ * playlist * ************/void VlcWrapper::OpenFiles( BList* o_files, bool replace, int32 index ){	if ( o_files && o_files->CountItems() > 0)	{	    int size = PlaylistSize();		bool wasEmpty = ( size < 1 );		if ( index == -1 )			index = PLAYLIST_END;		int mode = index == PLAYLIST_END ? PLAYLIST_APPEND : PLAYLIST_INSERT;		    /* delete current playlist */	    if( replace )	    {	        for( int i = 0; i < size; i++ )	        {	            playlist_Delete( p_playlist, 0 );	        }	    }		    /* insert files */	    int32 count = o_files->CountItems();	    for ( int32 i = count - 1; i >= 0; i-- )	    {	    	if ( BString* o_file = (BString *)o_files->RemoveItem( i ) )	    	{		        playlist_Add( p_playlist, o_file->String(),				      o_file->String(), mode, index );		        if ( mode == PLAYLIST_INSERT )		        	index++;		        delete o_file;	    	}	    }	    // TODO: implement a user setting	    // if to start automatically	    /* eventually restart playing */	    if( replace || wasEmpty )	    {	        playlist_Stop( p_playlist );	        playlist_Play( p_playlist );	    }	}} void VlcWrapper::OpenDisc(BString o_type, BString o_device, int i_title, int i_chapter){    if( config_GetInt( p_intf, "beos-dvdmenus" ) )        o_device.Prepend( "dvdplay:" );    else        o_device.Prepend( "dvdold:" );    playlist_Add( p_playlist, o_device.String(), o_device.String(),                  PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END );}int VlcWrapper::PlaylistSize(){    vlc_mutex_lock( &p_playlist->object_lock );    int i_size = p_playlist->i_size;    vlc_mutex_unlock( &p_playlist->object_lock );    return i_size;}char * VlcWrapper::PlaylistItemName( int i ){   return p_playlist->pp_items[i]->psz_name;}int VlcWrapper::PlaylistCurrent(){    return p_playlist->i_index;}bool VlcWrapper::PlaylistPlay(){    if( PlaylistSize() )    {        playlist_Play( p_playlist );    }    return( true );}void VlcWrapper::PlaylistPause(){    if( p_input )    {        input_SetStatus( p_input, INPUT_STATUS_PAUSE );    }}void VlcWrapper::PlaylistStop(){    playlist_Stop( p_playlist );}void VlcWrapper::PlaylistNext(){    playlist_Next( p_playlist );}void VlcWrapper::PlaylistPrev(){    playlist_Prev( p_playlist );}void VlcWrapper::GetPlaylistInfo( int32& currentIndex, int32& maxIndex ){	currentIndex = -1;	maxIndex = -1;	if ( p_playlist )	{	    vlc_mutex_lock( &p_playlist->object_lock );		maxIndex = p_playlist->i_size;		if ( maxIndex > 0 )			currentIndex = p_playlist->i_index/* + 1 -> why?!?*/;		else			maxIndex = -1;	    vlc_mutex_unlock( &p_playlist->object_lock );	}}void VlcWrapper::PlaylistJumpTo( int pos ){    playlist_Goto( p_playlist, pos );}void VlcWrapper::GetNavCapabilities( bool *canSkipPrev, bool *canSkipNext ){	if ( canSkipPrev && canSkipNext )	{		// init the parameters		*canSkipPrev = false;		*canSkipNext = false;		// get playlist info		int pos = PlaylistCurrent();		int size = PlaylistSize();		// see if we have got a stream going				if ( p_input )		{			vlc_mutex_lock( &p_input->stream.stream_lock );			bool hasTitles = p_input->stream.i_area_nb > 1;			int numChapters = p_input->stream.p_selected_area->i_part_nb;			bool hasChapters = numChapters > 1;			// first, look for chapters			if ( hasChapters )			{				*canSkipPrev = p_input->stream.p_selected_area->i_part > 0;				*canSkipNext = p_input->stream.p_selected_area->i_part <									 p_input->stream.p_selected_area->i_part_nb - 1;			}			// if one of the skip capabilities is false,			// make it depend on titles instead			if ( !*canSkipPrev && hasTitles )				*canSkipPrev = p_input->stream.p_selected_area->i_id > 1;			if ( !*canSkipNext && hasTitles )				*canSkipNext = p_input->stream.p_selected_area->i_id <				                   p_input->stream.i_area_nb - 1;			vlc_mutex_unlock( &p_input->stream.stream_lock );		}		// last but not least, make capabilities depend on playlist		if ( !*canSkipPrev )			*canSkipPrev = pos > 0;		if ( !*canSkipNext )

⌨️ 快捷键说明

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