]> git.sesse.net Git - vlc/blobdiff - modules/gui/beos/VlcWrapper.cpp
Attempt to port new BeOS features from the stable branch.
[vlc] / modules / gui / beos / VlcWrapper.cpp
index fc613cc6aa7d22ea3b1849e4b17c6813adaad28f..a3d3771df8afb89fd8557bb75fe56d87c3a6451a 100644 (file)
@@ -1,12 +1,13 @@
 /*****************************************************************************
- * vlc_wrapper.h: BeOS plugin for vlc (derived from MacOS X port )
+ * intf_vlc_wrapper.h: BeOS plugin for vlc (derived from MacOS X port )
  *****************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: VlcWrapper.cpp,v 1.3 2002/08/18 11:32:06 titer Exp $
+ * $Id: VlcWrapper.cpp,v 1.4 2002/09/30 18:30:27 titer 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>
  *
  * 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
@@ -49,52 +50,41 @@ 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 );
-//}
+#if 0
+bool Intf_VLCWrapper::manage()
+{
+   p_main->p_intf->pf_manage( p_main->p_intf );
+   
+   if ( p_main->p_intf->b_die )
+   {
+       // exit the lot
+       return( 1 );
+   }
+   
+   if ( p_input_bank->pp_input[0] != NULL )
+   {
+       vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
+        if( !p_input_bank->pp_input[0]->b_die )
+        {
+            /* New input or stream map change */
+            if( p_input_bank->pp_input[0]->stream.b_changed ||
+                p_main->p_intf->p_sys->i_part !=
+                p_input_bank->pp_input[0]->stream.p_selected_area->i_part )
+            {
+                setupMenus();
+                p_main->p_intf->p_sys->b_disabled_menus = 0;
+            }
+        }
+        vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
+    }
+    else if ( !p_main->p_intf->p_sys->b_disabled_menus )
+    {
+        setupMenus();
+        p_main->p_intf->p_sys->b_disabled_menus = 1;
+    }
+    return( 0 );
+}
+#endif
 
 void Intf_VLCWrapper::quit()
 {
@@ -102,19 +92,6 @@ void Intf_VLCWrapper::quit()
 }
     
 /* 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 = 
@@ -135,12 +112,11 @@ bool Intf_VLCWrapper::playlistPlay()
     }
 
     return( true );
-    
 }
 
 void Intf_VLCWrapper::playlistPause()
 {
-    toggleMute(  );
+    toggle_mute(  );
     playlist_t *p_playlist = 
                 (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST,
                                                        FIND_ANYWHERE );
@@ -156,7 +132,6 @@ void Intf_VLCWrapper::playlistStop()
 
     playlist_Stop( p_playlist );
     vlc_object_release( p_playlist );
-
 }
 
 void Intf_VLCWrapper::playlistNext()
@@ -199,6 +174,266 @@ void Intf_VLCWrapper::playlistGoto(int i)
     vlc_object_release( p_playlist );
 }
 
+void Intf_VLCWrapper::playlistJumpTo( int pos )
+{
+#if 0
+       // sanity checks
+       if ( pos < 0 )
+               pos = 0;
+       int size = playlistSize();
+       if (pos >= size)
+               pos = size - 1;
+       // weird hack
+    if( p_input_bank->pp_input[0] != NULL )
+               pos--;
+       // stop current stream
+       playlistStop();
+       // modify current position in playlist
+       playlistLock();
+       p_main->p_playlist->i_index = pos;
+       playlistUnlock();
+       // start playing
+       playlistPlay();
+#endif
+}
+
+int Intf_VLCWrapper::playlistCurrentPos()
+{
+       /*playlistLock();
+       int pos = p_main->p_playlist->i_index;
+       playlistUnlock();
+       return pos;*/
+}
+
+int Intf_VLCWrapper::playlistSize()
+{
+       /*playlistLock();
+       int size = p_main->p_playlist->i_size;
+       playlistUnlock();
+       return size;*/
+}
+
+void Intf_VLCWrapper::playlistLock()
+{
+       /*vlc_mutex_lock( &p_main->p_playlist->change_lock );*/
+}
+
+void Intf_VLCWrapper::playlistUnlock()
+{
+       /*vlc_mutex_unlock( &p_main->p_playlist->change_lock );*/
+}
+
+void Intf_VLCWrapper::getNavCapabilities( bool* canSkipPrev,
+                                                                                 bool* canSkipNext )
+{
+#if 0
+       if ( canSkipPrev && canSkipNext )
+       {
+               // init the parameters
+               *canSkipPrev = false;
+               *canSkipNext = false;
+               // get playlist info
+               playlistLock();
+               int pos = p_main->p_playlist->i_index;
+               int size = p_main->p_playlist->i_size;
+               playlistUnlock();
+
+               input_thread_t* input = p_input_bank->pp_input[0];
+               // see if we have got a stream going            
+               if ( input )
+               {
+                       vlc_mutex_lock( &input->stream.stream_lock );
+
+                       bool hasTitles = input->stream.i_area_nb > 1;
+                       int numChapters = input->stream.p_selected_area->i_part_nb;
+                       bool hasChapters = numChapters > 1;
+                       // first, look for chapters
+                       if ( hasChapters )
+                       {
+                               *canSkipPrev = input->stream.p_selected_area->i_part > 0;
+                               *canSkipNext = input->stream.p_selected_area->i_part <
+                                                                        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 = input->stream.p_selected_area->i_id > 1;
+                       if ( !*canSkipNext && hasTitles )
+                               *canSkipNext = input->stream.p_selected_area->i_id < input->stream.i_area_nb - 1;
+
+                       vlc_mutex_unlock( &input->stream.stream_lock );
+               }
+               // last but not least, make capabilities depend on playlist
+               if ( !*canSkipPrev )
+                       *canSkipPrev = pos > 0;
+               if ( !*canSkipNext )
+                       *canSkipNext = pos < size - 1;
+       }
+#endif
+}
+
+void Intf_VLCWrapper::navigatePrev()
+{
+#if 0
+       bool hasSkiped = false;
+
+       input_thread_t* input = p_input_bank->pp_input[0];
+       // see if we have got a stream going            
+       if ( input )
+       {
+               // get information from stream (lock it while looking at it)
+               vlc_mutex_lock( &input->stream.stream_lock );
+
+               int currentTitle = input->stream.p_selected_area->i_id;
+               int currentChapter = input->stream.p_selected_area->i_part;
+               int numTitles = input->stream.i_area_nb;
+               bool hasTitles = numTitles > 1;
+               int numChapters = input->stream.p_selected_area->i_part_nb;
+               bool hasChapters = numChapters > 1;
+
+               vlc_mutex_unlock( &input->stream.stream_lock );
+
+               // first, look for chapters
+               if ( hasChapters )
+               {
+                       // skip to the previous chapter
+                       currentChapter--;
+
+                       if ( currentChapter >= 0 )
+                       {
+                               toggleChapter( currentChapter );
+                               hasSkiped = true;
+                       }
+               }
+               // if we couldn't skip chapters, try titles instead
+               if ( !hasSkiped && hasTitles )
+               {
+                       // skip to the previous title
+                       currentTitle--;
+                       // disallow area 0 since it is used for video_ts.vob
+                       if( currentTitle > 0 )
+                       {
+                               toggleTitle(currentTitle);
+                               hasSkiped = true;
+                       }
+               }
+
+       }
+       // last but not least, skip to previous file
+       if ( !hasSkiped )
+               playlistPrev();
+#endif
+}
+
+void Intf_VLCWrapper::navigateNext()
+{
+#if 0
+       bool hasSkiped = false;
+
+       input_thread_t* input = p_input_bank->pp_input[0];
+       // see if we have got a stream going            
+       if ( input )
+       {
+               // get information from stream (lock it while looking at it)
+               vlc_mutex_lock( &input->stream.stream_lock );
+
+               int currentTitle = input->stream.p_selected_area->i_id;
+               int currentChapter = input->stream.p_selected_area->i_part;
+               int numTitles = input->stream.i_area_nb;
+               bool hasTitles = numTitles > 1;
+               int numChapters = input->stream.p_selected_area->i_part_nb;
+               bool hasChapters = numChapters > 1;
+
+               vlc_mutex_unlock( &input->stream.stream_lock );
+
+               // first, look for chapters
+               if ( hasChapters )
+               {
+                       // skip to the next chapter
+                       currentChapter++;
+                       if ( currentChapter < numChapters )
+                       {
+                               toggleChapter( currentChapter );
+                               hasSkiped = true;
+                       }
+               }
+               // if we couldn't skip chapters, try titles instead
+               if ( !hasSkiped && hasTitles )
+               {
+                       // skip to the next title
+                       currentTitle++;
+                       // disallow area 0 since it is used for video_ts.vob
+                       if ( currentTitle < numTitles - 1 )
+                       {
+                               toggleTitle(currentTitle);
+                               hasSkiped = true;
+                       }
+               }
+
+       }
+       // last but not least, skip to next file
+       if ( !hasSkiped )
+               playlistNext();
+#endif
+}
+
+
+//void Intf_VLCWrapper::channelNext()
+//{
+//    intf_thread_t * p_intf = p_main->p_intf;
+//
+//    p_intf->p_sys->i_channel++;
+//
+//    intf_WarnMsg( 3, "intf info: joining channel %d", p_intf->p_sys->i_channel );
+//
+//    vlc_mutex_lock( &p_intf->change_lock );
+//
+//    network_ChannelJoin( p_intf->p_sys->i_channel );
+//    p_intf->pf_manage( p_intf );
+//
+//    vlc_mutex_unlock( &p_intf->change_lock );
+//}
+//
+//void Intf_VLCWrapper::channelPrev()
+//{
+//    intf_thread_t * p_intf = p_main->p_intf;
+//
+//    if ( p_intf->p_sys->i_channel )
+//    {
+//        p_intf->p_sys->i_channel--;
+//    }
+//
+//    intf_WarnMsg( 3, "intf info: joining channel %d", p_intf->p_sys->i_channel );
+//
+//    vlc_mutex_lock( &p_intf->change_lock );
+//
+//    network_ChannelJoin( p_intf->p_sys->i_channel );
+//    p_intf->pf_manage( p_intf );
+//
+//    vlc_mutex_unlock( &p_intf->change_lock );
+//
+//}
+
+void Intf_VLCWrapper::loop()
+{
+#if 0
+    intf_thread_t * p_intf = p_main->p_intf;
+
+    if ( p_intf->p_sys->b_loop )
+    {
+        intf_PlaylistDelete( p_main->p_playlist,
+                             p_main->p_playlist->i_size - 1 );
+    }
+    else
+    {
+        intf_PlaylistAdd( p_main->p_playlist, PLAYLIST_END, 
+                          "vlc:loop" );
+    }
+    p_intf->p_sys->b_loop = !p_intf->p_sys->b_loop;
+#endif
+}
+
+
     /* playback control */
 void Intf_VLCWrapper::playSlower()
 {
@@ -208,11 +443,11 @@ void Intf_VLCWrapper::playSlower()
     }
     if (p_intf->p_sys->p_input->stream.control.i_rate == DEFAULT_RATE)
     {
-        toggleMute(  );
+        toggle_mute(  );
     }
     else
     {
-        toggleMute ( );
+        toggle_mute ( );
     }
 }
 
