]> git.sesse.net Git - vlc/blobdiff - plugins/beos/intf_beos.cpp
* Mandatory step for video output IV and the audio output quality
[vlc] / plugins / beos / intf_beos.cpp
index 17559bad3368e0b19fd375e12264b1d3440a4872..554fb903a9cdbf7a2c50e88028bfe4db6a9f20f0 100644 (file)
@@ -2,11 +2,11 @@
  * intf_beos.cpp: beos interface
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: intf_beos.cpp,v 1.20 2001/03/15 01:42:19 sam Exp $
+ * $Id: intf_beos.cpp,v 1.27 2001/05/01 04:18:17 sam Exp $
  *
  * Authors: Jean-Marc Dressler <polux@via.ecp.fr>
  *          Samuel Hocevar <sam@zoy.org>
- *          Tony Castley <tcastley@mail.powerup.com.au>
+ *          Tony Castley <tony@castley.net>
  *          Richard Shepherd <richard@rshepherd.demon.co.uk>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -81,7 +81,6 @@ extern "C"
 #include "audio_output.h"
 #include "MsgVals.h"
 
-
 #include "main.h"
 }
 
@@ -120,18 +119,26 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name , intf_thread_t
     menu_bar = new BMenuBar(rect, "main menu");
     AddChild( menu_bar );
 
-       BMenu *m; 
+       BMenu *mFile; 
+       BMenu *mAudio;
        CDMenu *cd_menu;
+       
+       BMenuItem *mItem;
 
-       menu_bar->AddItem( m = new BMenu("File") );
+       menu_bar->AddItem( mFile = new BMenu("File") );
        menu_bar->ResizeToPreferred();
