📄 vlcwrapper.cpp
字号:
/***************************************************************************** * 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 + -