@@ -224,123 +459,172 @@ void Intf_VLCWrapper::playFaster()
     }
     if (p_intf->p_sys->p_input->stream.control.i_rate == DEFAULT_RATE)
     {
-        toggleMute(  );
+        toggle_mute(  );
     }
     else
     {
-        toggleMute ( );
+        toggle_mute ( );
     }
 }
 
-void Intf_VLCWrapper::toggleProgram(int i_program){}
-
-void Intf_VLCWrapper::toggleTitle(int i_title)
+void Intf_VLCWrapper::volume_mute()
 {
-    if( p_intf->p_sys->p_input != NULL )
+/*
+    if( p_aout_bank->i_count > 0
+       && p_aout_bank->pp_aout[0] != 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 );
+           if( !p_main->p_intf->p_sys->b_mute )
+               {
+                   p_main->p_intf->p_sys->i_saved_volume = 
+                                       p_aout_bank->pp_aout[0]->i_volume;
+                   p_aout_bank->pp_aout[0]->i_volume = 0;
+                   p_main->p_intf->p_sys->b_mute = 1;
+               }
     }
+*/
 }
 
-void Intf_VLCWrapper::toggleChapter(int i_chapter)
+void Intf_VLCWrapper::volume_restore()
 {
-    if( p_intf->p_sys->p_input != NULL )
+/*
+    if( p_aout_bank->i_count > 0
+       && p_aout_bank->pp_aout[0] != 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 );
+           p_aout_bank->pp_aout[0]->i_volume = 
+                             p_main->p_intf->p_sys->i_saved_volume;
+               p_main->p_intf->p_sys->i_saved_volume = 0;
+           p_main->p_intf->p_sys->b_mute = 0;
     }
+*/
 }
 
