1 /*****************************************************************************
\r
2 * menu.cpp: functions to handle menu items
\r
3 *****************************************************************************
\r
4 * Copyright (C) 2002 VideoLAN
\r
6 * Authors: Olivier Teuliere <ipkiss@via.ecp.fr>
\r
8 * This program is free software; you can redistribute it and/or modify
\r
9 * it under the terms of the GNU General Public License as published by
\r
10 * the Free Software Foundation; either version 2 of the License, or
\r
11 * (at your option) any later version.
\r
13 * This program is distributed in the hope that it will be useful,
\r
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
16 * GNU General Public License for more details.
\r
18 * You should have received a copy of the GNU General Public License
\r
19 * along with this program; if not, write to the Free Software
\r
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
\r
21 *****************************************************************************/
\r
26 #include <videolan/vlc.h>
\r
28 #include "stream_control.h"
\r
29 #include "input_ext-intf.h"
\r
31 #include "interface.h"
\r
32 #include "intf_playlist.h"
\r
35 #include "win32_common.h"
\r
38 /****************************************************************************
\r
40 ****************************************************************************/
\r
41 extern struct intf_thread_s *p_intfGlobal;
\r
43 static TMenuItem *Index2Item( TMenuItem *, int, bool );
\r
44 static int Item2Index( TMenuItem *, TMenuItem * );
\r
45 static void __fastcall LangChange( TMenuItem *, TMenuItem *, TMenuItem *, int );
\r
46 static void __fastcall ProgramChange( TMenuItem *, TMenuItem * );
\r
48 static void __fastcall RadioMenu( TMenuItem *, AnsiString,
\r
49 int, int, TNotifyEvent );
\r
50 static void __fastcall ProgramMenu( TMenuItem *, pgrm_descriptor_t *,
\r
52 static void __fastcall LanguageMenu( TMenuItem *t, es_descriptor_t *,
\r
53 int, TNotifyEvent );
\r
54 static void __fastcall NavigationMenu( TMenuItem *, TNotifyEvent );
\r
57 static TMenuItem *Index2Item( TMenuItem *Root, int i_index, bool SingleColumn )
\r
59 if( SingleColumn || ( i_index < 20 ) )
\r
61 return Root->Items[i_index];
\r
65 return Root->Items[i_index / 10]->Items[i_index % 10];
\r
69 static int Item2Index( TMenuItem *Root, TMenuItem *Item )
\r
71 if( Item->Parent == Root )
\r
73 return Item->MenuIndex;
\r
77 return( 10 * Item->Parent->MenuIndex + Item->MenuIndex );
\r
82 /****************************************************************************
\r
83 * LangChange: change audio or subtitles languages
\r
84 ****************************************************************************
\r
85 * Toggle the language, and update the selected menuitems.
\r
86 ****************************************************************************/
\r
87 static void __fastcall LangChange( TMenuItem *RootCurrent, TMenuItem *Item,
\r
88 TMenuItem *RootOther, int i_cat )
\r
90 intf_thread_t * p_intf = p_intfGlobal;
\r
91 es_descriptor_t * p_es;
\r
92 es_descriptor_t * p_es_old;
\r
95 /* find the selected ES */
\r
96 i_index = Item2Index( RootCurrent, Item ) - 1;
\r
99 /* 'None' was selected */
\r
104 vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
105 p_es = p_input_bank->pp_input[0]->stream.pp_es[i_index];
\r
106 vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
109 /* find the current ES */
\r
110 if( i_cat == AUDIO_ES )
\r
112 p_es_old = p_intf->p_sys->p_audio_es_old;
\r
113 p_intf->p_sys->p_audio_es_old = p_es;
\r
117 p_es_old = p_intf->p_sys->p_spu_es_old;
\r
118 p_intf->p_sys->p_spu_es_old = p_es;
\r
121 /* exchange them */
\r
122 input_ToggleES( p_input_bank->pp_input[0], p_es_old, false );
\r
123 input_ToggleES( p_input_bank->pp_input[0], p_es, true );
\r
125 Item->Checked = true;
\r
126 Index2Item( RootOther, i_index + 1, true )->Checked = true;
\r
130 /****************************************************************************
\r
131 * ProgramChange: change the program
\r
132 ****************************************************************************
\r
133 * Toggle the program, and update the selected menuitems.
\r
134 ****************************************************************************/
\r
135 static void __fastcall ProgramChange( TMenuItem *Item, TMenuItem *RootOther )
\r
137 intf_thread_t * p_intf = p_intfGlobal;
\r
138 int i_program = Item->Tag;
\r
140 /* toggle the program */
\r
141 input_ChangeProgram( p_input_bank->pp_input[0], (u16)i_program );
\r
143 /* check selected menu items */
\r
144 Item->Checked = true;
\r
145 Index2Item( RootOther, i_program - 1, true )->Checked = true;
\r
147 /* update audio/subtitles menus */
\r
148 p_intf->p_sys->b_audio_update = 1;
\r
149 p_intf->p_sys->b_spu_update = 1;
\r
150 vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
151 SetupMenus( p_intf );
\r
152 vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
153 p_intf->p_sys->b_audio_update = 0;
\r
154 p_intf->p_sys->b_spu_update = 0;
\r
156 input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );
\r
160 /****************************************************************************
\r
161 * TMainFrameDlg::*Click: callbacks for the menuitems
\r
162 ****************************************************************************
\r
163 * These functions need to be in a class, or we won't be able to pass them
\r
164 * as arguments (since TNotifyEvent uses __closure)
\r
165 ****************************************************************************/
\r
171 void __fastcall TMainFrameDlg::MenuAudioClick( TObject *Sender )
\r
173 LangChange( MenuAudio, (TMenuItem *)Sender, PopupAudio, AUDIO_ES );
\r
176 void __fastcall TMainFrameDlg::PopupAudioClick( TObject *Sender )
\r
178 LangChange( PopupAudio, (TMenuItem *)Sender, MenuAudio, AUDIO_ES );
\r
185 void __fastcall TMainFrameDlg::MenuSubtitleClick( TObject *Sender )
\r
187 LangChange( MenuSubtitles, (TMenuItem *)Sender, PopupSubtitles, SPU_ES );
\r
190 void __fastcall TMainFrameDlg::PopupSubtitleClick( TObject *Sender )
\r
192 LangChange( PopupSubtitles, (TMenuItem *)Sender, MenuSubtitles, SPU_ES );
\r
199 void __fastcall TMainFrameDlg::MenuProgramClick( TObject *Sender )
\r
201 ProgramChange( (TMenuItem *)Sender, PopupProgram );
\r
204 void __fastcall TMainFrameDlg::PopupProgramClick( TObject *Sender )
\r
206 ProgramChange( (TMenuItem *)Sender, MenuProgram );
\r
213 void __fastcall TMainFrameDlg::PopupNavigationClick( TObject *Sender )
\r
215 TMenuItem * Item = (TMenuItem *)Sender;
\r
216 TMenuItem * ItemTitle;
\r
217 input_area_t * p_area;
\r
218 int i_title = DATA2TITLE( Item->Tag );
\r
219 int i_chapter = DATA2CHAPTER( Item->Tag );
\r
221 p_area = p_input_bank->pp_input[0]->stream.pp_areas[i_title];
\r
222 p_area->i_part = i_chapter;
\r
224 input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );
\r
226 Item->Checked = true;
\r
227 ItemTitle = Index2Item( MenuTitle, i_title - 1, false );
\r
228 if( ItemTitle->Checked )
\r
230 /* same title, new chapter */
\r
231 Index2Item( MenuChapter, i_chapter - 1, false )->Checked = true;
\r
235 /* new title => we must rebuild the chapter menu */
\r
236 vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
237 RadioMenu( MenuChapter, "Chapter",
\r
238 p_input_bank->pp_input[0]->stream.p_selected_area->i_part_nb,
\r
239 i_chapter, MenuChapterClick );
\r
240 vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
243 input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );
\r
250 void __fastcall TMainFrameDlg::MenuTitleClick( TObject *Sender )
\r
252 TMenuItem * Item = (TMenuItem *)Sender;
\r
253 TMenuItem * ItemTitle;
\r
254 int i_title = Item->Tag;
\r
256 input_ChangeArea( p_input_bank->pp_input[0],
\r
257 p_input_bank->pp_input[0]->stream.pp_areas[i_title] );
\r
258 Item->Checked = true;
\r
259 ItemTitle = Index2Item( PopupNavigation, i_title - 1, false );
\r
260 Index2Item( ItemTitle, 0, false )->Checked = true;
\r
262 input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );
\r
269 void __fastcall TMainFrameDlg::MenuChapterClick( TObject *Sender )
\r
271 TMenuItem * Item = (TMenuItem *)Sender;
\r
272 TMenuItem * ItemTitle;
\r
273 input_area_t * p_area;
\r
275 int i_chapter = Item->Tag;
\r
277 p_area = p_input_bank->pp_input[0]->stream.p_selected_area;
\r
278 p_area->i_part = i_chapter;
\r
280 input_ChangeArea( p_input_bank->pp_input[0], (input_area_t*)p_area );
\r
282 i_title = p_input_bank->pp_input[0]->stream.p_selected_area->i_id;
\r
283 ItemTitle = Index2Item( PopupNavigation, i_title - 1, false );
\r
284 Index2Item( ItemTitle, i_chapter - 1, false )->Checked = true;
\r
286 input_SetStatus( p_input_bank->pp_input[0], INPUT_STATUS_PLAY );
\r
290 /****************************************************************************
\r
291 * Functions to generate menus
\r
292 ****************************************************************************/
\r
294 /*****************************************************************************
\r
295 * RadioMenu: update interactive menus of the interface
\r
296 *****************************************************************************
\r
297 * Sets up menus with information from input
\r
298 * Warning: since this function is designed to be called by management
\r
299 * function, the interface lock has to be taken
\r
300 *****************************************************************************/
\r
301 static void __fastcall RadioMenu( TMenuItem * Root, AnsiString ItemName,
\r
302 int i_nb, int i_selected,
\r
303 TNotifyEvent MenuItemClick )
\r
305 TMenuItem * ItemGroup;
\r
307 TMenuItem * ItemActive;
\r
311 /* remove previous menu */
\r
312 Root->Enabled = false;
\r
317 for( i_item = 0; i_item < i_nb; i_item++ )
\r
319 /* we group titles/chapters in packets of ten for small screens */
\r
320 if( ( i_item % 10 == 0 ) && ( i_nb > 20 ) )
\r
324 Root->Add( ItemGroup );
\r
327 Name.sprintf( "%ss %d to %d", ItemName, i_item + 1, i_item + 10 );
\r
328 ItemGroup = new TMenuItem( Root );
\r
329 ItemGroup->Hint = Name;
\r
331 /* set the accelerator character */
\r
332 Name.Insert( "&", Name.Length() - 1 );
\r
333 ItemGroup->Caption = Name;
\r
336 Name.sprintf( "%s %d", ItemName, i_item + 1 );
\r
337 Item = new TMenuItem( Root );
\r
338 Item->RadioItem = true;
\r
341 /* set the accelerator character */
\r
342 Name.Insert( "&", Name.Length() );
\r
343 Item->Caption = Name;
\r
345 /* FIXME: temporary hack to save i_item with the Item
\r
346 * It will be used in the callback. */
\r
347 Item->Tag = i_item + 1;
\r
349 if( i_selected == i_item + 1 )
\r
354 /* setup signal handling */
\r
355 Item->OnClick = MenuItemClick;
\r
359 ItemGroup->Add( Item );
\r
367 // if( ( i_nb > 20 ) && ( i_item % 10 ) ) ?
\r
370 Root->Add( ItemGroup );
\r
373 /* check currently selected chapter */
\r
374 if( ItemActive != NULL )
\r
376 ItemActive->Checked = true;
\r
379 /* be sure that menu is enabled, if there are several items */
\r
382 Root->Enabled = true;
\r
387 /*****************************************************************************
\r
388 * ProgramMenu: update the programs menu of the interface
\r
389 *****************************************************************************
\r
390 * Builds the program menu according to what have been found in the PAT
\r
391 * by the input. Useful for multi-programs streams such as DVB ones.
\r
392 *****************************************************************************/
\r
393 static void __fastcall ProgramMenu( TMenuItem * Root,
\r
394 pgrm_descriptor_t * p_pgrm,
\r
395 TNotifyEvent MenuItemClick )
\r
398 TMenuItem * ItemActive;
\r
402 /* remove previous menu */
\r
404 Root->Enabled = false;
\r
408 /* create a set of program buttons and append them to the container */
\r
409 for( i = 0; i < p_input_bank->pp_input[0]->stream.i_pgrm_number; i++ )
\r
411 Name.sprintf( "id %d",
\r
412 p_input_bank->pp_input[0]->stream.pp_programs[i]->i_number );
\r
414 Item = new TMenuItem( Root );
\r
415 Item->Caption = Name;
\r
417 Item->RadioItem = true;
\r
418 Item->OnClick = MenuItemClick;
\r
420 /* FIXME: temporary hack to save the program id with the Item
\r
421 * It will be used in the callback. */
\r
424 if( p_pgrm == p_input_bank->pp_input[0]->stream.pp_programs[i] )
\r
426 /* don't lose Item when we append into menu */
\r
430 /* Add the item to the submenu */
\r
434 /* check currently selected program */
\r
435 if( ItemActive != NULL )
\r
437 ItemActive->Checked = true;
\r
440 /* be sure that menu is enabled if more than 1 program */
\r
441 if( p_input_bank->pp_input[0]->stream.i_pgrm_number > 1 )
\r
443 Root->Enabled = true;
\r
448 /*****************************************************************************
\r
449 * LanguageMenus: update interactive menus of the interface
\r
450 *****************************************************************************
\r
451 * Sets up menus with information from input:
\r
454 * Warning: since this function is designed to be called by management
\r
455 * function, the interface lock has to be taken
\r
456 *****************************************************************************/
\r
457 static void __fastcall LanguageMenu( TMenuItem * Root, es_descriptor_t * p_es,
\r
458 int i_cat, TNotifyEvent MenuItemClick )
\r
460 TMenuItem * Separator;
\r
462 TMenuItem * ItemActive;
\r
467 /* remove previous menu */
\r
469 Root->Enabled = false;
\r
471 /* special case for "off" item */
\r
473 Item = new TMenuItem( Root );
\r
474 Item->RadioItem = true;
\r
476 Item->Caption = Name;
\r
477 Item->OnClick = MenuItemClick;
\r
480 /* separator item */
\r
481 Separator = new TMenuItem( Root );
\r
482 Separator->Caption = "-";
\r
483 Root->Add( Separator );
\r
488 vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
490 #define ES p_input_bank->pp_input[0]->stream.pp_es[i]
\r
491 /* create a set of language buttons and append them to the Root */
\r
492 for( i = 0; i < p_input_bank->pp_input[0]->stream.i_es_number; i++ )
\r
494 if( ( ES->i_cat == i_cat ) &&
\r
497 p_input_bank->pp_input[0]->stream.p_selected_program ) )
\r
500 Name = p_input_bank->pp_input[0]->stream.pp_es[i]->psz_desc;
\r
501 if( Name.IsEmpty() )
\r
503 Name.sprintf( "Language %d", i_item );
\r
506 Item = new TMenuItem( Root );
\r
507 Item->RadioItem = true;
\r
509 Item->Caption = Name;
\r
511 if( p_es == p_input_bank->pp_input[0]->stream.pp_es[i] )
\r
513 /* don't lose Item when we append into menu */
\r
517 /* setup signal hanling */
\r
518 Item->OnClick = MenuItemClick;
\r
524 vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
526 /* check currently selected item */
\r
527 if( ItemActive != NULL )
\r
529 ItemActive->Checked = true;
\r
532 /* be sure that menu is enabled if non empty */
\r
535 Root->Enabled = true;
\r
540 /*****************************************************************************
\r
541 * NavigationMenu: sets menus for titles and chapters selection
\r
542 *****************************************************************************
\r
543 * Generates two types of menus:
\r
544 * -simple list of titles
\r
545 * -cascaded lists of chapters for each title
\r
546 *****************************************************************************/
\r
547 static void __fastcall NavigationMenu( TMenuItem * Root,
\r
548 TNotifyEvent MenuItemClick )
\r
550 TMenuItem * TitleGroup;
\r
551 TMenuItem * TitleItem;
\r
552 TMenuItem * ItemActive;
\r
553 TMenuItem * ChapterGroup;
\r
554 TMenuItem * ChapterItem;
\r
562 /* remove previous menu */
\r
563 Root->Enabled = false;
\r
567 i_title_nb = p_input_bank->pp_input[0]->stream.i_area_nb;
\r
569 /* loop on titles */
\r
570 for( i_title = 1; i_title < i_title_nb; i_title++ )
\r
572 /* we group titles in packets of ten for small screens */
\r
573 if( ( i_title % 10 == 1 ) && ( i_title_nb > 20 ) )
\r
577 Root->Add( TitleGroup );
\r
580 Name.sprintf( "%d - %d", i_title, i_title + 9 );
\r
581 TitleGroup = new TMenuItem( Root );
\r
582 TitleGroup->RadioItem = true;
\r
583 TitleGroup->Hint = Name;
\r
584 TitleGroup->Caption = Name;
\r
587 Name.sprintf( "Title %d (%d)", i_title,
\r
588 p_input_bank->pp_input[0]->stream.pp_areas[i_title]->i_part_nb );
\r
591 TitleItem = new TMenuItem( Root );
\r
592 TitleItem->RadioItem = true;
\r
593 TitleItem->Hint = Name;
\r
594 TitleItem->Caption = Name;
\r
597 p_input_bank->pp_input[0]->stream.pp_areas[i_title]->i_part_nb;
\r
599 /* loop on chapters */
\r
600 for( i_chapter = 0; i_chapter < i_chapter_nb; i_chapter++ )
\r
602 /* we group chapters in packets of ten for small screens */
\r
603 if( ( i_chapter % 10 == 0 ) && ( i_chapter_nb > 20 ) )
\r
605 if( i_chapter != 0 )
\r
607 TitleItem->Add( ChapterGroup );
\r
610 Name.sprintf( "%d - %d", i_chapter + 1, i_chapter + 10 );
\r
611 ChapterGroup = new TMenuItem( TitleItem );
\r
612 ChapterGroup->RadioItem = true;
\r
613 ChapterGroup->Hint = Name;
\r
614 ChapterGroup->Caption = Name;
\r
617 Name.sprintf( "Chapter %d", i_chapter + 1 );
\r
619 ChapterItem = new TMenuItem( TitleItem );
\r
620 ChapterItem->RadioItem = true;
\r
621 ChapterItem->Hint = Name;
\r
622 ChapterItem->Caption = Name;
\r
624 /* FIXME: temporary hack to save i_title and i_chapter with
\r
625 * ChapterItem, since we will need them in the callback */
\r
626 ChapterItem->Tag = (int)POS2DATA( i_title, i_chapter + 1 );
\r
628 #define p_area p_input_bank->pp_input[0]->stream.pp_areas[i_title]
\r
630 p_input_bank->pp_input[0]->stream.p_selected_area ) &&
\r
631 ( p_area->i_part == i_chapter + 1 ) )
\r
633 ItemActive = ChapterItem;
\r
637 /* setup signal hanling */
\r
638 ChapterItem->OnClick = MenuItemClick;
\r
640 if( i_chapter_nb > 20 )
\r
642 ChapterGroup->Add( ChapterItem );
\r
646 TitleItem->Add( ChapterItem );
\r
650 if( i_chapter_nb > 20 )
\r
652 TitleItem->Add( ChapterGroup );
\r
655 if( p_input_bank->pp_input[0]->stream.pp_areas[i_title]->i_part_nb
\r
658 /* be sure that menu is sensitive */
\r
659 Root->Enabled = true;
\r
663 if( i_title_nb > 20 )
\r
665 TitleGroup->Add( TitleItem );
\r
669 Root->Add( TitleItem );
\r
673 if( i_title_nb > 20 )
\r
675 Root->Add( TitleGroup );
\r
678 /* Default selected chapter */
\r
679 if( ItemActive != NULL )
\r
681 ItemActive->Checked = true;
\r
684 /* be sure that menu is sensitive */
\r
685 Root->Enabled = true;
\r
689 /*****************************************************************************
\r
690 * SetupMenus: function that generates title/chapter/audio/subpic
\r
691 * menus with help from preceding functions
\r
692 *****************************************************************************/
\r
693 int __fastcall SetupMenus( intf_thread_t * p_intf )
\r
695 TMainFrameDlg * p_window = p_intf->p_sys->p_window;
\r
696 es_descriptor_t * p_audio_es;
\r
697 es_descriptor_t * p_spu_es;
\r
700 p_intf->p_sys->b_chapter_update |= p_intf->p_sys->b_title_update;
\r
701 p_intf->p_sys->b_audio_update |= p_intf->p_sys->b_title_update |
\r
702 p_intf->p_sys->b_program_update;
\r
703 p_intf->p_sys->b_spu_update |= p_intf->p_sys->b_title_update |
\r
704 p_intf->p_sys->b_program_update;
\r
706 if( p_intf->p_sys->b_program_update )
\r
708 pgrm_descriptor_t * p_pgrm;
\r
710 if( p_input_bank->pp_input[0]->stream.p_new_program )
\r
712 p_pgrm = p_input_bank->pp_input[0]->stream.p_new_program;
\r
716 p_pgrm = p_input_bank->pp_input[0]->stream.p_selected_program;
\r
719 ProgramMenu( p_window->MenuProgram, p_pgrm,
\r
720 p_window->MenuProgramClick );
\r
721 ProgramMenu( p_window->PopupProgram, p_pgrm,
\r
722 p_window->PopupProgramClick );
\r
724 p_intf->p_sys->b_program_update = 0;
\r
727 if( p_intf->p_sys->b_title_update )
\r
729 RadioMenu( p_window->MenuTitle, "Title",
\r
731 p_input_bank->pp_input[0]->stream.i_area_nb - 1,
\r
732 p_input_bank->pp_input[0]->stream.p_selected_area->i_id,
\r
733 p_window->MenuTitleClick );
\r
735 AnsiString CurrentTitle;
\r
736 CurrentTitle.sprintf( "%d",
\r
737 p_input_bank->pp_input[0]->stream.p_selected_area->i_id );
\r
738 p_window->LabelTitleCurrent->Caption = CurrentTitle;
\r
740 p_intf->p_sys->b_title_update = 0;
\r
743 if( p_intf->p_sys->b_chapter_update )
\r
745 RadioMenu( p_window->MenuChapter, "Chapter",
\r
746 p_input_bank->pp_input[0]->stream.p_selected_area->i_part_nb,
\r
747 p_input_bank->pp_input[0]->stream.p_selected_area->i_part,
\r
748 p_window->MenuChapterClick );
\r
750 NavigationMenu( p_window->PopupNavigation,
\r
751 p_window->PopupNavigationClick );
\r
753 AnsiString CurrentChapter;
\r
754 CurrentChapter.sprintf( "%d",
\r
755 p_input_bank->pp_input[0]->stream.p_selected_area->i_part );
\r
756 p_window->LabelChapterCurrent->Caption = CurrentChapter;
\r
758 p_intf->p_sys->i_part =
\r
759 p_input_bank->pp_input[0]->stream.p_selected_area->i_part;
\r
761 p_intf->p_sys->b_chapter_update = 0;
\r
764 /* look for selected ES */
\r
768 for( i = 0; i < p_input_bank->pp_input[0]->stream.i_selected_es_number; i++ )
\r
770 if( p_input_bank->pp_input[0]->stream.pp_selected_es[i]->i_cat
\r
773 p_audio_es = p_input_bank->pp_input[0]->stream.pp_selected_es[i];
\r
774 p_intfGlobal->p_sys->p_audio_es_old = p_audio_es;
\r
777 if( p_input_bank->pp_input[0]->stream.pp_selected_es[i]->i_cat
\r
780 p_spu_es = p_input_bank->pp_input[0]->stream.pp_selected_es[i];
\r
781 p_intfGlobal->p_sys->p_spu_es_old = p_spu_es;
\r
785 vlc_mutex_unlock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r
788 if( p_intf->p_sys->b_audio_update )
\r
790 LanguageMenu( p_window->MenuAudio, p_audio_es, AUDIO_ES,
\r
791 p_window->MenuAudioClick );
\r
792 LanguageMenu( p_window->PopupAudio, p_audio_es, AUDIO_ES,
\r
793 p_window->PopupAudioClick );
\r
795 p_intf->p_sys->b_audio_update = 0;
\r
798 /* sub picture menus */
\r
799 if( p_intf->p_sys->b_spu_update )
\r
801 LanguageMenu( p_window->PopupSubtitles, p_spu_es, SPU_ES,
\r
802 p_window->PopupSubtitleClick );
\r
803 LanguageMenu( p_window->MenuSubtitles, p_spu_es, SPU_ES,
\r
804 p_window->MenuSubtitleClick );
\r
806 p_intf->p_sys->b_spu_update = 0;
\r
809 vlc_mutex_lock( &p_input_bank->pp_input[0]->stream.stream_lock );
\r