-       m->AddItem( new BMenuItem("Open File...", new BMessage(OPEN_FILE), 'O'));
-       cd_menu = new CDMenu("Open DVD");
-       //GetCD("/dev/disk", cd_menu);
-       m->AddItem(cd_menu);
-       m->AddSeparatorItem();
-       m->AddItem( new BMenuItem("About...", new BMessage(B_ABOUT_REQUESTED), 'A'));
-       m->AddItem( new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
+       mFile->AddItem(mItem = new BMenuItem("Open File" B_UTF8_ELLIPSIS, new BMessage(OPEN_FILE), 'O'));
+       cd_menu = new CDMenu("Open Disc");
+       mFile->AddItem(cd_menu);
+       mFile->AddSeparatorItem();
+       mFile->AddItem(mItem = new BMenuItem("About" B_UTF8_ELLIPSIS, new BMessage(B_ABOUT_REQUESTED), 'A'));
+       mItem->SetTarget( be_app );
+       mFile->AddItem(mItem = new BMenuItem("Quit", new BMessage(B_QUIT_REQUESTED), 'Q'));
+
+       menu_bar->AddItem ( mAudio = new BMenu("Audio") );
+       menu_bar->ResizeToPreferred();
+       mAudio->AddItem( new LanguageMenu("Language", AUDIO_ES, p_intf) );
+       mAudio->AddItem( new LanguageMenu("Subtitles", SPU_ES, p_intf) );
        
 
     rect = Bounds();
@@ -241,10 +248,10 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
        Activate();
     switch( p_message->what )
     {
-    case B_ABOUT_REQUESTED:
-               alert = new BAlert(VOUT_TITLE, "BeOS " VOUT_TITLE "\n\n<www.videolan.org>", "Ok");
-           alert->Go();
-           break;      
+//    case B_ABOUT_REQUESTED:
+//             alert = new BAlert(VOUT_TITLE, "BeOS " VOUT_TITLE "\n\n<www.videolan.org>", "Ok");
+//         alert->Go();
+//         break;      
     
     case OPEN_FILE:
        if(file_panel)
@@ -274,7 +281,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                        // silence the sound, otherwise very horrible
                        if (p_main->p_aout != NULL)
                        {
-                               p_main->p_aout->vol = 0;
+                               p_main->p_aout->i_vol = 0;
                        }
                        snooze(400000);
                        input_SetStatus(p_intf->p_input, INPUT_STATUS_END);
@@ -286,7 +293,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
 //             {                       
 //                     if (p_main->p_aout != NULL)
 //                     {
-//                             p_main->p_aout->vol = vol_val;
+//                             p_main->p_aout->i_vol = vol_val;
 //                     }
 //                     snooze(400000);
 //                     input_SetStatus(p_intf->p_input, INPUT_STATUS_PLAY);
@@ -302,7 +309,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                        {
                                if (p_main->p_aout != NULL)
                                {
-                                       p_main->p_aout->vol = 0;
+                                       p_main->p_aout->i_vol = 0;
                                }
                                playback_status = PAUSED;
                        }
@@ -311,7 +318,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                        {
                                if (p_main->p_aout != NULL)
                                {
-                                       p_main->p_aout->vol = vol_val;
+                                       p_main->p_aout->i_vol = vol_val;
                                }
                                playback_status = PLAYING;
                        }
@@ -325,7 +332,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                {
                        if (p_main->p_aout != NULL)
                        {
-                               p_main->p_aout->vol = 0;
+                               p_main->p_aout->i_vol = 0;
                        }
                        snooze(400000);
                        input_SetStatus(p_intf->p_input, INPUT_STATUS_FASTER);
@@ -337,7 +344,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                {
                        if (p_main->p_aout != NULL)
                        {
-                               p_main->p_aout->vol = 0;
+                               p_main->p_aout->i_vol = 0;
                        }
                        snooze(400000);
                        input_SetStatus(p_intf->p_input, INPUT_STATUS_SLOWER);
@@ -345,40 +352,43 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
                break;
        case SEEK_PLAYBACK:
                // handled by semaphores;
-/*         if( p_intf->p_input != NULL )
-           {
-               float new_position;
-                   if (p_message->FindFloat("be:value", &new_position) == B_OK)
-                   {
-                       printf("%e\n", new_position);
-                       input_Seek( p_intf->p_input, new_position * 100 );
-                   }
-           } */
                break;
        case VOLUME_CHG:
                // adjust the volume
         if (p_main->p_aout != NULL) 
         {
-                       p_main->p_aout->vol = vol_val;
+                       p_main->p_aout->i_vol = vol_val;
                }
                break;
        case VOLUME_MUTE:
                // mute
         if (p_main->p_aout != NULL) 
            {
-                       if (p_main->p_aout->vol == 0)
+                       if (p_main->p_aout->i_vol == 0)
                        {
                                p_vol->SetEnabled(true);
-                               p_main->p_aout->vol = vol_val;
+                               p_main->p_aout->i_vol = vol_val;
                        }       
                        else
                        {
                                p_vol->SetEnabled(false);
-                               p_main->p_aout->vol = 0;
+                               p_main->p_aout->i_vol = 0;
                        }
                }
                break;
        case SELECT_CHANNEL:
+               {
+                       int32 i = p_message->FindInt32("channel");
+                       input_ChangeES(p_intf->p_input, 
+                                       p_intf->p_input->stream.pp_es[i], 1);
+               }
+               break;
+       case SELECT_SUBTITLE:
+               {
+                       int32 i = p_message->FindInt32("subtitle");
+                       input_ChangeES(p_intf->p_input, 
+                                       p_intf->p_input->stream.pp_es[i], 2);
+               }
                break;
        case B_REFS_RECEIVED:
     case B_SIMPLE_DATA:
@@ -402,7 +412,6 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
 /*****************************************************************************
  * InterfaceWindow::QuitRequested
  *****************************************************************************/
-
 bool InterfaceWindow::QuitRequested()
 {
     p_intf->b_die = 1;
@@ -413,38 +422,31 @@ bool InterfaceWindow::QuitRequested()
 /*****************************************************************************
  * CDMenu::CDMenu
  *****************************************************************************/
-
 CDMenu::CDMenu(const char *name)
        : BMenu(name)
 {
-
 }
+
 /*****************************************************************************
  * CDMenu::~CDMenu
  *****************************************************************************/
-
-
 CDMenu::~CDMenu()
 {
-
 }
+
 /*****************************************************************************
  * CDMenu::AttachedToWindow
  *****************************************************************************/
-
 void CDMenu::AttachedToWindow(void)
 {
-int32 items = CountItems();
-for(int32 i = 0; i < items; i++)
-       RemoveItem(i); 
-GetCD("/dev/disk");
-BMenu::AttachedToWindow();
+       while (RemoveItem((long int)0) != NULL);  // remove all items
+       GetCD("/dev/disk");
+       BMenu::AttachedToWindow();
 }
 
 /*****************************************************************************
  * CDMenu::GetCD
  *****************************************************************************/
-
 int CDMenu::GetCD(const char *directory)
 { 
        BDirectory dir; 
@@ -510,6 +512,81 @@ int CDMenu::GetCD(const char *directory)
        return B_ERROR;
 }
 
+/*****************************************************************************
+ * LanguageMenu::LanguageMenu
+ *****************************************************************************/
+LanguageMenu::LanguageMenu(const char *name, int menu_kind, intf_thread_t  *p_interface)
+       :BMenu(name)
+{
+       kind = menu_kind;
+       p_intf = p_interface;
+}
+
+/*****************************************************************************
+ * LanguageMenu::~LanguageMenu
+ *****************************************************************************/
+LanguageMenu::~LanguageMenu()
+{
+}
+
+/*****************************************************************************
+ * LanguageMenu::AttachedToWindow
+ *****************************************************************************/
+void LanguageMenu::AttachedToWindow(void)
+{
+       while (RemoveItem((long int)0) != NULL); // remove all items
+       SetRadioMode(true);
+       GetChannels();
+       BMenu::AttachedToWindow();
+}
+
+/*****************************************************************************
+ * LanguageMenu::GetChannels
+ *****************************************************************************/
+int LanguageMenu::GetChannels()
+{ 
+       char*   psz_name;
+       bool    b_active;
+       bool    b_found;
+       int32   i;
+       es_descriptor_t *p_es;
+       
+       if (p_intf->p_input == NULL)
+               return 1;
+               
+       for (i = 0; i < p_intf->p_input->stream.i_selected_es_number; i++)
+       {
+               if (kind ==
+                       p_intf->p_input->stream.pp_selected_es[i]->i_cat)
+               {
+                       p_es = p_intf->p_input->stream.pp_selected_es[i];
+               }
+       }               
+       for (i = 0; i < p_intf->p_input->stream.i_es_number; i++)
+       {
+               if (kind == p_intf->p_input->stream.pp_es[i]->i_cat)
+               {
+                       psz_name = p_intf->p_input->stream.pp_es[i]->psz_desc;
+                       BMessage *msg;
+                       if (kind == AUDIO_ES) //audio
+                       {
+                               msg = new BMessage(SELECT_CHANNEL);
+                               msg->AddInt32("channel", i);
+                       }
+                       else
+                       {
+                               msg = new BMessage(SELECT_SUBTITLE);
+                               msg->AddInt32("subtitle", i);
+                       }
+                       BMenuItem *menu_item;
+                       menu_item = new BMenuItem(psz_name, msg);
+                       AddItem(menu_item);
+                       b_active = (p_es == p_intf->p_input->stream.pp_es[i]);
+                       menu_item->SetMarked(b_active);
+               }
+       }
+}
+
 
 /*****************************************************************************
  * MediaSlider
@@ -540,7 +617,7 @@ void MediaSlider::DrawThumb(void)
                v->SetHighColor(black);
        else
                v->SetHighColor(tint_color(black, B_LIGHTEN_2_TINT));
-       r.InsetBy(r.IntegerWidth()/4, r.IntegerHeight()/6);
+       r.InsetBy(r.IntegerWidth()/4, r.IntegerHeight()/(4 * r.IntegerWidth() / r.IntegerHeight()));
        v->StrokeEllipse(r);
        if(IsEnabled())
                v->SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));