-void Intf_VLCWrapper::toggleLanguage(int i_language)
+void Intf_VLCWrapper::set_volume(int value)
 {
-
-    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 0
+    if( p_aout_bank->i_count > 0
+       && p_aout_bank->pp_aout[0] != NULL )
     {
-        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 );
-
-    msg_Info( p_intf, "Old: %d,  New: %d", i_old, i_language);
-    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 );
+               // make sure value is within bounds
+               if (value < 0)
+                       value = 0;
+               if (value > AOUT_VOLUME_MAX)
+                       value = AOUT_VOLUME_MAX;
+               vlc_mutex_lock( &p_aout_bank->lock );
+                       // unmute volume if muted
+                       if ( p_main->p_intf->p_sys->b_mute )
+                               p_main->p_intf->p_sys->b_mute = 0;
+                       // set every stream to the given value
+                       for ( int i = 0 ; i < p_aout_bank->i_count ; i++ )
+                       {
+                               if ( p_aout_bank->pp_aout[i] )
+                                       p_aout_bank->pp_aout[i]->i_volume = value;
+                       }
+               vlc_mutex_unlock( &p_aout_bank->lock );
     }
+#endif
+}
 
-    if( (i_old != -1) && (i_old != i_language) )
-    {
-        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::toggle_mute()
+{
+/*
+    if( p_aout_bank->i_count > 0
+       && p_aout_bank->pp_aout[0] != NULL )
+       {
+           if ( p_main->p_intf->p_sys->b_mute )
+           {
+               Intf_VLCWrapper::volume_restore();
+           }
+           else
+           {
+               Intf_VLCWrapper::volume_mute();
+           }
+       }
+*/
 }
 
-void Intf_VLCWrapper::toggleSubtitle(int i_subtitle)
+bool Intf_VLCWrapper::is_muted()
 {
-    int32 i_old = -1;
-    int i_cat = SPU_ES;
+#if 0
+       bool muted = true;
+       if ( p_aout_bank->i_count > 0 )
+       {
+               vlc_mutex_lock( &p_aout_bank->lock );
+                       for ( int i = 0 ; i < p_aout_bank->i_count ; i++ )
+                       {
+                               if ( p_aout_bank->pp_aout[i]
+                                        && p_aout_bank->pp_aout[i]->i_volume > 0 )
+                               {
+                                       muted = false;
+                                       break;
+                               }
+                       }
+               vlc_mutex_unlock( &p_aout_bank->lock );
+// unfortunately, this is not reliable!
+//             return p_main->p_intf->p_sys->b_mute;
+       }
+       return muted;
+#endif
+}
 
-    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 );
-    
-    msg_Info( p_intf, "Old: %d,  New: %d", i_old, i_subtitle);
-    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 );
-    }
+bool Intf_VLCWrapper::is_playing()
+{
+/*
+       bool playing = false;
+       if ( p_input_bank->pp_input[0] )
+       {
+               switch ( p_input_bank->pp_input[0]->stream.control.i_status )
+               {
+                       case PLAYING_S:
+                       case FORWARD_S:
+                       case BACKWARD_S:
+                       case START_S:
+                               playing = true;
+                   break;
+                       case PAUSE_S:
+                       case UNDEF_S:
+                       case NOT_STARTED_S:
+                       default:
+                               break;
+               }
+       }
+       return playing;
+*/
+}
 
-    if( (i_old != -1) && (i_old != i_subtitle) )
+void Intf_VLCWrapper::maxvolume()
+{
+/*
+    if( p_aout_bank->i_count > 0
+       && p_aout_bank->pp_aout[0] != NULL )
     {
-        input_ToggleES( p_intf->p_sys->p_input, 
-                        p_intf->p_sys->p_input->stream.pp_selected_es[i_old],
-                        VLC_FALSE );
+           if( p_main->p_intf->p_sys->b_mute )
+           {
+               p_main->p_intf->p_sys->i_saved_volume = VOLUME_MAX;
+           }
+           else
+           {
+               p_aout_bank->pp_aout[0]->i_volume = VOLUME_MAX;
+           }
     }
+*/
 }
 
-
-void Intf_VLCWrapper::channelNext()
+bool Intf_VLCWrapper::has_audio()
 {
+    /* return (p_aout_bank->i_count > 0); */
 }
 
-void Intf_VLCWrapper::channelPrev()
-{
-}
+//void Intf_VLCWrapper::fullscreen()
+//{
+//    if( p_vout_bank->pp_vout[0] != NULL )
+//    {
+//        p_vout_bank->pp_vout[0]->i_changes |= VOUT_FULLSCREEN_CHANGE;
+//    }
+//}
 
 void Intf_VLCWrapper::eject(){}
 
-
-
-/* playback info */
+    /* playback info */
 
 BString*  Intf_VLCWrapper::getTimeAsString()
 {
@@ -384,6 +668,11 @@ void   Intf_VLCWrapper::setTimeAsFloat(float f_position)
     }
 }
 
+bool   Intf_VLCWrapper::playlistPlaying()
+{ 
+    /* return( !p_main->p_playlist->b_stopped ); */
+}
+
 BList  *Intf_VLCWrapper::playlistAsArray()
 { 
     int i;
@@ -406,7 +695,7 @@ BList  *Intf_VLCWrapper::playlistAsArray()
 }
 
     /* open file/disc/network */
-void Intf_VLCWrapper::openFiles(BList *o_files)
+void Intf_VLCWrapper::openFiles( BList* o_files, bool replace )
 {
     BString *o_file;
     playlist_t *p_playlist = 
@@ -422,7 +711,6 @@ void Intf_VLCWrapper::openFiles(BList *o_files)
     }
 
     vlc_object_release( p_playlist );
-
 }
 
 void Intf_VLCWrapper::openDisc(BString o_type, BString o_device, int i_title, int i_chapter)
@@ -450,10 +738,103 @@ void Intf_VLCWrapper::openNetHTTP(BString o_addr)
 {
 }
 
-void Intf_VLCWrapper::toggleMute( )
+
+    /* menus management */
+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)
 {
-    /*input_ToggleMute( p_intf->p_sys->p_input );*/
+
+    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 );
+
+    msg_Info( p_intf, "Old: %d,  New: %d", i_old, i_language);
+    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) && (i_old != i_language) )
+    {
+        input_ToggleES( p_intf->p_sys->p_input, 
+                        p_intf->p_sys->p_input->stream.pp_selected_es[i_old],
+                        VLC_FALSE );
+    }
 }
 
-/* menus management */
+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 );
     
+    msg_Info( p_intf, "Old: %d,  New: %d", i_old, i_subtitle);
+    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) && (i_old != i_subtitle) )
+    {
+        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::setupMenus(){}
+int  Intf_VLCWrapper::inputGetStatus() {}