1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        MenuPropDlg.cpp
3 // Purpose:     DVD menu properties dialog
4 // Author:      Alex Thuering
5 // Created:     25.04.2004
6 // RCS-ID:      $Id: MenuPropDlg.cpp,v 1.52 2017/01/02 10:46:47 ntalex Exp $
7 // Copyright:   (c) Alex Thuering
8 // Licence:     GPL
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #include "MenuPropDlg.h"
12 #include "TitlesetManager.h"
13 #include "Config.h"
14 #include "MenuCellsDlg.h"
15 #include "MenuActionsDlg.h"
16 #include <wxVillaLib/utils.h>
17 #include <wx/file.h>
18 #include "rc/preferences.png.h"
19 
20 enum {
21 	ASPECT_CHOICE_ID = 7850,
22 	AUDIO_CTRL_ID,
23 	LOOP_CB_ID,
24 	CELLS_BT_ID,
25 	ACTIONS_BT_ID
26 };
27 
BEGIN_EVENT_TABLE(MenuPropDlg,wxPropDlg)28 BEGIN_EVENT_TABLE(MenuPropDlg, wxPropDlg)
29 	EVT_CHOICE(ASPECT_CHOICE_ID, MenuPropDlg::OnChangeAspect)
30 	EVT_TEXT(AUDIO_CTRL_ID, MenuPropDlg::OnChangeAudio)
31 	EVT_CHECKBOX(LOOP_CB_ID, MenuPropDlg::OnLoopCheck)
32 	EVT_BUTTON(CELLS_BT_ID, MenuPropDlg::OnCellsBt)
33 	EVT_BUTTON(ACTIONS_BT_ID, MenuPropDlg::OnActionsBt)
34 END_EVENT_TABLE()
35 
36 MenuPropDlg::MenuPropDlg(wxWindow *parent, DVD* dvd, int tsi, int pgci):
37 		wxPropDlg(parent), m_dvd(dvd), m_tsi(tsi), m_pgci(pgci), m_aspect(NULL), m_wsFormat(NULL), m_audioFormat(NULL),
38 		m_pauseCtrl(NULL), m_postCommandsCtrl(NULL), m_subStartCtrlIdx(0), m_audioCtrlIdx(0), m_preCommandsCtrlIdx(0) {
39 	PgcArray& pgcs = m_dvd->GetPgcArray(tsi, true);
40 	m_video = &pgcs.GetVideo();
41 	m_langCodes = &pgcs.GetAudioLangCodes();
42 	m_pgc = pgcs[pgci];
43 	m_vob = m_dvd->GetMenuVob(tsi, pgci);
44 	m_menu = m_vob->GetMenu();
45 	VECTOR_COPY(m_vob->GetCells(), m_cells, Cell)
46 	VECTOR_COPY(m_menu->GetActions(), m_actions, DVDAction)
47 	m_audioFormat = NULL;
48 	// set title
49 	wxString title = _("Properties") + wxString(wxT(" - "));
50 	if (tsi >= 0) {
51 		if (dvd->GetTitlesets().Count() > 1)
52 			title += _("Titleset") + wxString::Format(wxT(" %d "), tsi+1);
53 		title += _("Menu") + wxString::Format(wxT(" %d"), pgci+1);
54 	} else
55 		title += _("VMGM menu") + wxString::Format(wxT(" %d"), pgci+1);
56 	SetTitle(title);
57 	// create
58 	Create();
59 	SetSize(400,-1);
60 }
61 
62 
~MenuPropDlg()63 MenuPropDlg::~MenuPropDlg() {
64 	VECTOR_CLEAR(m_cells, Cell)
65 	VECTOR_CLEAR(m_actions, DVDAction)
66 }
67 
68 /**
69  * Creates properties panel.
70  */
CreatePropPanel(wxSizer * sizer)71 void MenuPropDlg::CreatePropPanel(wxSizer* sizer) {
72 	bool loop = m_vob->GetPause() == 0 && m_pgc->GetPostCommands() == wxT("jump cell 1;");
73 	CreateVobGroup(sizer, loop);
74 	CreateButtonsGroup(sizer);
75 	CreateMenuGroup(sizer, loop);
76 }
77 
CreateAspectCtrls(wxSizer * sizer,wxSVG_PRESERVEASPECTRATIO align,wxSVG_MEETORSLICE meetOrSlice)78 void MenuPropDlg::CreateAspectCtrls(wxSizer* sizer, wxSVG_PRESERVEASPECTRATIO align,
79 		wxSVG_MEETORSLICE meetOrSlice) {
80 	bool keepAspectRatio = align > wxSVG_PRESERVEASPECTRATIO_NONE;
81 	BeginCheckGroup(sizer, _("Keep Aspect Ratio"), keepAspectRatio);
82 	sizer->AddSpacer(4);
83 	wxArrayString alignXStrings;
84 	alignXStrings.Add(_("X Min"));
85 	alignXStrings.Add(_("X Mid"));
86 	alignXStrings.Add(_("X Max"));
87 	int alignX = keepAspectRatio ? (align - wxSVG_PRESERVEASPECTRATIO_XMINYMIN) % 3 : 1;
88 	sizer->Add(AddChoiceProp(alignXStrings[alignX], alignXStrings));
89 	wxArrayString alignYStrings;
90 	alignYStrings.Add(_("Y Min"));
91 	alignYStrings.Add(_("Y Mid"));
92 	alignYStrings.Add(_("Y Max"));
93 	int alignY = keepAspectRatio ? (align - wxSVG_PRESERVEASPECTRATIO_XMINYMIN) / 3 : 1;
94 	sizer->Add(AddChoiceProp(alignYStrings[alignY], alignYStrings), 0, wxLEFT, 4);
95 	wxArrayString meetStrings;
96 	meetStrings.Add(_("Meet"));
97 	meetStrings.Add(_("Slice"));
98 	int meet = meetOrSlice == wxSVG_MEETORSLICE_SLICE ? 1 : 0;
99 	sizer->Add(AddChoiceProp(meetStrings[meet], meetStrings), 0, wxLEFT, 4);
100 	sizer->AddStretchSpacer(1);
101 	EndGroup();
102 }
103 
CreateVobGroup(wxSizer * sizer,bool loop)104 void MenuPropDlg::CreateVobGroup(wxSizer* sizer, bool loop) {
105 	wxSizer* grpSizer = BeginGroup(sizer, _("Video object"));
106 	wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
107 	grid->AddGrowableCol(1);
108 
109 	// format
110 	AddText(grid, _("Format:"));
111 	wxSizer* formatSizer = new wxBoxSizer(wxHORIZONTAL);
112 	wxArrayString formats = DVD::GetVideoFormatLabels(false, false, true, s_config.GetAllowHdMenues() && m_dvd->IsHD());
113 	int vf = m_menu->GetVideoFormat();
114 	if (s_config.GetAllowHdMenues() && m_dvd->IsHD()) {
115 		vf = vf >= vfPAL_HALF_HD ? vf - vfPAL_HALF_HD : (vf >= vfPAL && vf < vfPAL_HALF_HD ? vf + 4 : 0);
116 	} else {
117 		vf = vf >= vfPAL && vf < vfPAL_HALF_HD ? vf - 2 : 0;
118 	}
119 	formatSizer->Add(AddChoiceProp(formats[vf], formats), 0, wxEXPAND);
120 	formatSizer->AddSpacer(4);
121 	formats = DVD::GetAspectRatioLabels();
122 	int ar = m_menu->GetAspectRatio() >= 1 ? m_menu->GetAspectRatio() - 1 : 0;
123 	formatSizer->Add(AddChoiceProp(formats[ar], formats, ASPECT_CHOICE_ID), 0, wxEXPAND);
124 	m_aspect = (wxChoice*) GetLastControl();
125 	formatSizer->AddSpacer(4);
126 	wxArrayString wsFormats = m_video->GetWidescreenStrings(_("auto"));
127 	formatSizer->Add(AddChoiceProp(wsFormats[m_video->GetWidescreen()], wsFormats), 0, wxEXPAND);
128 	m_wsFormat = (wxChoice*) GetLastControl();
129 	formatSizer->AddStretchSpacer(1);
130 	grid->Add(formatSizer, 0, wxEXPAND);
131 	wxCommandEvent evt;
132 	OnChangeAspect(evt);
133 
134 	// Background
135 	wxString video = wxThumbnails::GetVideoExtWildcard();
136 	wxString imageExt = wxImage::GetImageExtWildcard();
137 	AddFileProp(grid, _("Background:"), m_menu->GetBackground(), wxFD_OPEN, wxT("..."),
138 			_("Image and Video Files") + wxString::Format(wxT("|%s%s|"), video.c_str(), imageExt.AfterLast(wxT('|')).c_str())
139 			+ _("Video Files") + wxString::Format(wxT(" (%s)|%s|"), video.c_str(), video.c_str())
140 			+ _("Image Files ") + imageExt
141 			+ wxT("|") + wxString(_("All Files")) + wxT(" (*.*)|*.*"));
142 	// Keep aspect ratio
143 	grid->AddSpacer(8);
144 	wxSizer* cbSizer = new wxBoxSizer(wxHORIZONTAL);
145 	CreateAspectCtrls(cbSizer, m_menu->GetBackgroundAlign(), m_menu->GetBackgroundMeetOrSlice());
146 	grid->Add(cbSizer, 0, wxEXPAND|wxALL, 4);
147 	// Colour
148 	AddColourProp(grid, wxT(" "), m_menu->GetBackgroundColour());
149 
150 	// audio file
151 	wxString audioFile = m_vob->GetAudioFilenames().size() ? m_vob->GetAudioFilenames()[0] : wxT("");
152 	wxString audio = wxThumbnails::GetAudioExtWildcard();
153 	AddFileProp(grid, _("Audio:"), audioFile, wxFD_OPEN, wxT("..."),
154 			_("Audio Files") + wxString::Format(wxT(" (%s)|%s|"), audio.c_str(), audio.c_str())
155 			+ _("All Files") + wxString(wxT(" (*.*)|*.*")), AUDIO_CTRL_ID);
156 	m_audioCtrlIdx = GetLastControlIndex();
157 	// audio format
158 	grid->AddSpacer(8);
159 	Stream* stream = audioFile.length() > 0 ? m_vob->GetStreams()[m_vob->GetStreams().size() - 1] : NULL;
160 	int af = stream != NULL ? stream->GetAudioFormat() - 1 : afCOPY - 1;
161 	formats = DVD::GetAudioFormatLabels(true);
162 	wxSizer* audioFormatSizer = AddChoiceProp(grid, wxT(""), formats[af], formats, 0, false);
163 	m_audioFormat = (wxChoice*) GetLastControl();
164 	m_audioFormat->Enable(audioFile.length() > 0);
165 	wxArrayString labels = DVD::GetAudioLanguageCodes();
166 	if (m_langCodes->GetCount() < 1)
167 		m_langCodes->Add(s_config.GetDefAudioLanguage());
168 	audioFormatSizer->AddSpacer(4);
169 	AddChoiceProp(audioFormatSizer, wxT(""), (*m_langCodes)[0], labels, 0, false);
170 	// pause and loop
171 	wxSizer* pSizer = AddSpinProp(grid, _("Pause:"), m_vob->GetPause(), -1, 254, 100, _("sec"),false);
172 	m_pauseCtrl = (wxSpinCtrl*) GetLastControl();
173 	m_pauseCtrl->Enable(!loop);
174 	pSizer->AddSpacer(8);
175 	AddCheckProp(pSizer, _("Loop"), loop, false, LOOP_CB_ID);
176 
177 	grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
178 	sizer->AddSpacer(6);
179 }
180 
CreateButtonsGroup(wxSizer * sizer)181 void MenuPropDlg::CreateButtonsGroup(wxSizer* sizer) {
182 	wxSizer* grpSizer = BeginGroup(sizer, _("Buttons"));
183 	wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
184 	grid->AddGrowableCol(1);
185 	// Start/End
186 	wxSizer* timeSizer = AddTextProp(grid, _("Subpicture start/end:"), m_menu->GetStartTime(), false, 100, false);
187 	m_subStartCtrlIdx = GetLastControlIndex();
188 	AddTextProp(timeSizer, wxT(" - "), m_menu->GetEndTime(), false, 100);
189 	grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
190 	// Remember last selected button
191 	wxSizer* cbSizer = new wxBoxSizer(wxHORIZONTAL);
192 	BeginCheckGroup(cbSizer, _("Remember last selected button"), m_menu->GetRememberLastButton());
193 	cbSizer->AddSpacer(4);
194 	wxArrayString registers;
195 	registers.Add(_("Auto"));
196 	for (int i=0; i<13; i++)
197 		registers.Add(wxString::Format(wxT("g%d"), i));
198 	cbSizer->Add(AddChoiceProp(registers[m_menu->GetRememberLastButtonRegister() + 1], registers));
199 	cbSizer->AddStretchSpacer(1);
200 	grpSizer->Add(cbSizer, 0, wxEXPAND|wxALL, 4);
201 	sizer->AddSpacer(6);
202 	EndGroup();
203 }
204 
CreateMenuGroup(wxSizer * sizer,bool loop)205 void MenuPropDlg::CreateMenuGroup(wxSizer* sizer, bool loop) {
206 	wxSizer* grpSizer = BeginGroup(sizer, _("Menu"));
207 	wxFlexGridSizer* grid = new wxFlexGridSizer(2, 4, 6);
208 	grid->AddGrowableCol(1);
209 
210 	const StringSet& entries = m_pgc->GetEntries();
211 	AddText(grid, _("Entry"), m_tsi >= 0 ? wxALIGN_TOP : wxALIGN_CENTER_VERTICAL);
212 	if (m_tsi >= 0) {
213 		wxFlexGridSizer* entryGrid = new wxFlexGridSizer(3, 4, 16);
214 		AddCheckProp(entryGrid, _("Root"), entries.find(wxT("root")) != entries.end());
215 		AddCheckProp(entryGrid, _("Subtitle"), entries.find(wxT("subtitle")) != entries.end());
216 		AddCheckProp(entryGrid, _("Chapter"), entries.find(wxT("ptt")) != entries.end());
217 		AddCheckProp(entryGrid, _("Audio"), entries.find(wxT("audio")) != entries.end());
218 		AddCheckProp(entryGrid, _("Angle"), entries.find(wxT("angle")) != entries.end());
219 		grid->Add(entryGrid);
220 	} else
221 		AddCheckProp(grid, _("Title"), entries.find(wxT("title")) != entries.end());
222 
223 	// Pre and post commans
224 	wxArrayString commands = GetCommandList();
225 	AddComboProp(grid, _("Pre commands:"), m_pgc->GetPreCommands(), commands);
226 	m_preCommandsCtrlIdx = GetLastControlIndex();
227 	AddComboProp(grid, _("Post commands:"), m_pgc->GetPostCommands(), commands);
228 	m_postCommandsCtrl = (wxComboBox*) GetLastControl();
229 	m_postCommandsCtrl->Enable(!loop);
230 
231 	grpSizer->Add(grid, 0, wxEXPAND|wxALL, 4);
232 }
233 
234 /**
235  * Creates panel with buttons
236  */
CreateButtonPane(wxSizer * sizer,bool resetButton,bool dontShowCheckbox)237 void MenuPropDlg::CreateButtonPane(wxSizer* sizer, bool resetButton, bool dontShowCheckbox) {
238 	wxStdDialogButtonSizer* buttonPane = new wxStdDialogButtonSizer();
239 
240 	// cells & actions buttons
241 	buttonPane->Add(new wxButton(this, CELLS_BT_ID, _("Cells...")));
242 	buttonPane->Add(new wxButton(this, ACTIONS_BT_ID, _("Actions...")));
243 	buttonPane->Add(10, 10, 1, wxEXPAND);
244 
245 	// ok & cancel buttons
246 	buttonPane->AddButton(new wxButton(this, wxID_OK, wxEmptyString));
247 	buttonPane->AddButton(new wxButton(this, wxID_CANCEL, wxEmptyString));
248 
249 	buttonPane->Realize();
250 	buttonPane->GetAffirmativeButton()->SetDefault();
251 	sizer->Add(buttonPane, 0, wxEXPAND|wxLEFT|wxRIGHT|wxBOTTOM, 10);
252 }
253 
GetCommandList()254 wxArrayString MenuPropDlg::GetCommandList() {
255 	wxArrayString commands;
256 #ifdef __WXMAC__
257 	commands.Add(wxT(""));
258 #endif
259 	commands.Add(wxT("jump cell 1;"));
260 	for (int pgci=0; pgci<(int)m_dvd->GetVmgm().Count(); pgci++)
261 		commands.Add(wxString::Format(_T("jump vmgm menu %d;"),pgci+1));
262 	for (int tsi=0; tsi<(int)m_dvd->GetTitlesets().Count(); tsi++) {
263 		Titleset* ts = m_dvd->GetTitlesets()[tsi];
264 		for (int pgci=0; pgci<(int)ts->GetMenus().Count(); pgci++)
265 			commands.Add(wxString::Format(_T("jump menu %d;"),pgci+1));
266 		for (int pgci=0; pgci<(int)ts->GetTitles().Count(); pgci++)
267 			commands.Add(wxString::Format(_T("jump title %d;"),pgci+1));
268 	}
269 	return commands;
270 }
271 
SetValues()272 bool MenuPropDlg::SetValues() {
273 	// validate sub end
274 	if (GetString(m_subStartCtrlIdx).size() > 0 && GetString(m_subStartCtrlIdx+1).size() > 0
275 			&& String2Time(GetString(m_subStartCtrlIdx)) >= String2Time(GetString(m_subStartCtrlIdx + 1))) {
276 		wxLogError(_("Subpicture end must be greater than start or empty"));
277 		return false;
278 	}
279 	// validate audio file
280 	wxString audioFile = GetString(m_audioCtrlIdx);
281 	if (audioFile.length() > 0) {
282 		if (!wxFile::Exists(audioFile)) {
283 			wxLogError(_("File %s doesn't exist."), audioFile.c_str());
284 			return false;
285 		}
286 		wxFfmpegMediaDecoder ffmpeg;
287 		if (!ffmpeg.Load(audioFile))
288 			return false;
289 		if (ffmpeg.GetStreamCount() == 0 || ffmpeg.GetStreamType(0) != stAUDIO) {
290 			wxLogError(_("File %s isn't audio file."), audioFile.c_str());
291 			return false;
292 		}
293 	}
294 
295 	// validate commands
296 	wxString preCommands = GetString(m_preCommandsCtrlIdx);
297 	wxString postCommands = GetString(m_preCommandsCtrlIdx + 1);
298 	DVDAction action;
299 	action.SetCustom(preCommands);
300 	if (preCommands.length() && !action.IsValid(m_dvd, m_tsi, m_pgci, true, wxT(""), true, false)) {
301 		return false;
302 	}
303 	action.SetCustom(postCommands);
304 	if (postCommands.length() && !action.IsValid(m_dvd, m_tsi, m_pgci, true, wxT(""), true, false)) {
305 		return false;
306 	}
307 
308 	if (postCommands.length() && GetInt(m_audioCtrlIdx + 3) == -1) {
309 		wxLogError(_("Post commands will not be executed if pause is set to -1"));
310 		return false;
311 	}
312 
313 	int n = 0;
314 
315 	// set video format
316 	int vf = GetInt(n++);
317 	if (s_config.GetAllowHdMenues() && m_dvd->IsHD()) {
318 		vf = vf <= 5 ? vf + vfPAL_HALF_HD : vf - 4;
319 	} else {
320 		vf += 2;
321 	}
322 	VideoFormat videoFormat = (VideoFormat) vf;
323 	if (videoFormat != m_menu->GetVideoFormat()) {
324 		m_dvd->GetPgcArray(m_tsi, true).SetVideoFormat(videoFormat);
325 	}
326 	// set aspect ratio
327 	AspectRatio aspectRatio = (AspectRatio) (GetInt(n++) + 1);
328 	if (aspectRatio != m_menu->GetAspectRatio()) {
329 		m_dvd->GetPgcArray(m_tsi, true).SetAspectRatio(aspectRatio);
330 	}
331 	// set WS format
332 	m_video->SetWidescreen((WidescreenType) GetInt(n++));
333 
334 	m_menu->SetBackground(GetString(n++));
335 	if (m_menu->GetBackground().length()) {
336 		if (GetBool(n++)) {
337 			int alignX = GetInt(n++);
338 			int alignY = GetInt(n++);
339 			m_menu->SetBackgroundAlign((wxSVG_PRESERVEASPECTRATIO) (wxSVG_PRESERVEASPECTRATIO_XMINYMIN + alignY * 3 + alignX));
340 			int meet = GetInt(n++);
341 			m_menu->SetBackgroundMeetOrSlice(meet == 0 ? wxSVG_MEETORSLICE_MEET : wxSVG_MEETORSLICE_SLICE);
342 		} else {
343 			n += 3;
344 			m_menu->SetBackgroundAlign(wxSVG_PRESERVEASPECTRATIO_NONE);
345 		}
346 	} else
347 		n += 4;
348 	m_menu->SetBackgroundColour(GetColour(n++));
349 
350 	// VOB properties
351 	audioFile = GetString(n++).Strip(wxString::both);
352 	while (m_vob->GetAudioFilenames().GetCount() > 0)
353 		m_vob->RemoveAudioFile(0);
354 	if (audioFile.length() > 0) {
355 		m_vob->AddAudioFile(audioFile);
356 		if (m_vob->GetStreams().size() > 0) {
357 			Stream* stream = m_vob->GetStreams()[m_vob->GetStreams().size() - 1];
358 			if (stream->GetType() == stAUDIO)
359 				stream->SetAudioFormat((AudioFormat) (GetInt(n) + 1));
360 		}
361 	}
362 	n++;
363 	m_langCodes->RemoveAt(0);
364 	m_langCodes->Insert(GetString(n++), 0);
365 	m_vob->GetCells().swap(m_cells);
366 	m_menu->GetActions().swap(m_actions);
367 	m_vob->SetPause(GetInt(n++));
368 	n++; // loop
369 
370 	// subpictures/buttons
371 	m_menu->SetStartTime(GetString(n++));
372 	m_menu->SetEndTime(GetString(n++));
373 	m_menu->SetRememberLastButton(GetBool(n++));
374 	m_menu->SetRememberLastButtonRegister(m_menu->GetRememberLastButton() ? GetInt(n) - 1 : -1);
375 	n++; // Last button register
376 
377 	// set entries
378 	StringSet& entries = m_pgc->GetEntries();
379 	entries.clear();
380 	if (m_tsi >= 0) {
381 		if (GetBool(n++))
382 			entries.insert(wxT("root"));
383 		if (GetBool(n++))
384 			entries.insert(wxT("subtitle"));
385 		if (GetBool(n++))
386 			entries.insert(wxT("ptt"));
387 		if (GetBool(n++))
388 			entries.insert(wxT("audio"));
389 		if (GetBool(n++))
390 			entries.insert(wxT("angle"));
391 	} else if (GetBool(n++))
392 		entries.insert(wxT("title"));
393 	// remove same entries from other menus in the same titleset
394 	PgcArray& pgcs = m_dvd->GetPgcArray(m_tsi, true);
395 	for (int pgci = 0; pgci<(int)pgcs.size(); pgci++) {
396 		if (pgci != m_pgci) {
397 			pgcs[pgci]->RemoveEntries(entries);
398 		}
399 	}
400 
401 	m_pgc->SetPreCommands(GetString(n++));
402 	m_pgc->SetPostCommands(GetString(n++));
403 	// fix coordinates of buttons if they are out of range
404 	m_menu->FixButtonCoordinates();
405 	return true;
406 }
407 
OnChangeAspect(wxCommandEvent & event)408 void MenuPropDlg::OnChangeAspect(wxCommandEvent& event) {
409 	AspectRatio aspect = (AspectRatio) (m_aspect->GetSelection() + 1);
410 	m_wsFormat->Enable(aspect == ar16_9);
411 }
412 
OnChangeAudio(wxCommandEvent & event)413 void MenuPropDlg::OnChangeAudio(wxCommandEvent& event) {
414 	if (!m_audioFormat)
415 		return;
416 	wxString audioFile = event.GetString();
417 	m_audioFormat->Enable(audioFile.length() > 0);
418 	// set audio format
419 	wxFfmpegMediaDecoder ffmpeg;
420 	if (wxFile::Exists(audioFile) && ffmpeg.Load(audioFile) && ffmpeg.GetStreamCount() > 0
421 			&& ffmpeg.GetStreamType(0) == stAUDIO) {
422 		AudioFormat af = afCOPY;
423 		wxString codecName = ffmpeg.GetCodecName(0);
424 		int sampleRate = ffmpeg.GetSampleRate(0);
425 		if (codecName != wxT("mp2") && codecName != wxT("ac3") && codecName != wxT("liba52"))
426 			af = m_dvd->GetAudioFormat();
427 		else if (sampleRate != 48000)
428 			af = codecName == wxT("mp2") ? afMP2 : afAC3;
429 		m_audioFormat->SetSelection(af - 1);
430 	}
431 }
432 
OnLoopCheck(wxCommandEvent & event)433 void MenuPropDlg::OnLoopCheck(wxCommandEvent& event) {
434 	m_pauseCtrl->SetValue(event.IsChecked() ? 0 : -1);
435 	m_pauseCtrl->Enable(!event.IsChecked());
436 	m_postCommandsCtrl->SetValue(event.IsChecked() ? wxT("jump cell 1;"): wxT(""));
437 	m_postCommandsCtrl->Enable(!event.IsChecked());
438 }
439 
OnCellsBt(wxCommandEvent & event)440 void MenuPropDlg::OnCellsBt(wxCommandEvent& event) {
441 	MenuCellsDlg dlg(this, m_dvd, m_tsi, m_pgci, m_cells);
442 	if (dlg.ShowModal() == wxID_OK)
443 		m_cells.swap(dlg.GetCells());
444 }
445 
OnActionsBt(wxCommandEvent & event)446 void MenuPropDlg::OnActionsBt(wxCommandEvent& event) {
447 	MenuActionsDlg dlg(this, m_dvd, m_tsi, m_pgci, m_actions);
448 	if (dlg.ShowModal() == wxID_OK)
449 		m_actions.swap(dlg.GetActions());
450 }
451