Commit 2d8e1a61 authored by Eric Petit's avatar Eric Petit

Fixed language and subtitle selection.

parent 5361fc7d
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* InterfaceWindow.cpp: beos interface * InterfaceWindow.cpp: beos interface
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.cpp,v 1.12 2002/12/09 07:57:04 titer Exp $ * $Id: InterfaceWindow.cpp,v 1.13 2003/01/08 02:09:15 titer Exp $
* *
* Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Samuel Hocevar <sam@zoy.org> * Samuel Hocevar <sam@zoy.org>
...@@ -135,8 +135,8 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name, ...@@ -135,8 +135,8 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name,
fileMenu->AddItem( item ); fileMenu->AddItem( item );
fileMenu->AddItem( new BMenuItem( "Quit", new BMessage( B_QUIT_REQUESTED ), 'Q') ); fileMenu->AddItem( new BMenuItem( "Quit", new BMessage( B_QUIT_REQUESTED ), 'Q') );
fLanguageMenu = new LanguageMenu("Language", AUDIO_ES, p_intf); fLanguageMenu = new LanguageMenu("Language", AUDIO_ES, p_wrapper);
fSubtitlesMenu = new LanguageMenu("Subtitles", SPU_ES, p_intf); fSubtitlesMenu = new LanguageMenu("Subtitles", SPU_ES, p_wrapper);
/* Add the Audio menu */ /* Add the Audio menu */
fAudioMenu = new BMenu( "Audio" ); fAudioMenu = new BMenu( "Audio" );
...@@ -346,7 +346,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) ...@@ -346,7 +346,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
int32 channel; int32 channel;
if ( p_message->FindInt32( "channel", &channel ) == B_OK ) if ( p_message->FindInt32( "channel", &channel ) == B_OK )
{ {
p_wrapper->toggleLanguage( channel ); p_wrapper->ToggleLanguage( channel );
} }
} }
break; break;
...@@ -356,7 +356,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message ) ...@@ -356,7 +356,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
{ {
int32 subtitle; int32 subtitle;
if ( p_message->FindInt32( "subtitle", &subtitle ) == B_OK ) if ( p_message->FindInt32( "subtitle", &subtitle ) == B_OK )
p_wrapper->toggleSubtitle( subtitle ); p_wrapper->ToggleSubtitle( subtitle );
} }
break; break;
...@@ -473,7 +473,7 @@ bool InterfaceWindow::QuitRequested() ...@@ -473,7 +473,7 @@ bool InterfaceWindow::QuitRequested()
*****************************************************************************/ *****************************************************************************/
void InterfaceWindow::updateInterface() void InterfaceWindow::updateInterface()
{ {
if( /* has_input */ true ) if( p_wrapper->HasInput() )
{ {
if ( acquire_sem( p_mediaControl->fScrubSem ) == B_OK ) if ( acquire_sem( p_mediaControl->fScrubSem ) == B_OK )
{ {
...@@ -523,6 +523,13 @@ void InterfaceWindow::updateInterface() ...@@ -523,6 +523,13 @@ void InterfaceWindow::updateInterface()
Unlock(); Unlock();
} }
/* always force the user-specified volume */
/* FIXME : I'm quite sure there is a cleaner way to do this */
if( p_wrapper->GetVolume() != p_mediaControl->GetVolume() )
{
p_wrapper->SetVolume( p_mediaControl->GetVolume() );
}
fLastUpdateTime = system_time(); fLastUpdateTime = system_time();
} }
...@@ -890,12 +897,12 @@ int CDMenu::GetCD( const char *directory ) ...@@ -890,12 +897,12 @@ int CDMenu::GetCD( const char *directory )
/***************************************************************************** /*****************************************************************************
* LanguageMenu::LanguageMenu * LanguageMenu::LanguageMenu
*****************************************************************************/ *****************************************************************************/
LanguageMenu::LanguageMenu(const char *name, int menu_kind, LanguageMenu::LanguageMenu( const char *name, int menu_kind,
intf_thread_t *p_interface) VlcWrapper *p_wrapper )
:BMenu(name) :BMenu(name)
{ {
kind = menu_kind; kind = menu_kind;
p_intf = p_interface; this->p_wrapper = p_wrapper;
} }
/***************************************************************************** /*****************************************************************************
...@@ -924,84 +931,23 @@ void LanguageMenu::AttachedToWindow() ...@@ -924,84 +931,23 @@ void LanguageMenu::AttachedToWindow()
*****************************************************************************/ *****************************************************************************/
void LanguageMenu::_GetChannels() void LanguageMenu::_GetChannels()
{ {
#if 0 // must be ported to 0.5.0 BMenuItem *item;
char *psz_name; BList *list;
bool b_active;
BMessage *msg; if( ( list = p_wrapper->InputGetChannels( kind ) ) == NULL )
BMenuItem *menu_item; return;
int i;
es_descriptor_t *p_es = NULL; for( int i = 0; i < list->CountItems(); i++ )
{
// Insert the "None" item if in subtitle mode item = (BMenuItem*)list->ItemAt( i );
if( kind != AUDIO_ES ) //subtitle AddItem( item );
{ }
msg = new BMessage( SELECT_SUBTITLE );
msg->AddInt32( "subtitle", -1 ); if( list->CountItems() > 1 )
menu_item = new BMenuItem( "None", msg ); AddItem( new BSeparatorItem(), 1 );
AddItem( menu_item );
menu_item->SetMarked( true );
}
input_thread_t* input = p_intf->p_sys->p_input;
if ( input )
{
vlc_mutex_lock( &input->stream.stream_lock );
for( i = 0; i < input->stream.i_selected_es_number; i++ )
{
if( kind == input->stream.pp_selected_es[i]->i_cat )
p_es = input->stream.pp_selected_es[i];
}
int32 addedItems = 0;
bool emptyItemAdded = false;
uint32 what = kind == AUDIO_ES ? SELECT_CHANNEL : SELECT_SUBTITLE;
const char* fieldName = kind == AUDIO_ES ? "channel" : "subtitle";
for ( i = 0; i < input->stream.i_es_number; i++ )
{
if ( kind == input->stream.pp_es[i]->i_cat )
{
bool addItem = true;
psz_name = input->stream.pp_es[i]->psz_desc;
// workarround for irritating empty strings
if ( strcmp(psz_name, "") == 0 )
{
// if ( kind != AUDIO_ES ) // don't add empty subtitle items, they don't work anyways
// addItem = false;
// else
// {
if (!emptyItemAdded)
{
psz_name = "<default>";
emptyItemAdded = true;
}
else
psz_name = "<unkown>";
// }
}
if ( addItem )
{
addedItems++;
msg = new BMessage( what );
msg->AddInt32( fieldName, i );
menu_item = new BMenuItem( psz_name, msg );
AddItem( menu_item );
b_active = ( p_es == input->stream.pp_es[i] );
menu_item->SetMarked( b_active );
}
}
}
vlc_mutex_unlock( &input->stream.stream_lock );
// enhance readability and separate first item from rest
if ( ( emptyItemAdded || kind != AUDIO_ES ) && addedItems > 1 )
AddItem( new BSeparatorItem(), 1 );
}
#endif
} }
/***************************************************************************** /*****************************************************************************
* TitleMenu::TitleMenu * TitleMenu::TitleMenu
*****************************************************************************/ *****************************************************************************/
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* InterfaceWindow.h: BeOS interface window class prototype * InterfaceWindow.h: BeOS interface window class prototype
***************************************************************************** *****************************************************************************
* Copyright (C) 1999, 2000, 2001 VideoLAN * Copyright (C) 1999, 2000, 2001 VideoLAN
* $Id: InterfaceWindow.h,v 1.6 2002/11/27 05:36:41 titer Exp $ * $Id: InterfaceWindow.h,v 1.7 2003/01/08 02:09:15 titer Exp $
* *
* Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
* Tony Castley <tcastley@mail.powerup.com.au> * Tony Castley <tcastley@mail.powerup.com.au>
...@@ -53,7 +53,7 @@ class LanguageMenu : public BMenu ...@@ -53,7 +53,7 @@ class LanguageMenu : public BMenu
public: public:
LanguageMenu( const char* name, LanguageMenu( const char* name,
int menu_kind, int menu_kind,
intf_thread_t* p_interface ); VlcWrapper *p_wrapper );
virtual ~LanguageMenu(); virtual ~LanguageMenu();
virtual void AttachedToWindow(); virtual void AttachedToWindow();
...@@ -61,7 +61,7 @@ class LanguageMenu : public BMenu ...@@ -61,7 +61,7 @@ class LanguageMenu : public BMenu
private: private:
void _GetChannels(); void _GetChannels();
intf_thread_t* p_intf; VlcWrapper * p_wrapper;
int kind; int kind;
}; };
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* VlcWrapper.cpp: BeOS plugin for vlc (derived from MacOS X port) * VlcWrapper.cpp: BeOS plugin for vlc (derived from MacOS X port)
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.cpp,v 1.14 2002/12/26 18:17:38 stippi Exp $ * $Id: VlcWrapper.cpp,v 1.15 2003/01/08 02:09:15 titer Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
* along with this program{} if not, write to the Free Software * along with this program{} if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/ *****************************************************************************/
#include <AppKit.h>
#include <InterfaceKit.h>
#include <SupportKit.h> #include <SupportKit.h>
#include <vlc/vlc.h> #include <vlc/vlc.h>
...@@ -34,6 +36,7 @@ extern "C" { ...@@ -34,6 +36,7 @@ extern "C" {
} }
#include "VlcWrapper.h" #include "VlcWrapper.h"
#include "MsgVals.h"
/* constructor */ /* constructor */
VlcWrapper::VlcWrapper( intf_thread_t *p_interface ) VlcWrapper::VlcWrapper( intf_thread_t *p_interface )
...@@ -100,6 +103,11 @@ bool VlcWrapper::UpdateInputAndAOut() ...@@ -100,6 +103,11 @@ bool VlcWrapper::UpdateInputAndAOut()
* input infos and control * * input infos and control *
***************************/ ***************************/
bool VlcWrapper::HasInput()
{
return( p_input != NULL );
}
/* status (UNDEF_S, PLAYING_S, PAUSE_S, FORWARD_S, BACKWARD_S, /* status (UNDEF_S, PLAYING_S, PAUSE_S, FORWARD_S, BACKWARD_S,
REWIND_S, NOT_STARTED_S, START_S) */ REWIND_S, NOT_STARTED_S, START_S) */
int VlcWrapper::InputStatus() int VlcWrapper::InputStatus()
...@@ -146,7 +154,6 @@ void VlcWrapper::InputSlower() ...@@ -146,7 +154,6 @@ void VlcWrapper::InputSlower()
{ {
input_SetStatus( p_input, INPUT_STATUS_SLOWER ); input_SetStatus( p_input, INPUT_STATUS_SLOWER );
} }
//VolumeMute();
} }
void VlcWrapper::InputFaster() void VlcWrapper::InputFaster()
...@@ -155,7 +162,80 @@ void VlcWrapper::InputFaster() ...@@ -155,7 +162,80 @@ void VlcWrapper::InputFaster()
{ {
input_SetStatus( p_input, INPUT_STATUS_FASTER ); input_SetStatus( p_input, INPUT_STATUS_FASTER );
} }
//VolumeMute(); }
BList * VlcWrapper::InputGetChannels( 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( strlen( p_input->stream.pp_es[i]->psz_desc ) )
trackName = strdup( p_input->stream.pp_es[i]->psz_desc );
else
trackName = "<unknown>";
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::openFiles( BList* o_files, bool replace ) void VlcWrapper::openFiles( BList* o_files, bool replace )
...@@ -182,68 +262,71 @@ void VlcWrapper::openDisc(BString o_type, BString o_device, int i_title, int i_c ...@@ -182,68 +262,71 @@ void VlcWrapper::openDisc(BString o_type, BString o_device, int i_title, int i_c
void VlcWrapper::toggleLanguage(int i_language) void VlcWrapper::ToggleLanguage( int i_language )
{ {
es_descriptor_t * p_es = NULL;
int32 i_old = -1; es_descriptor_t * p_es_old = NULL;
int i_cat = AUDIO_ES;
vlc_mutex_lock( &p_input->stream.stream_lock ); vlc_mutex_lock( &p_input->stream.stream_lock );
for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ ) for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ )
{ {
if( p_input->stream.pp_selected_es[i]->i_cat == i_cat ) if( p_input->stream.pp_selected_es[i]->i_cat == AUDIO_ES )
{ {
i_old = i; p_es_old = p_input->stream.pp_selected_es[i];
break; break;
} }
} }
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
msg_Info( p_intf, "Old: %d, New: %d", i_old, i_language);
if( i_language != -1 ) if( i_language != -1 )
{ {
input_ToggleES( p_input, p_es = p_input->stream.pp_es[i_language];
p_input->stream.pp_selected_es[i_language],
VLC_TRUE );
} }
if( p_es == p_es_old )
if( (i_old != -1) && (i_old != i_language) ) {
return;
}
if( p_es_old )
{
input_ToggleES( p_input, p_es_old, VLC_FALSE );
}
if( p_es )
{ {
input_ToggleES( p_input, input_ToggleES( p_input, p_es, VLC_TRUE );
p_input->stream.pp_selected_es[i_old],
VLC_FALSE );
} }
} }
void VlcWrapper::toggleSubtitle(int i_subtitle) void VlcWrapper::ToggleSubtitle( int i_subtitle )
{ {
int32 i_old = -1; es_descriptor_t * p_es = NULL;
int i_cat = SPU_ES; es_descriptor_t * p_es_old = NULL;
vlc_mutex_lock( &p_input->stream.stream_lock ); vlc_mutex_lock( &p_input->stream.stream_lock );
for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ ) for( unsigned int i = 0; i < p_input->stream.i_selected_es_number ; i++ )
{ {
if( p_input->stream.pp_selected_es[i]->i_cat == i_cat ) if( p_input->stream.pp_selected_es[i]->i_cat == SPU_ES )
{ {
i_old = i; p_es_old = p_input->stream.pp_selected_es[i];
break; break;
} }
} }
vlc_mutex_unlock( &p_input->stream.stream_lock ); vlc_mutex_unlock( &p_input->stream.stream_lock );
msg_Info( p_intf, "Old: %d, New: %d", i_old, i_subtitle);
if( i_subtitle != -1 ) if( i_subtitle != -1 )
{ {
input_ToggleES( p_input, p_es = p_input->stream.pp_es[i_subtitle];
p_input->stream.pp_selected_es[i_subtitle],
VLC_TRUE );
} }
if( p_es == p_es_old )
if( (i_old != -1) && (i_old != i_subtitle) ) {
return;
}
if( p_es_old )
{
input_ToggleES( p_input, p_es_old, VLC_FALSE );
}
if( p_es )
{ {
input_ToggleES( p_input, input_ToggleES( p_input, p_es, VLC_TRUE );
p_input->stream.pp_selected_es[i_old],
VLC_FALSE );
} }
} }
...@@ -346,7 +429,6 @@ bool VlcWrapper::PlaylistPlay() ...@@ -346,7 +429,6 @@ bool VlcWrapper::PlaylistPlay()
if( PlaylistSize() ) if( PlaylistSize() )
{ {
playlist_Play( p_playlist ); playlist_Play( p_playlist );
//VolumeRestore();
} }
return( true ); return( true );
} }
...@@ -601,6 +683,17 @@ void VlcWrapper::navigateNext() ...@@ -601,6 +683,17 @@ void VlcWrapper::navigateNext()
* audio infos and control * * audio infos and control *
***************************/ ***************************/
unsigned short VlcWrapper::GetVolume()
{
if( p_aout != NULL )
{
unsigned short i_volume;
aout_VolumeGet( p_aout, (audio_volume_t*)&i_volume );
return i_volume;
}
return 0;
}
void VlcWrapper::SetVolume(int value) void VlcWrapper::SetVolume(int value)
{ {
if( p_aout != NULL ) if( p_aout != NULL )
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* VlcWrapper.h: BeOS plugin for vlc (derived from MacOS X port) * VlcWrapper.h: BeOS plugin for vlc (derived from MacOS X port)
***************************************************************************** *****************************************************************************
* Copyright (C) 2001 VideoLAN * Copyright (C) 2001 VideoLAN
* $Id: VlcWrapper.h,v 1.10 2002/12/09 13:37:38 titer Exp $ * $Id: VlcWrapper.h,v 1.11 2003/01/08 02:09:15 titer Exp $
* *
* Authors: Florian G. Pflug <fgp@phlo.org> * Authors: Florian G. Pflug <fgp@phlo.org>
* Jon Lech Johansen <jon-vl@nanocrew.net> * Jon Lech Johansen <jon-vl@nanocrew.net>
...@@ -62,17 +62,19 @@ public: ...@@ -62,17 +62,19 @@ public:
bool UpdateInputAndAOut(); bool UpdateInputAndAOut();
/* input */ /* input */
bool HasInput();
int InputStatus(); int InputStatus();
int InputRate(); int InputRate();
int InputTell(); int InputTell();
int InputSize(); int InputSize();
void InputSlower(); void InputSlower();
void InputFaster(); void InputFaster();
BList * InputGetChannels( int i_cat );
void openFiles( BList *o_files, bool replace = true ); void openFiles( BList *o_files, bool replace = true );
void openDisc( BString o_type, BString o_device, void openDisc( BString o_type, BString o_device,
int i_title, int i_chapter ); int i_title, int i_chapter );
void toggleLanguage( int i_language ); void ToggleLanguage( int i_language );
void toggleSubtitle( int i_subtitle ); void ToggleSubtitle( int i_subtitle );
const char* getTimeAsString(); const char* getTimeAsString();
float getTimeAsFloat(); float getTimeAsFloat();
void setTimeAsFloat( float i_offset ); void setTimeAsFloat( float i_offset );
...@@ -102,6 +104,7 @@ public: ...@@ -102,6 +104,7 @@ public:
void navigateNext(); void navigateNext();
/* audio */ /* audio */
unsigned short GetVolume();
void SetVolume( int value ); void SetVolume( int value );
void VolumeMute(); void VolumeMute();
void VolumeRestore(); void VolumeRestore();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment