From 2a2cf8b1b96d01047750f6c4d6de6e8a92fdba9c Mon Sep 17 00:00:00 2001 From: Tony Castley Date: Tue, 23 Jul 2002 12:42:17 +0000 Subject: [PATCH] Changes to ensure BeOS plugins compile and function Implemented a intf_vlc_wrapper to "shield" the BeOS code from the underlying vlc structurs, yet to be completed. Attempted to fix subtitle and audio selection, currently not working. --- plugins/beos/InterfaceWindow.cpp | 395 ++++++++----------------- plugins/beos/InterfaceWindow.h | 7 +- plugins/beos/MsgVals.h | 4 +- plugins/beos/VideoWindow.h | 7 +- plugins/beos/intf_beos.cpp | 45 ++- plugins/beos/intf_vlc_wrapper.cpp | 462 ++++++++++++++++++++++++++++++ plugins/beos/intf_vlc_wrapper.h | 121 ++++++++ 7 files changed, 737 insertions(+), 304 deletions(-) create mode 100644 plugins/beos/intf_vlc_wrapper.cpp create mode 100644 plugins/beos/intf_vlc_wrapper.h diff --git a/plugins/beos/InterfaceWindow.cpp b/plugins/beos/InterfaceWindow.cpp index f78892042e..ae693b91b9 100644 --- a/plugins/beos/InterfaceWindow.cpp +++ b/plugins/beos/InterfaceWindow.cpp @@ -2,7 +2,7 @@ * InterfaceWindow.cpp: beos interface ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: InterfaceWindow.cpp,v 1.20 2002/07/23 00:39:16 sam Exp $ + * $Id: InterfaceWindow.cpp,v 1.21 2002/07/23 12:42:17 tcastley Exp $ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -45,6 +46,7 @@ #include "MsgVals.h" #include "MediaControlView.h" #include "PlayListWindow.h" +#include "intf_vlc_wrapper.h" #include "InterfaceWindow.h" @@ -61,8 +63,13 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name, file_panel = NULL; playlist_window = NULL; p_intf = p_interface; + p_vlc_wrapper = Intf_VLCWrapper::getVLCWrapper(p_intf); BRect controlRect(0,0,0,0); - b_empty_playlist = (p_intf->p_vlc->p_playlist->i_size < 0); + + playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + b_empty_playlist = (p_playlist->i_size < 0); + b_mute = false; /* set the title bar */ SetName( "interface" ); @@ -77,7 +84,6 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name, BMenu *mAudio; CDMenu *cd_menu; BMenu *mNavigation; - BMenu *mConfig; /* Add the file Menu */ BMenuItem *mItem; @@ -118,13 +124,6 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name, mNavigation->AddItem( new BMenuItem( "Next Chapter", new BMessage(NEXT_CHAPTER)) ); - /* Add the Config menu */ - menu_bar->AddItem( mConfig = new BMenu( "Config" ) ); - menu_bar->ResizeToPreferred(); - mConfig->AddItem( miOnTop = new BMenuItem( "Always on Top", - new BMessage(TOGGLE_ON_TOP)) ); - miOnTop->SetMarked(false); - ResizeTo(260,50 + menu_bar->Bounds().IntegerHeight()+1); controlRect = Bounds(); controlRect.top += menu_bar->Bounds().IntegerHeight() + 1; @@ -154,18 +153,9 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) int playback_status; // remember playback state int i_index; BAlert *alert; - aout_bank_t *p_aout_bank = p_intf->p_vlc->p_aout_bank; - input_bank_t *p_input_bank = p_intf->p_vlc->p_input_bank; Activate(); - if (p_input_bank->pp_input[0]) - { - playback_status = p_input_bank->pp_input[0]->stream.control.i_status; - } - else - { - playback_status = UNDEF_S; - } + playback_status = p_vlc_wrapper->inputGetStatus(); switch( p_message->what ) { @@ -175,17 +165,6 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) break; case TOGGLE_ON_TOP: - miOnTop->SetMarked(! miOnTop->IsMarked() ); - if ( miOnTop->IsMarked() ) - { - SetFeel(B_FLOATING_ALL_WINDOW_FEEL); - SetWorkspaces(B_CURRENT_WORKSPACE); - } - else - { - SetFeel(B_NORMAL_WINDOW_FEEL); - SetWorkspaces(B_CURRENT_WORKSPACE); - } break; case OPEN_FILE: @@ -204,54 +183,31 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) case OPEN_PLAYLIST: { BRect rect(20,20,320,420); + playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + playlist_window = PlayListWindow::getPlayList(rect, - "Playlist", (playlist_t *)p_main->p_playlist); + "Playlist", p_playlist); playlist_window->Show(); } break; case OPEN_DVD: - const char *psz_device; - char psz_source[ B_FILE_NAME_LENGTH + 4 ]; - if( p_message->FindString("device", &psz_device) != B_ERROR ) { - snprintf( psz_source, B_FILE_NAME_LENGTH + 4, - "dvd:%s", psz_device ); - psz_source[ strlen(psz_source) ] = '\0'; - intf_PlaylistAdd( p_intf->p_vlc->p_playlist, PLAYLIST_END, (char*)psz_source ); - if( p_input_bank->pp_input[0] != NULL ) + const char *psz_device; + BString type("dvd"); + if( p_message->FindString("device", &psz_device) != B_ERROR ) { - p_input_bank->pp_input[0]->b_eof = 1; + BString device(psz_device); + p_vlc_wrapper->openDisc(type, device, 0,0); } - intf_PlaylistJumpto( p_intf->p_vlc->p_playlist, - p_intf->p_vlc->p_playlist->i_size - 1 ); - b_empty_playlist = false; - p_mediaControl->SetEnabled( !b_empty_playlist ); } break; case STOP_PLAYBACK: // this currently stops playback not nicely - if( p_input_bank->pp_input[0] != NULL ) - { - // silence the sound, otherwise very horrible - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = p_aout_bank->pp_aout[i_index]->i_volume; - p_aout_bank->pp_aout[i_index]->i_volume = 0; - } - vlc_mutex_unlock( &p_aout_bank->lock ); - snooze( 400000 ); - - /* end playing item */ - p_input_bank->pp_input[0]->b_eof = 1; - - /* update playlist */ - vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock ); - p_intf->p_vlc->p_playlist->i_index--; - p_intf->p_vlc->p_playlist->b_stopped = 1; - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); - } + //p_vlc_wrapper->volume_mute(); + //snooze( 400000 ); + p_vlc_wrapper->playlistStop(); p_mediaControl->SetStatus(NOT_STARTED_S,DEFAULT_RATE); break; @@ -260,112 +216,40 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) case PAUSE_PLAYBACK: /* toggle between pause and play */ - if( p_input_bank->pp_input[0] != NULL ) + if( p_intf->p_sys->p_input != NULL ) { /* pause if currently playing */ - if( playback_status == PLAYING_S ) + if ( playback_status == PLAYING_S ) { - /* mute the sound */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = - p_aout_bank->pp_aout[i_index]->i_volume; - p_aout_bank->pp_aout[i_index]->i_volume = 0; - } - vlc_mutex_unlock( &p_aout_bank->lock ); - snooze( 400000 ); - - /* pause the movie */ - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PAUSE ); - vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock ); - p_intf->p_vlc->p_playlist->b_stopped = 0; - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); + //p_vlc_wrapper->volume_mute(); + //snooze( 400000 ); + p_vlc_wrapper->playlistPause(); } else { - /* Play after pausing */ - /* Restore the volume */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - p_aout_bank->pp_aout[i_index]->i_volume = - p_aout_bank->pp_aout[i_index]->i_savedvolume; - p_aout_bank->pp_aout[i_index]->i_savedvolume = 0; - } - vlc_mutex_unlock( &p_aout_bank->lock ); - snooze( 400000 ); - - /* Start playing */ - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); - p_intf->p_vlc->p_playlist->b_stopped = 0; + //p_vlc_wrapper->volume_restore(); + p_vlc_wrapper->playlistPlay(); } } else { /* Play a new file */ - vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock ); - if( p_intf->p_vlc->p_playlist->b_stopped ) - { - if( p_intf->p_vlc->p_playlist->i_size ) - { - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); - intf_PlaylistJumpto( p_intf->p_vlc->p_playlist, - p_intf->p_vlc->p_playlist->i_index ); - p_intf->p_vlc->p_playlist->b_stopped = 0; - } - else - { - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); - } - } + p_vlc_wrapper->playlistPlay(); } break; case FASTER_PLAY: /* cycle the fast playback modes */ - if( p_input_bank->pp_input[0] != NULL ) - { - /* mute the sound */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = - p_aout_bank->pp_aout[i_index]->i_volume; - p_aout_bank->pp_aout[i_index]->i_volume = 0; - } - vlc_mutex_unlock( &p_aout_bank->lock ); - snooze( 400000 ); - - /* change the fast play mode */ - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_FASTER ); - vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock ); - p_intf->p_vlc->p_playlist->b_stopped = 0; - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); - } + //p_vlc_wrapper->volume_mute(); + //snooze( 400000 ); + p_vlc_wrapper->playFaster(); break; case SLOWER_PLAY: /* cycle the slow playback modes */ - if (p_input_bank->pp_input[0] != NULL ) - { - /* mute the sound */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = - p_aout_bank->pp_aout[i_index]->i_volume; - p_aout_bank->pp_aout[i_index]->i_volume = 0; - } - vlc_mutex_unlock( &p_aout_bank->lock ); - snooze( 400000 ); - - /* change the slower play */ - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_SLOWER ); - vlc_mutex_lock( &p_intf->p_vlc->p_playlist->change_lock ); - p_intf->p_vlc->p_playlist->b_stopped = 0; - vlc_mutex_unlock( &p_intf->p_vlc->p_playlist->change_lock ); - } + //p_vlc_wrapper->volume_mute(); + //snooze( 400000 ); + p_vlc_wrapper->playSlower(); break; case SEEK_PLAYBACK: @@ -374,137 +258,85 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) case VOLUME_CHG: /* adjust the volume */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) - { - if( p_aout_bank->pp_aout[i_index]->i_savedvolume ) - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = vol_val; - } - else - { - p_aout_bank->pp_aout[i_index]->i_volume = vol_val; - } - } - vlc_mutex_unlock( &p_aout_bank->lock ); +// vlc_mutex_lock( &p_intf->p_sys->p_input->lock ); +// for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) +// { +// if( p_aout_bank->pp_aout[i_index]->i_savedvolume ) +// { +// p_aout_bank->pp_aout[i_index]->i_savedvolume = vol_val; +// } +// else +// { +// p_aout_bank->pp_aout[i_index]->i_volume = vol_val; +// } +// } +// vlc_mutex_unlock( &p_aout_bank->lock ); break; case VOLUME_MUTE: /* toggle muting */ - vlc_mutex_lock( &p_aout_bank->lock ); - for( i_index = 0 ; i_index < p_aout_bank->i_count ; i_index++ ) + b_mute != b_mute; + p_vlc_wrapper->volumeMute( b_mute ); + break; + + case SELECT_AUDIO: { - if( p_aout_bank->pp_aout[i_index]->i_savedvolume ) - { - p_aout_bank->pp_aout[i_index]->i_volume = - p_aout_bank->pp_aout[i_index]->i_savedvolume; - p_aout_bank->pp_aout[i_index]->i_savedvolume = 0; - } - else - { - p_aout_bank->pp_aout[i_index]->i_savedvolume = - p_aout_bank->pp_aout[i_index]->i_volume; - p_aout_bank->pp_aout[i_index]->i_volume = 0; - } + int32 i = p_message->FindInt32( "audio" ); + p_vlc_wrapper->toggleLanguage( i ); } - vlc_mutex_unlock( &p_aout_bank->lock ); break; - case SELECT_CHANNEL: case SELECT_SUBTITLE: { - int32 i_new, i_old = -1; - if( p_message->what == SELECT_CHANNEL ) - { - i_new = p_message->FindInt32( "channel" ); - i_cat = AUDIO_ES; - } - else - { - i_new = p_message->FindInt32( "subtitle" ); - i_cat = AUDIO_ES; - } - - vlc_mutex_lock( &p_input->stream.stream_lock ); - for( int i = 0; i < p_input->stream.i_selected_es_number ; i++ ) - { - if( p_input->stream.pp_selected_es[i]->i_cat == i_cat ) - { - i_old = i; - break; - } - } - vlc_mutex_unlock( &p_input->stream.stream_lock ); - - if( i_new != -1 ) - { - input_ToggleES( p_input, p_input->stream.pp_selected_es[i_new], - VLC_TRUE ); - } - - if( i_old != -1 ) - { - input_ToggleES( p_input, p_input->stream.pp_selected_es[i_old], - VLC_FALSE ); - } + int32 i = p_message->FindInt32( "subtitle" ); + p_vlc_wrapper->toggleSubtitle( i ); } break; case PREV_TITLE: { - input_area_t * p_area; int i_id; - - i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id - 1; + i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_id - 1; /* Disallow area 0 since it is used for video_ts.vob */ if( i_id > 0 ) { - p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id]; - input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); + p_vlc_wrapper->toggleTitle(i_id); } break; } case NEXT_TITLE: { - input_area_t * p_area; int i_id; - i_id = p_input_bank->pp_input[0]->stream.p_selected_area->i_id + 1; + i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_id + 1; - if( i_id < p_input_bank->pp_input[0]->stream.i_area_nb ) + if( i_id < p_intf->p_sys->p_input->stream.i_area_nb ) { - p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_id]; - input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); + p_vlc_wrapper->toggleTitle(i_id); } } break; case PREV_CHAPTER: { - input_area_t * p_area; + int i_id; - p_area = p_input_bank->pp_input[0]->stream.p_selected_area; + i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_part - 1; - if( p_area->i_part > 0 ) + if( i_id >= 0 ) { - p_area->i_part--; - input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); + p_vlc_wrapper->toggleChapter(i_id); } } break; case NEXT_CHAPTER: { - input_area_t * p_area; + int i_id; - p_area = p_input_bank->pp_input[0]->stream.p_selected_area; + i_id = p_intf->p_sys->p_input->stream.p_selected_area->i_part + 1; - if( p_area->i_part > 0 ) + if( i_id >= 0 ) { - p_area->i_part++; - input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area ); - input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY ); + p_vlc_wrapper->toggleChapter(i_id); } } break; @@ -512,19 +344,18 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) case B_SIMPLE_DATA: { entry_ref ref; - if( p_message->FindRef( "refs", &ref ) == B_OK ) + BList* files = new BList(); + + int i = 0; + while( p_message->FindRef( "refs", i, &ref ) == B_OK ) { BPath path( &ref ); - intf_PlaylistAdd( p_intf->p_vlc->p_playlist, - PLAYLIST_END, (char*)path.Path() ); - if( p_input_bank->pp_input[0] != NULL ) - { - p_input_bank->pp_input[0]->b_eof = 1; - } - intf_PlaylistJumpto( p_intf->p_vlc->p_playlist, - p_intf->p_vlc->p_playlist->i_size - 1 ); - - } + + files->AddItem(new BString((char*)path.Path()) ); + i++; + } + p_vlc_wrapper->openFiles(files); + delete files; } break; @@ -540,26 +371,27 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) *****************************************************************************/ void InterfaceWindow::updateInterface() { - input_bank_t *p_input_bank = p_intf->p_vlc->p_input_bank; - if ( p_input_bank->pp_input[0] ) + if ( p_intf->p_sys->p_input != NULL ) { if ( acquire_sem(p_mediaControl->fScrubSem) == B_OK ) { - uint64 seekTo = (p_mediaControl->GetSeekTo() * - p_input_bank->pp_input[0]->stream.p_selected_area->i_size) / 100; - input_Seek( p_input_bank->pp_input[0]->p_this, seekTo, INPUT_SEEK_SET ); + p_vlc_wrapper->setTimeAsFloat(p_mediaControl->GetSeekTo()); } else if( Lock() ) { - p_mediaControl->SetStatus(p_input_bank->pp_input[0]->stream.control.i_status, - p_input_bank->pp_input[0]->stream.control.i_rate); - p_mediaControl->SetProgress(p_input_bank->pp_input[0]->stream.p_selected_area->i_tell, - p_input_bank->pp_input[0]->stream.p_selected_area->i_size); + p_mediaControl->SetStatus(p_intf->p_sys->p_input->stream.control.i_status, + p_intf->p_sys->p_input->stream.control.i_rate); + p_mediaControl->SetProgress(p_intf->p_sys->p_input->stream.p_selected_area->i_tell, + p_intf->p_sys->p_input->stream.p_selected_area->i_size); Unlock(); } } - if ( b_empty_playlist != (p_intf->p_vlc->p_playlist->i_size < 1) ) + + playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + if ( b_empty_playlist != (p_playlist->i_size < 1) ) { if (Lock()) { @@ -702,47 +534,46 @@ int LanguageMenu::GetChannels() BMessage *msg; int i; es_descriptor_t *p_es = NULL; - input_bank_t *p_input_bank = p_intf->p_vlc->p_input_bank; /* Insert the null */ - if( kind == AUDIO_ES ) //audio - { - msg = new BMessage(SELECT_CHANNEL); - msg->AddInt32("channel", -1); - } - else + if( kind == SPU_ES ) //audio { msg = new BMessage(SELECT_SUBTITLE); msg->AddInt32("subtitle", -1); + BMenuItem *menu_item; + menu_item = new BMenuItem("None", msg); + AddItem(menu_item); + menu_item->SetMarked(TRUE); + } - BMenuItem *menu_item; - menu_item = new BMenuItem("None", msg); - AddItem(menu_item); - menu_item->SetMarked(TRUE); - if( p_input_bank->pp_input[0] == NULL ) + if( p_intf->p_sys->p_input == NULL ) { return 1; } - vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock ); - for( i = 0; i < p_input_bank->pp_input[0]->stream.i_selected_es_number; i++ ) + vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); + for( i = 0; i < p_intf->p_sys->p_input->stream.i_selected_es_number; i++ ) { - if( kind == p_input_bank->pp_input[0]->stream.pp_selected_es[i]->i_cat ) + if( kind == p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat ) { - p_es = p_input_bank->pp_input[0]->stream.pp_selected_es[i]; + p_es = p_intf->p_sys->p_input->stream.pp_selected_es[i]; } } - for( i = 0; i < p_input_bank->pp_input[0]->stream.i_es_number; i++ ) + for( i = 0; i < p_intf->p_sys->p_input->stream.i_es_number; i++ ) { - if( kind == p_input_bank->pp_input[0]->stream.pp_es[i]->i_cat ) + if( kind == p_intf->p_sys->p_input->stream.pp_es[i]->i_cat ) { - psz_name = p_input_bank->pp_input[0]->stream.pp_es[i]->psz_desc; + psz_name = p_intf->p_sys->p_input->stream.pp_es[i]->psz_desc; + if ( strlen(psz_name) == 0 ) + { + // change to default etc + } if( kind == AUDIO_ES ) //audio { - msg = new BMessage(SELECT_CHANNEL); + msg = new BMessage(SELECT_AUDIO); msg->AddInt32("channel", i); } else @@ -753,11 +584,11 @@ int LanguageMenu::GetChannels() BMenuItem *menu_item; menu_item = new BMenuItem(psz_name, msg); AddItem(menu_item); - b_active = (p_es == p_input_bank->pp_input[0]->stream.pp_es[i]); + b_active = (p_es == p_intf->p_sys->p_input->stream.pp_es[i]); menu_item->SetMarked(b_active); } } - vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock ); + vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); } diff --git a/plugins/beos/InterfaceWindow.h b/plugins/beos/InterfaceWindow.h index 8e9b0db5a0..924b207784 100644 --- a/plugins/beos/InterfaceWindow.h +++ b/plugins/beos/InterfaceWindow.h @@ -2,7 +2,7 @@ * InterfaceWindow.h: BeOS interface window class prototype ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: InterfaceWindow.h,v 1.14 2002/07/23 00:39:16 sam Exp $ + * $Id: InterfaceWindow.h,v 1.15 2002/07/23 12:42:17 tcastley Exp $ * * Authors: Jean-Marc Dressler * Tony Castley @@ -22,6 +22,9 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. *****************************************************************************/ +/***************************************************************************** + * intf_sys_t: description and status of FB interface + *****************************************************************************/ class MediaControlView; class PlayListWindow; @@ -65,8 +68,10 @@ public: private: intf_thread_t *p_intf; bool b_empty_playlist; + bool b_mute; BFilePanel *file_panel; PlayListWindow* playlist_window; BMenuItem *miOnTop; + Intf_VLCWrapper * p_vlc_wrapper; }; diff --git a/plugins/beos/MsgVals.h b/plugins/beos/MsgVals.h index ced9ea1a76..e131e4e480 100644 --- a/plugins/beos/MsgVals.h +++ b/plugins/beos/MsgVals.h @@ -2,7 +2,7 @@ * MsgVals.h ***************************************************************************** * Copyright (C) 2001 VideoLAN - * $Id: MsgVals.h,v 1.10 2002/07/22 11:39:56 tcastley Exp $ + * $Id: MsgVals.h,v 1.11 2002/07/23 12:42:17 tcastley Exp $ * * Authors: Tony Castley * @@ -36,7 +36,7 @@ const uint32 SLOWER_PLAY = 'SLPL'; const uint32 SEEK_PLAYBACK = 'SEEK'; const uint32 VOLUME_CHG = 'VOCH'; const uint32 VOLUME_MUTE = 'MUTE'; -const uint32 SELECT_CHANNEL = 'CHAN'; +const uint32 SELECT_AUDIO = 'AUDI'; const uint32 SELECT_SUBTITLE = 'SUBT'; const uint32 PREV_TITLE = 'PRTI'; const uint32 NEXT_TITLE = 'NXTI'; diff --git a/plugins/beos/VideoWindow.h b/plugins/beos/VideoWindow.h index 5051a8b1c2..590122e9d2 100644 --- a/plugins/beos/VideoWindow.h +++ b/plugins/beos/VideoWindow.h @@ -2,7 +2,7 @@ * VideoWindow.h: BeOS video window class prototype ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: VideoWindow.h,v 1.22 2002/07/23 00:39:16 sam Exp $ + * $Id: VideoWindow.h,v 1.23 2002/07/23 12:42:17 tcastley Exp $ * * Authors: Jean-Marc Dressler * Tony Castley @@ -45,7 +45,7 @@ colorcombo colspace[]= }; #define COLOR_COUNT 5 -#define DEFAULT_COL 3 +#define DEFAULT_COL 4 class VLCView : public BView @@ -74,7 +74,7 @@ public: void drawBuffer(int bufferIndex); void WindowActivated(bool active); int SelectDrawingMode(int width, int height); - bool QuitRequested(); + void MessageReceived(BMessage *message); // this is the hook controling direct screen connection int32 i_width; // incomming bitmap size @@ -82,7 +82,6 @@ public: BRect winSize; // current window size bool is_zoomed, vsync; BBitmap *bitmap[3]; - BBitmap *overlaybitmap; VLCView *view; int i_buffer; bool teardownwindow; diff --git a/plugins/beos/intf_beos.cpp b/plugins/beos/intf_beos.cpp index 749d1b4426..5d729a43ca 100644 --- a/plugins/beos/intf_beos.cpp +++ b/plugins/beos/intf_beos.cpp @@ -2,7 +2,7 @@ * intf_beos.cpp: beos interface ***************************************************************************** * Copyright (C) 1999, 2000, 2001 VideoLAN - * $Id: intf_beos.cpp,v 1.42 2002/07/20 18:01:42 sam Exp $ + * $Id: intf_beos.cpp,v 1.43 2002/07/23 12:42:17 tcastley Exp $ * * Authors: Jean-Marc Dressler * Samuel Hocevar @@ -35,18 +35,9 @@ #include #include +#include "intf_vlc_wrapper.h" #include "InterfaceWindow.h" -/***************************************************************************** - * intf_sys_t: description and status of FB interface - *****************************************************************************/ -struct intf_sys_t -{ - InterfaceWindow * p_window; - char i_key; -}; - - extern "C" { @@ -89,7 +80,9 @@ static int intf_Open( intf_thread_t *p_intf ) msg_Err( p_intf, "out of memory" ); return( 1 ); } - p_intf->p_sys->i_key = -1; +// p_intf->p_sys->p_sub = msg_Subscribe( p_intf ); + p_intf->p_sys->p_input = NULL; + /* Create the interface window */ p_intf->p_sys->p_window = @@ -110,6 +103,13 @@ static int intf_Open( intf_thread_t *p_intf ) *****************************************************************************/ static void intf_Close( intf_thread_t *p_intf ) { + if( p_intf->p_sys->p_input ) + { + vlc_object_release( p_intf->p_sys->p_input ); + } + +// msg_Unsubscribe( p_intf, p_intf->p_sys->p_sub ); + /* Destroy the interface window */ p_intf->p_sys->p_window->Lock(); p_intf->p_sys->p_window->Quit(); @@ -126,16 +126,31 @@ static void intf_Run( intf_thread_t *p_intf ) { while( !p_intf->b_die ) { - /* Manage the slider */ - if( p_intf->p_vlc->p_input_bank->pp_input[0] != NULL - && p_intf->p_sys->p_window != NULL) + /* Update the input */ + if( p_intf->p_sys->p_input != NULL ) { + if( p_intf->p_sys->p_input->b_dead ) + { + vlc_object_release( p_intf->p_sys->p_input ); + p_intf->p_sys->p_input = NULL; + } + /* Manage the slider */ p_intf->p_sys->p_window->updateInterface(); } + + if( p_intf->p_sys->p_input == NULL ) + { + p_intf->p_sys->p_input = + (input_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_INPUT, + FIND_ANYWHERE ); + } + + /* Wait a bit */ msleep( INTF_IDLE_SLEEP ); } + } } /* extern "C" */ diff --git a/plugins/beos/intf_vlc_wrapper.cpp b/plugins/beos/intf_vlc_wrapper.cpp new file mode 100644 index 0000000000..4e33512755 --- /dev/null +++ b/plugins/beos/intf_vlc_wrapper.cpp @@ -0,0 +1,462 @@ +/***************************************************************************** + * intf_vlc_wrapper.h: BeOS plugin for vlc (derived from MacOS X port ) + ***************************************************************************** + * Copyright (C) 2001 VideoLAN + * $Id: intf_vlc_wrapper.cpp,v 1.2 2002/07/23 12:42:17 tcastley Exp $ + * + * Authors: Florian G. Pflug + * Jon Lech Johansen + * Tony Casltey + * + * 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. + *****************************************************************************/ +/* VLC headers */ +#include + +#include +#include + +#include "intf_vlc_wrapper.h" + +Intf_VLCWrapper *Intf_VLCWrapper::getVLCWrapper(intf_thread_t *p_if) +{ + static Intf_VLCWrapper *one_wrapper; + if (one_wrapper == NULL ) + { + one_wrapper = new Intf_VLCWrapper(p_if); + } + return one_wrapper; +} + +Intf_VLCWrapper::Intf_VLCWrapper(intf_thread_t *p_if) +{ + p_intf = p_if; +} + +Intf_VLCWrapper::~Intf_VLCWrapper() +{ +} + +//bool Intf_VLCWrapper::manage() +//{ +// +// p_intf->pf_manage( p_intf ); +// +// if ( p_intf->b_die ) +// { +// // exit the lot +// return( 1 ); +// } + /* Update the input */ +// if( p_intf->p_sys->p_input != NULL ) +// { +// if( p_intf->p_sys->p_input->b_dead ) +// { +// vlc_object_release( p_intf->p_sys->p_input ); +// p_intf->p_sys->p_input = NULL; +// } +// } +// +// p_intf->p_sys->p_input = vlc_object_find( p_intf, VLC_OBJECT_INPUT, +// FIND_ANYWHERE ); + +// if ( p_intf->p_sys->p_input != NULL ) +// { +// vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); +// if( !p_intf->p_sys->p_input->b_die ) +// { +// /* New input or stream map change */ +// if( p_intf->p_sys->p_input->stream.b_changed || +// p_intf->p_sys->i_part != +// p_intf->p_sys->p_input->stream.p_selected_area->i_part ) +// { +// setupMenus(); +// p_intf->p_sys->b_disabled_menus = 0; +// } +// } +// vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); +// } +// else if ( !p_intf->p_sys->b_disabled_menus ) +// { +// setupMenus(); +// p_intf->p_sys->b_disabled_menus = 1; +// } +// return( 0 ); +//} + +void Intf_VLCWrapper::quit() +{ + p_intf->b_die = 1; +} + +/* playlist control */ + +int Intf_VLCWrapper::inputGetStatus() +{ + if( p_intf->p_sys->p_input != NULL ) + { + return( p_intf->p_sys->p_input->stream.control.i_status ); + } + else + { + return( UNDEF_S ); + } +} + +bool Intf_VLCWrapper::playlistPlay() +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + vlc_mutex_lock( &p_playlist->object_lock ); + if( p_playlist->i_size ) + { + vlc_mutex_unlock( &p_playlist->object_lock ); + playlist_Play( p_playlist ); + vlc_object_release( p_playlist ); + } + else + { + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); + } + + return( true ); + +} + +void Intf_VLCWrapper::playlistPause() +{ + volumeMute( true ); + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + playlist_Pause( p_playlist ); + vlc_object_release( p_playlist ); +} + +void Intf_VLCWrapper::playlistStop() +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + playlist_Stop( p_playlist ); + vlc_object_release( p_playlist ); + +} + +void Intf_VLCWrapper::playlistNext() +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + playlist_Next( p_playlist ); + vlc_object_release( p_playlist ); +} + +void Intf_VLCWrapper::playlistPrev() +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + playlist_Prev( p_playlist ); + vlc_object_release( p_playlist ); +} + +void Intf_VLCWrapper::playlistSkip(int i) +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + playlist_Skip( p_playlist, i ); + vlc_object_release( p_playlist ); +} + +void Intf_VLCWrapper::playlistGoto(int i) +{ + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + playlist_Goto( p_playlist, i ); + vlc_object_release( p_playlist ); +} + + /* playback control */ +void Intf_VLCWrapper::playSlower() +{ + if( p_intf->p_sys->p_input != NULL ) + { + input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_SLOWER ); + } + if (p_intf->p_sys->p_input->stream.control.i_rate == DEFAULT_RATE) + { + volumeMute( false ); + } + else + { + volumeMute (true ); + } +} + +void Intf_VLCWrapper::playFaster() +{ + if( p_intf->p_sys->p_input != NULL ) + { + input_SetStatus( p_intf->p_sys->p_input, INPUT_STATUS_FASTER ); + } + if (p_intf->p_sys->p_input->stream.control.i_rate == DEFAULT_RATE) + { + volumeMute( false ); + } + else + { + volumeMute (true ); + } +} + +void Intf_VLCWrapper::toggleProgram(int i_program){} + +void Intf_VLCWrapper::toggleTitle(int i_title) +{ + if( p_intf->p_sys->p_input != NULL ) + { + input_ChangeArea( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.pp_areas[i_title] ); + + vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); + //setupMenus(); + + vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); + } +} + +void Intf_VLCWrapper::toggleChapter(int i_chapter) +{ + if( p_intf->p_sys->p_input != NULL ) + { + p_intf->p_sys->p_input->stream.p_selected_area->i_part = i_chapter; + input_ChangeArea( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.p_selected_area ); + + vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); +// setupMenus(); + vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); + } +} + +void Intf_VLCWrapper::toggleLanguage(int i_language) +{ + + int32 i_old = -1; + int i_cat = AUDIO_ES; + + vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); + for( int i = 0; i < p_intf->p_sys->p_input->stream.i_selected_es_number ; i++ ) + { + if( p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat == i_cat ) + { + i_old = i; + break; + } + } + vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); + + if( i_language != -1 ) + { + input_ToggleES( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.pp_selected_es[i_language], + VLC_TRUE ); + } + + if( i_old != -1 ) + { + input_ToggleES( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.pp_selected_es[i_old], + VLC_FALSE ); + } +} + +void Intf_VLCWrapper::toggleSubtitle(int i_subtitle) +{ + int32 i_old = -1; + int i_cat = SPU_ES; + + vlc_mutex_lock( &p_intf->p_sys->p_input->stream.stream_lock ); + for( int i = 0; i < p_intf->p_sys->p_input->stream.i_selected_es_number ; i++ ) + { + if( p_intf->p_sys->p_input->stream.pp_selected_es[i]->i_cat == i_cat ) + { + i_old = i; + break; + } + } + vlc_mutex_unlock( &p_intf->p_sys->p_input->stream.stream_lock ); + + if( i_subtitle != -1 ) + { + input_ToggleES( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.pp_selected_es[i_subtitle], + VLC_TRUE ); + } + + if( i_old != -1 ) + { + input_ToggleES( p_intf->p_sys->p_input, + p_intf->p_sys->p_input->stream.pp_selected_es[i_old], + VLC_FALSE ); + } +} + + +void Intf_VLCWrapper::channelNext() +{ +} + +void Intf_VLCWrapper::channelPrev() +{ +} + +void Intf_VLCWrapper::eject(){} + + + +/* playback info */ + +BString* Intf_VLCWrapper::getTimeAsString() +{ + static char psz_currenttime[ OFFSETTOTIME_MAX_SIZE ]; + + if( p_intf->p_sys->p_input == NULL ) + { + return (new BString("00:00:00")); + } + + input_OffsetToTime( p_intf->p_sys->p_input, + psz_currenttime, + p_intf->p_sys->p_input->stream.p_selected_area->i_tell ); + + return(new BString(psz_currenttime)); +} + +float Intf_VLCWrapper::getTimeAsFloat() +{ + float f_time = 0.0; + + if( p_intf->p_sys->p_input != NULL ) + { + f_time = (float)p_intf->p_sys->p_input->stream.p_selected_area->i_tell / + (float)p_intf->p_sys->p_input->stream.p_selected_area->i_size; + } + else + { + f_time = 0.0; + } + return( f_time ); +} + +void Intf_VLCWrapper::setTimeAsFloat(float f_position) +{ + if( p_intf->p_sys->p_input != NULL ) + { + input_Seek( p_intf->p_sys->p_input, + (long long int)(p_intf->p_sys->p_input->stream.p_selected_area->i_size * f_position / 100), + INPUT_SEEK_SET); + } +} + +BList *Intf_VLCWrapper::playlistAsArray() +{ + int i; + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + BList* p_list = new BList(p_playlist->i_size); + + vlc_mutex_lock( &p_playlist->object_lock ); + + for( i = 0; i < p_playlist->i_size; i++ ) + { + p_list->AddItem(new BString(p_playlist->pp_items[i]->psz_name)); + } + + vlc_mutex_unlock( &p_playlist->object_lock ); + vlc_object_release( p_playlist ); + return( p_list ); +} + + /* open file/disc/network */ +void Intf_VLCWrapper::openFiles(BList *o_files) +{ + BString *o_file; + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + + while( ( o_file = (BString *)o_files->LastItem() ) ) + { + o_files->RemoveItem(o_files->CountItems() - 1); + playlist_Add( p_playlist, o_file->String(), + PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END ); + delete o_file; + } + + vlc_object_release( p_playlist ); + +} + +void Intf_VLCWrapper::openDisc(BString o_type, BString o_device, int i_title, int i_chapter) +{ + BString o_source(""); + o_source << o_type << ":" << o_device ; + + playlist_t *p_playlist = + (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + playlist_Add( p_playlist, o_source.String(), + PLAYLIST_APPEND | PLAYLIST_GO, PLAYLIST_END ); + vlc_object_release( p_playlist ); +} + +void Intf_VLCWrapper::openNet(BString o_addr, int i_port) +{ +} + +void Intf_VLCWrapper::openNetChannel(BString o_addr, int i_port) +{ +} + +void Intf_VLCWrapper::openNetHTTP(BString o_addr) +{ +} + +void Intf_VLCWrapper::volumeMute( bool mute ) +{ + if ( mute ) + { + } + else + { + } +} + +/* menus management */ + diff --git a/plugins/beos/intf_vlc_wrapper.h b/plugins/beos/intf_vlc_wrapper.h new file mode 100644 index 0000000000..dbcbbefd01 --- /dev/null +++ b/plugins/beos/intf_vlc_wrapper.h @@ -0,0 +1,121 @@ +/***************************************************************************** + * intf_vlc_wrapper.h: BeOS plugin for vlc (derived from MacOS X port ) + ***************************************************************************** + * Copyright (C) 2001 VideoLAN + * $Id: intf_vlc_wrapper.h,v 1.2 2002/07/23 12:42:17 tcastley Exp $ + * + * Authors: Florian G. Pflug + * Jon Lech Johansen + * Tony Casltey + * + * 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. + *****************************************************************************/ +class InterfaceWindow; + +/***************************************************************************** + * intf_sys_t: description and status of FB interface + *****************************************************************************/ +struct intf_sys_t +{ + InterfaceWindow *p_window; + char i_key; + + /* The input thread */ + input_thread_t * p_input; + + /* The messages window */ +// msg_subscription_t * p_sub; + + /* DVD mode */ + vlc_bool_t b_disabled_menus; + vlc_bool_t b_loop; + vlc_bool_t b_mute; + int i_part; + int i_saved_volume; + int i_channel; + +}; + +/* Intf_VLCWrapper is a singleton class + (only one instance at any time) */ +class Intf_VLCWrapper +{ +public: + static Intf_VLCWrapper *getVLCWrapper(intf_thread_t *p_if); + ~Intf_VLCWrapper(); + +// bool manage(); + void quit(); + int inputGetStatus(); + /* playlist control */ + bool playlistPlay(); + void playlistPause(); + void playlistStop(); + void playlistNext(); + void playlistPrev(); + void playlistSkip(int i); + void playlistGoto(int i); +/* Playback Modes + PLAYLIST_REPEAT_CURRENT + PLAYLIST_FORWARD + PLAYLIST_BACKWARD + PLAYLIST_FORWARD_LOOP + PLAYLIST_BACKWARD_LOOP + PLAYLIST_RANDOM + PLAYLIST_REVERSE_RANDOM +*/ + + /* Stream Control */ + void playSlower(); + void playFaster(); + + /* input control */ + int getStatus(); + void setStatus(int status); + void inputSeek(); + void toggleProgram(int i_program); + void toggleTitle(int i_title); + void toggleChapter(int i_chapter); + void toggleLanguage(int i_language); + void toggleSubtitle(int i_subtitle); + void channelNext(); + void channelPrev(); + void eject(); + + /* playback info */ + BString* getTimeAsString(); + float getTimeAsFloat(); + void setTimeAsFloat(float i_offset); + BList* playlistAsArray(); + + /* open file/disc/network */ + void openFiles(BList *o_files); + void openDisc(BString o_type, BString o_device, int i_title, int i_chapter); + void openNet(BString o_addr, int i_port); + void openNetChannel(BString o_addr, int i_port); + void openNetHTTP(BString o_addr); + + /* audio stuff */ + void volumeMute( bool mute ); + /* menus management */ + void setupMenus(); + +private: + Intf_VLCWrapper( intf_thread_t *p_if ); + es_descriptor_t * p_audio_es; + intf_thread_t *p_intf; + +}; + -- 2.20.1