]> 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 05f1ec81adfcaa3367afb6c153274e961a42e523..554fb903a9cdbf7a2c50e88028bfe4db6a9f20f0 100644 (file)
@@ -2,11 +2,11 @@
  * intf_beos.cpp: beos interface
  *****************************************************************************
  * Copyright (C) 1999, 2000, 2001 VideoLAN
- * $Id: intf_beos.cpp,v 1.18 2001/03/06 19:52:03 richards 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
@@ -76,12 +76,11 @@ extern "C"
 #include "input_ext-intf.h"
 
 #include "interface.h"
-#include "intf_plst.h"
+#include "intf_playlist.h"
 #include "intf_msg.h"
 #include "audio_output.h"
 #include "MsgVals.h"
 
-
 #include "main.h"
 }
 
@@ -120,17 +119,26 @@ InterfaceWindow::InterfaceWindow( BRect frame, const char *name , intf_thread_t
     menu_bar = new BMenuBar(rect, "main menu");
     AddChild( menu_bar );
 
-       BMenu *m, *cd_menu;
+       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 BMenu("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();
@@ -240,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)
@@ -262,7 +270,7 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
            if(p_message->FindString("device", device) != B_ERROR)
                {
                sprintf(device_method_and_name, "dvd:%s", *device); 
-               intf_PlstAdd( p_main->p_playlist, PLAYLIST_END, device_method_and_name );
+               intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, device_method_and_name );
                }
        break;
 
@@ -273,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);
@@ -285,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);
@@ -301,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;
                        }
@@ -310,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;
                        }
@@ -324,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);
@@ -336,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);
@@ -344,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:
@@ -386,8 +397,8 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
             if( p_message->FindRef( "refs", &ref ) == B_OK )
             {
                 BPath path( &ref );
-                char * psz_name = strdup(path.Path());
-                intf_PlstAdd( p_main->p_playlist, PLAYLIST_END, psz_name );
+                intf_PlaylistAdd( p_main->p_playlist,
+                                  PLAYLIST_END, path.Path() );
             }
 
         }
@@ -401,7 +412,6 @@ void InterfaceWindow::MessageReceived( BMessage * p_message )
 /*****************************************************************************
  * InterfaceWindow::QuitRequested
  *****************************************************************************/
-
 bool InterfaceWindow::QuitRequested()
 {
     p_intf->b_die = 1;
@@ -409,8 +419,35 @@ bool InterfaceWindow::QuitRequested()
     return( false );
 }
 
+/*****************************************************************************
+ * CDMenu::CDMenu
+ *****************************************************************************/
+CDMenu::CDMenu(const char *name)
+       : BMenu(name)
+{
+}
 
-int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
+/*****************************************************************************
+ * CDMenu::~CDMenu
+ *****************************************************************************/
+CDMenu::~CDMenu()
+{
+}
+
+/*****************************************************************************
+ * CDMenu::AttachedToWindow
+ *****************************************************************************/
+void CDMenu::AttachedToWindow(void)
+{
+       while (RemoveItem((long int)0) != NULL);  // remove all items
+       GetCD("/dev/disk");
+       BMenu::AttachedToWindow();
+}
+
+/*****************************************************************************
+ * CDMenu::GetCD
+ *****************************************************************************/
+int CDMenu::GetCD(const char *directory)
 { 
        BDirectory dir; 
        dir.SetTo(directory); 
@@ -435,7 +472,7 @@ int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
                if(entry.IsDirectory()) { 
                        if(strcmp(e.name, "floppy") == 0) 
                                continue; // ignore floppy (it is not silent) 
-                       int devfd = GetCD(name, cd_menu);
+                       int devfd = GetCD(name);
                        if(devfd >= 0)
                                {
                                return devfd;
@@ -443,7 +480,7 @@ int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
                } 
                else { 
                        int devfd; 
-                       device_geometry g; 
+                       device_geometry g;
                        status_t m;
 
                        if(strcmp(e.name, "raw") != 0) 
@@ -464,7 +501,7 @@ int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
                                                        msg->AddString("device", name);
                                                        BMenuItem *menu_item;
                                                        menu_item = new BMenuItem(name, msg);
-                                                       cd_menu->AddItem(menu_item);
+                                                       AddItem(menu_item);
                                                        continue;
                                                        }
                                }
@@ -475,6 +512,81 @@ int InterfaceWindow::GetCD(const char *directory, BMenu *cd_menu)
        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
@@ -505,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));