OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / AudioPanel.cs
1 /*  AudioPanel.cs $\r
2     This file is part of the HandBrake source code.\r
3     Homepage: <http://handbrake.fr>.\r
4     It may be used under the terms of the GNU General Public License. */\r
5 \r
6 namespace Handbrake.Controls\r
7 {\r
8     using System;\r
9     using System.Collections;\r
10     using System.Linq;\r
11     using System.Windows.Forms;\r
12     using Parsing;\r
13     using AudioTrack = Model.AudioTrack;\r
14 \r
15     public partial class AudioPanel : UserControl\r
16     {\r
17         /// <summary>\r
18         /// The audio list has changed\r
19         /// </summary>\r
20         public event EventHandler AudioListChanged;\r
21 \r
22         /// <summary>\r
23         /// Initializes a new instance of the <see cref="AudioPanel"/> class. \r
24         /// Create a new instance of the Audio Panel\r
25         /// </summary>\r
26         public AudioPanel()\r
27         {\r
28             InitializeComponent();\r
29             drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
30             drp_audioSample.SelectedIndex = 1;\r
31         }\r
32 \r
33         /// <summary>\r
34         /// Get the audio panel\r
35         /// </summary>\r
36         /// <returns>A listview containing the audio tracks</returns>\r
37         public ListView GetAudioPanel()\r
38         {\r
39             return lv_audioList;\r
40         }\r
41 \r
42         /// <summary>\r
43         /// Set the File Container. This funciton is used to limit the available options for each file container.\r
44         /// </summary>\r
45         /// <param name="path"></param>\r
46         public void SetContainer(string path)\r
47         {\r
48             string oldval = drp_audioEncoder.Text;\r
49             if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
50             {\r
51                 drp_audioEncoder.Items.Clear();\r
52                 drp_audioEncoder.Items.Add("AAC (faac)");\r
53                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
54                 if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
55                     drp_audioEncoder.SelectedIndex = 0;\r
56                 else\r
57                     drp_audioEncoder.SelectedItem = oldval;\r
58             }\r
59             else if (path.Contains("MKV"))\r
60             {\r
61                 drp_audioEncoder.Items.Clear();\r
62                 drp_audioEncoder.Items.Add("AAC (faac)");\r
63                 drp_audioEncoder.Items.Add("MP3 (lame)");\r
64                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
65                 drp_audioEncoder.Items.Add("DTS Passthru");\r
66                 drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
67                 drp_audioEncoder.SelectedItem = oldval;\r
68 \r
69                 if (drp_audioEncoder.Text == string.Empty)\r
70                     drp_audioEncoder.SelectedIndex = 0;\r
71             }\r
72 \r
73             // Make sure the table is updated with new audio codecs\r
74             foreach (ListViewItem row in lv_audioList.Items)\r
75             {\r
76                 if (!drp_audioEncoder.Items.Contains(row.SubItems[2].Text))\r
77                     row.SubItems[2].Text = drp_audioEncoder.Items[0].ToString();\r
78             }\r
79         }\r
80 \r
81         /// <summary>\r
82         /// Checks if the settings used required the .m4v (rather than .mp4) extension\r
83         /// </summary>\r
84         /// <returns></returns>\r
85         public bool RequiresM4V()\r
86         {\r
87             return lv_audioList.Items.Cast<ListViewItem>().Any(item => item.SubItems[2].Text.Contains("AC3"));\r
88         }\r
89 \r
90         /// <summary>\r
91         /// Load an arraylist of AudioTrack items into the list.\r
92         /// </summary>\r
93         /// <param name="audioTracks"></param>\r
94         public void LoadTracks(ArrayList audioTracks)\r
95         {\r
96             ClearAudioList();\r
97 \r
98             if (audioTracks == null)\r
99                 return;\r
100 \r
101             foreach (AudioTrack track in audioTracks)\r
102             {\r
103                 ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
104 \r
105                 newTrack.SubItems.Add("Automatic");\r
106                 newTrack.SubItems.Add(track.Encoder);\r
107                 newTrack.SubItems.Add(track.MixDown);\r
108                 newTrack.SubItems.Add(track.SampleRate);\r
109                 newTrack.SubItems.Add(track.Encoder.Contains("AC3") ? "Auto" : track.Bitrate);\r
110                 newTrack.SubItems.Add(track.DRC);\r
111                 AddTrackForPreset(newTrack);\r
112             }\r
113         }\r
114 \r
115         /// <summary>\r
116         /// Set the Track list dropdown from the parsed title captured during the scan\r
117         /// </summary>\r
118         /// <param name="selectedTitle"></param>\r
119         public void SetTrackList(Title selectedTitle)\r
120         {\r
121             drp_audioTrack.Items.Clear();\r
122             drp_audioTrack.Items.Add("Automatic");\r
123             drp_audioTrack.Items.Add("None");\r
124             drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
125 \r
126             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
127             if (Properties.Settings.Default.NativeLanguage == "Any")\r
128                 drp_audioTrack.SelectedIndex = drp_audioTrack.Items.Count >= 3 ? 2 : 0;\r
129             else\r
130             {\r
131                 if (Properties.Settings.Default.DubAudio) // "Dub Foreign language audio" \r
132                 {\r
133                     int i = 0;\r
134                     foreach (object item in drp_audioTrack.Items)\r
135                     {\r
136                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
137                         {\r
138                             drp_audioTrack.SelectedIndex = i;\r
139                             break;\r
140                         }\r
141 \r
142                         i++;\r
143                     }\r
144 \r
145                     if (drp_audioTrack.SelectedItem != null)\r
146                         foreach (ListViewItem item in lv_audioList.Items)\r
147                             item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
148                     else\r
149                     {\r
150                         drp_audioTrack.SelectedIndex = 0;\r
151                         if (drp_audioTrack.SelectedItem != null)\r
152                             foreach (ListViewItem item in lv_audioList.Items)\r
153                                 item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
154                     }\r
155                 }\r
156                 else\r
157                     drp_audioTrack.SelectedIndex = drp_audioTrack.Items.Count >= 3 ? 2 : 0;\r
158                         // "Use Foreign language audio and Subtitles"\r
159             }\r
160         }\r
161 \r
162         // Control and ListView\r
163         private void controlChanged(object sender, EventArgs e)\r
164         {\r
165             Control ctl = (Control) sender;\r
166 \r
167             switch (ctl.Name)\r
168             {\r
169                 case "drp_audioTrack":\r
170                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
171                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audioTrack.Text;\r
172                     break;\r
173                 case "drp_audioEncoder":\r
174                     SetMixDown();\r
175                     SetBitrate();\r
176 \r
177                     // Configure the widgets with values\r
178                     if (drp_audioEncoder.Text.Contains("AC3") || drp_audioEncoder.Text.Contains("DTS"))\r
179                     {\r
180                         drp_audioMix.Enabled =\r
181                             drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;\r
182                         lbl_bitrate.Enabled =\r
183                             lbl_drc.Enabled =\r
184                             lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;\r
185                     }\r
186                     else\r
187                     {\r
188                         drp_audioMix.Enabled =\r
189                             drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;\r
190                         lbl_bitrate.Enabled =\r
191                             lbl_drc.Enabled =\r
192                             lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;\r
193                     }\r
194 \r
195                     // Update an item in the Audio list if required.\r
196                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
197                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
198                     break;\r
199                 case "drp_audioMix":\r
200                     SetBitrate();\r
201 \r
202                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
203                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
204                     break;\r
205                 case "drp_audioSample":\r
206                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
207                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
208                     break;\r
209                 case "drp_audioBitrate":\r
210                     // Update an item in the Audio list if required.\r
211                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
212                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
213                     break;\r
214                 case "tb_drc":\r
215                     double value;\r
216                     if (tb_drc.Value == 0) value = 0;\r
217                     else\r
218                         value = ((tb_drc.Value - 1)/10.0) + 1;\r
219 \r
220                     lbl_drc.Text = value.ToString();\r
221 \r
222                     // Update an item in the Audio list if required.\r
223                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
224                     {\r
225                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
226                         lv_audioList.Select();\r
227                     }\r
228                     break;\r
229             }\r
230 \r
231             lv_audioList.Select();\r
232         }\r
233 \r
234         private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
235         {\r
236             // Set the dropdown controls based on the selected item in the Audio List.\r
237             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
238             {\r
239                 drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
240                 drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
241                 drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
242                 drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
243                 drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
244                 double drcValue;\r
245                 int drcCalculated;\r
246                 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
247                 if (drcValue != 0)\r
248                     drcValue = ((drcValue*10) + 1) - 10;\r
249                 int.TryParse(drcValue.ToString(), out drcCalculated);\r
250                 tb_drc.Value = drcCalculated;\r
251                 lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
252 \r
253                 AudioTrackGroup.Text = "Selected Track: " +\r
254                                        lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
255             }\r
256             else\r
257                 AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
258         }\r
259 \r
260         // Track Controls\r
261         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
262         {\r
263             double value = 0;\r
264             if (tb_drc.Value != 0)\r
265                 value = ((tb_drc.Value - 1)/10.0) + 1;\r
266 \r
267             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
268             ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
269             newTrack.SubItems.Add(drp_audioTrack.Text);\r
270             newTrack.SubItems.Add(drp_audioEncoder.Text);\r
271             newTrack.SubItems.Add(drp_audioMix.Text);\r
272             newTrack.SubItems.Add(drp_audioSample.Text);\r
273             newTrack.SubItems.Add(drp_audioBitrate.Text);\r
274             newTrack.SubItems.Add(value.ToString());\r
275             lv_audioList.Items.Add(newTrack);\r
276 \r
277             // The Audio List has changed to raise the event.\r
278             if (this.AudioListChanged != null)\r
279                 this.AudioListChanged(this, new EventArgs());\r
280 \r
281             // Select the newly added track and select the control       \r
282             lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
283             lv_audioList.Select();\r
284         }\r
285 \r
286         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
287         {\r
288             RemoveTrack();\r
289         }\r
290 \r
291         // Audio List Menu\r
292         private void audioList_moveup_Click(object sender, EventArgs e)\r
293         {\r
294             MoveTrack(true);\r
295         }\r
296 \r
297         private void audioList_movedown_Click(object sender, EventArgs e)\r
298         {\r
299             MoveTrack(false);\r
300         }\r
301 \r
302         private void audioList_remove_Click(object sender, EventArgs e)\r
303         {\r
304             RemoveTrack();\r
305         }\r
306 \r
307         // Public Functions\r
308         private void AddTrackForPreset(ListViewItem item)\r
309         {\r
310             lv_audioList.Items.Add(item);\r
311             if (this.AudioListChanged != null)\r
312                 this.AudioListChanged(this, new EventArgs());\r
313         }\r
314 \r
315         private void ClearAudioList()\r
316         {\r
317             lv_audioList.Items.Clear();\r
318             if (this.AudioListChanged != null)\r
319                 this.AudioListChanged(this, new EventArgs());\r
320         }\r
321 \r
322         private int GetNewID()\r
323         {\r
324             return lv_audioList.Items.Count + 1;\r
325         }\r
326 \r
327         private void RemoveTrack()\r
328         {\r
329             // Remove the Item and reselect the control if the following conditions are met.\r
330             if (lv_audioList.SelectedItems.Count != 0)\r
331             {\r
332                 // The Audio List is about to change so raise the event.\r
333                 if (this.AudioListChanged != null)\r
334                     this.AudioListChanged(this, new EventArgs());\r
335 \r
336                 // Record the current selected index.\r
337                 int currentPosition = lv_audioList.SelectedIndices[0];\r
338 \r
339                 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
340 \r
341                 // Now reslect the correct item and give focus to the audio list.\r
342                 if (lv_audioList.Items.Count != 0)\r
343                 {\r
344                     if (currentPosition <= (lv_audioList.Items.Count - 1))\r
345                         lv_audioList.Items[currentPosition].Selected = true;\r
346                     else if (currentPosition > (lv_audioList.Items.Count - 1))\r
347                         lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
348 \r
349                     lv_audioList.Select();\r
350                 }\r
351                 // Regenerate the ID numers\r
352                 ReGenerateListIDs();\r
353             }\r
354         }\r
355 \r
356         private void MoveTrack(bool up)\r
357         {\r
358             if (lv_audioList.SelectedIndices.Count == 0) return;\r
359 \r
360             ListViewItem item = lv_audioList.SelectedItems[0];\r
361             int index = item.Index;\r
362 \r
363             if (up) index--;\r
364             else index++;\r
365 \r
366             if (index < lv_audioList.Items.Count || (lv_audioList.Items.Count > index && index >= 0))\r
367             {\r
368                 lv_audioList.Items.Remove(item);\r
369                 lv_audioList.Items.Insert(index, item);\r
370                 item.Selected = true;\r
371                 lv_audioList.Focus();\r
372             }\r
373         }\r
374 \r
375         private void ReGenerateListIDs()\r
376         {\r
377             int i = 1;\r
378             foreach (ListViewItem item in lv_audioList.Items)\r
379             {\r
380                 item.SubItems[0].Text = i.ToString();\r
381                 i++;\r
382             }\r
383         }\r
384 \r
385         private void SetBitrate()\r
386         {\r
387             int max = 0;\r
388             drp_audioBitrate.Items.Remove("Auto");\r
389             drp_audioBitrate.Items.Remove("192");\r
390             drp_audioBitrate.Items.Remove("224");\r
391             drp_audioBitrate.Items.Remove("256");\r
392             drp_audioBitrate.Items.Remove("320");\r
393 \r
394             switch (drp_audioEncoder.Text)\r
395             {\r
396                 case "AAC (faac)":\r
397                     max = drp_audioMix.Text.Contains("6 Channel") ? 384 : 160;\r
398                     break;\r
399                 case "MP3 (lame)":\r
400                     max = 320;\r
401                     break;\r
402                 case "Vorbis (vorbis)":\r
403                     max = 384;\r
404                     break;\r
405                 case "AC3 Passthru":\r
406                     drp_audioBitrate.Items.Add("Auto");\r
407                     drp_audioBitrate.SelectedItem = "Auto";\r
408                     drp_audioSample.SelectedItem = "Auto";\r
409                     break;\r
410                 case "DTS Passthru":\r
411                     drp_audioBitrate.Items.Add("Auto");\r
412                     drp_audioBitrate.SelectedItem = "Auto";\r
413                     drp_audioSample.SelectedItem = "Auto";\r
414                     break;\r
415             }\r
416 \r
417             if (max > 160)\r
418             {\r
419                 drp_audioBitrate.Items.Add("192");\r
420                 drp_audioBitrate.Items.Add("224");\r
421                 drp_audioBitrate.Items.Add("256");\r
422                 drp_audioBitrate.Items.Add("320");\r
423                 if (max == 384)\r
424                     drp_audioBitrate.Items.Add("384");\r
425                 else\r
426                     drp_audioBitrate.Items.Remove("384");\r
427             }\r
428             else\r
429             {\r
430                 drp_audioBitrate.Items.Remove("192");\r
431                 drp_audioBitrate.Items.Remove("224");\r
432                 drp_audioBitrate.Items.Remove("256");\r
433                 drp_audioBitrate.Items.Remove("320");\r
434                 drp_audioBitrate.Items.Remove("384");\r
435             }\r
436 \r
437             if (drp_audioBitrate.SelectedItem == null)\r
438                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
439         }\r
440 \r
441         private void SetMixDown()\r
442         {\r
443             drp_audioMix.Items.Clear();\r
444             drp_audioMix.Items.Add("Mono");\r
445             drp_audioMix.Items.Add("Stereo");\r
446             drp_audioMix.Items.Add("Dolby Surround");\r
447             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
448             drp_audioMix.Items.Add("6 Channel Discrete");\r
449             drp_audioMix.Items.Add("AC3 Passthru");\r
450             drp_audioMix.Items.Add("DTS Passthru");\r
451 \r
452             drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
453 \r
454             switch (drp_audioEncoder.Text)\r
455             {\r
456                 case "AAC (faac)":\r
457                     drp_audioMix.Items.Remove("AC3 Passthru");\r
458                     drp_audioMix.Items.Remove("DTS Passthru");\r
459                     break;\r
460                 case "MP3 (lame)":\r
461                     drp_audioMix.Items.Remove("Mono");\r
462                     drp_audioMix.Items.Remove("6 Channel Discrete");\r
463                     drp_audioMix.Items.Remove("AC3 Passthru");\r
464                     drp_audioMix.Items.Remove("DTS Passthru");\r
465                     break;\r
466                 case "Vorbis (vorbis)":\r
467                     drp_audioMix.Items.Remove("AC3 Passthru");\r
468                     drp_audioMix.Items.Remove("DTS Passthru");\r
469                     break;\r
470                 case "AC3 Passthru":\r
471                     drp_audioMix.SelectedItem = "AC3 Passthru";\r
472                     break;\r
473                 case "DTS Passthru":\r
474                     drp_audioMix.SelectedItem = "DTS Passthru";\r
475                     break;\r
476             }\r
477         }\r
478     }\r
479 }