OSDN Git Service

WinGui:
[handbrake-jp/handbrake-jp-git.git] / win / C# / Controls / AudioPanel.cs
1 /*  AudioPanel.cs $\r
2         \r
3            This file is part of the HandBrake source code.\r
4            Homepage: <http://handbrake.fr>.\r
5            It may be used under the terms of the GNU General Public License. */\r
6 \r
7 using System;\r
8 using System.Collections;\r
9 using System.Linq;\r
10 using System.Windows.Forms;\r
11 using Handbrake.Model;\r
12 \r
13 namespace Handbrake.Controls\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         /// Create a new instance of the Audio Panel\r
24         /// </summary>\r
25         public AudioPanel()\r
26         {\r
27             InitializeComponent();\r
28             drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
29             drp_audioSample.SelectedIndex = 1;\r
30         }\r
31 \r
32         /// <summary>\r
33         /// Get the audio panel\r
34         /// </summary>\r
35         /// <returns>A listview containing the audio tracks</returns>\r
36         public ListView GetAudioPanel()\r
37         {\r
38             return lv_audioList;\r
39         }\r
40 \r
41         /// <summary>\r
42         /// Set the File Container. This funciton is used to limit the available options for each file container.\r
43         /// </summary>\r
44         /// <param name="path"></param>\r
45         public void SetContainer(String path)\r
46         {\r
47             string oldval = drp_audioEncoder.Text;\r
48             if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
49             {\r
50                 drp_audioEncoder.Items.Clear();\r
51                 drp_audioEncoder.Items.Add("AAC (faac)");\r
52                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
53                 if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
54                     drp_audioEncoder.SelectedIndex = 0;\r
55                 else\r
56                     drp_audioEncoder.SelectedItem = oldval;\r
57 \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 Boolean 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(Parsing.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; // "Use Foreign language audio and Subtitles"\r
158             }\r
159             drp_audioMix.SelectedIndex = 0;\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 = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;\r
181                         lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;\r
182                     }\r
183                     else\r
184                     {\r
185                         drp_audioMix.Enabled = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;\r
186                         lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;\r
187                     }\r
188 \r
189                     // Update an item in the Audio list if required.\r
190                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
191                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
192                     break;\r
193                 case "drp_audioMix":\r
194                     SetBitrate();\r
195 \r
196                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
197                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
198                     break;\r
199                 case "drp_audioSample":\r
200                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
201                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
202                     break;\r
203                 case "drp_audioBitrate":\r
204                     // Update an item in the Audio list if required.\r
205                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
206                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
207                     break;\r
208                 case "tb_drc":\r
209                     double value;\r
210                     if (tb_drc.Value == 0) value = 0;\r
211                     else\r
212                         value = ((tb_drc.Value - 1) / 10.0) + 1;\r
213 \r
214                     lbl_drc.Text = value.ToString();\r
215 \r
216                     // Update an item in the Audio list if required.\r
217                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
218                     {\r
219                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
220                         lv_audioList.Select();\r
221                     }\r
222                     break;\r
223             }\r
224 \r
225             lv_audioList.Select();\r
226         }\r
227         private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
228         {\r
229             // Set the dropdown controls based on the selected item in the Audio List.\r
230             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
231             {\r
232                 drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
233                 drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
234                 drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
235                 drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
236                 drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
237                 double drcValue; int drcCalculated;\r
238                 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
239                 if (drcValue != 0)\r
240                     drcValue = ((drcValue * 10) + 1) - 10;\r
241                 int.TryParse(drcValue.ToString(), out drcCalculated);\r
242                 tb_drc.Value = drcCalculated;\r
243                 lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
244 \r
245                 AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
246             }\r
247             else\r
248                 AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
249         }\r
250 \r
251         // Track Controls\r
252         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
253         {\r
254             double value = 0;\r
255             if (tb_drc.Value != 0)\r
256                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
257 \r
258             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
259             ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
260             newTrack.SubItems.Add(drp_audioTrack.Text);\r
261             newTrack.SubItems.Add(drp_audioEncoder.Text);\r
262             newTrack.SubItems.Add(drp_audioMix.Text);\r
263             newTrack.SubItems.Add(drp_audioSample.Text);\r
264             newTrack.SubItems.Add(drp_audioBitrate.Text);\r
265             newTrack.SubItems.Add(value.ToString());\r
266             lv_audioList.Items.Add(newTrack);\r
267 \r
268             // The Audio List has changed to raise the event.\r
269             if (this.AudioListChanged != null)\r
270                 this.AudioListChanged(this, new EventArgs());\r
271 \r
272             // Select the newly added track and select the control       \r
273             lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
274             lv_audioList.Select();\r
275         }\r
276         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
277         {\r
278             RemoveTrack();\r
279         }\r
280 \r
281         // Audio List Menu\r
282         private void audioList_moveup_Click(object sender, EventArgs e)\r
283         {\r
284             MoveTrack(true);\r
285         }\r
286         private void audioList_movedown_Click(object sender, EventArgs e)\r
287         {\r
288             MoveTrack(false);\r
289         }\r
290         private void audioList_remove_Click(object sender, EventArgs e)\r
291         {\r
292             RemoveTrack();\r
293         }\r
294 \r
295         // Public Functions\r
296         private void AddTrackForPreset(ListViewItem item)\r
297         {\r
298             lv_audioList.Items.Add(item);\r
299             if (this.AudioListChanged != null)\r
300                 this.AudioListChanged(this, new EventArgs());\r
301         }\r
302         private void ClearAudioList()\r
303         {\r
304             lv_audioList.Items.Clear();\r
305             if (this.AudioListChanged != null)\r
306                 this.AudioListChanged(this, new EventArgs());\r
307         }\r
308         private int GetNewID()\r
309         {\r
310             return lv_audioList.Items.Count + 1;\r
311         }\r
312         private void RemoveTrack()\r
313         {\r
314             // Remove the Item and reselect the control if the following conditions are met.\r
315             if (lv_audioList.SelectedItems.Count != 0)\r
316             {\r
317                 // The Audio List is about to change so raise the event.\r
318                 if (this.AudioListChanged != null)\r
319                     this.AudioListChanged(this, new EventArgs());\r
320 \r
321                 // Record the current selected index.\r
322                 int currentPosition = lv_audioList.SelectedIndices[0];\r
323 \r
324                 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
325 \r
326                 // Now reslect the correct item and give focus to the audio list.\r
327                 if (lv_audioList.Items.Count != 0)\r
328                 {\r
329                     if (currentPosition <= (lv_audioList.Items.Count - 1))\r
330                         lv_audioList.Items[currentPosition].Selected = true;\r
331                     else if (currentPosition > (lv_audioList.Items.Count - 1))\r
332                         lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
333 \r
334                     lv_audioList.Select();\r
335                 }\r
336                 // Regenerate the ID numers\r
337                 ReGenerateListIDs();\r
338             }\r
339         }\r
340         private void MoveTrack(bool up)\r
341         {\r
342             if (lv_audioList.SelectedIndices.Count == 0) return;\r
343 \r
344             ListViewItem item = lv_audioList.SelectedItems[0];\r
345             int index = item.Index;\r
346 \r
347             if (up) index--; else index++;\r
348 \r
349             if (index < lv_audioList.Items.Count || (lv_audioList.Items.Count > index && index >= 0))\r
350             {\r
351                 lv_audioList.Items.Remove(item);\r
352                 lv_audioList.Items.Insert(index, item);\r
353                 item.Selected = true;\r
354                 lv_audioList.Focus();\r
355             }\r
356         }\r
357         private void ReGenerateListIDs()\r
358         {\r
359             int i = 1;\r
360             foreach (ListViewItem item in lv_audioList.Items)\r
361             {\r
362                 item.SubItems[0].Text = i.ToString();\r
363                 i++;\r
364             }\r
365         }\r
366         private void SetBitrate()\r
367         {\r
368             int max = 0;\r
369             drp_audioBitrate.Items.Remove("Auto");\r
370             drp_audioBitrate.Items.Remove("192");\r
371             drp_audioBitrate.Items.Remove("224");\r
372             drp_audioBitrate.Items.Remove("256");\r
373             drp_audioBitrate.Items.Remove("320");\r
374 \r
375             switch (drp_audioEncoder.Text)\r
376             {\r
377                 case "AAC (faac)":\r
378                     max = drp_audioMix.Text.Contains("6 Channel") ? 384 : 160;\r
379                     break;\r
380                 case "MP3 (lame)":\r
381                     max = 320;\r
382                     break;\r
383                 case "Vorbis (vorbis)":\r
384                     max = 384;\r
385                     break;\r
386                 case "AC3 Passthru":\r
387                     drp_audioBitrate.Items.Add("Auto");\r
388                     drp_audioBitrate.SelectedItem = "Auto";\r
389                     drp_audioSample.SelectedItem = "Auto";\r
390                     break;\r
391                 case "DTS Passthru":\r
392                     drp_audioBitrate.Items.Add("Auto");\r
393                     drp_audioBitrate.SelectedItem = "Auto";\r
394                     drp_audioSample.SelectedItem = "Auto";\r
395                     break;\r
396             }\r
397 \r
398             if (max > 160)\r
399             {\r
400                 drp_audioBitrate.Items.Add("192");\r
401                 drp_audioBitrate.Items.Add("224");\r
402                 drp_audioBitrate.Items.Add("256");\r
403                 drp_audioBitrate.Items.Add("320");\r
404                 if (max == 384)\r
405                     drp_audioBitrate.Items.Add("384");\r
406                 else\r
407                     drp_audioBitrate.Items.Remove("384");\r
408             }\r
409             else\r
410             {\r
411                 drp_audioBitrate.Items.Remove("192");\r
412                 drp_audioBitrate.Items.Remove("224");\r
413                 drp_audioBitrate.Items.Remove("256");\r
414                 drp_audioBitrate.Items.Remove("320");\r
415                 drp_audioBitrate.Items.Remove("384");\r
416             }\r
417 \r
418             if (drp_audioBitrate.SelectedItem == null)\r
419                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
420         }\r
421         private void SetMixDown()\r
422         {\r
423             drp_audioMix.Items.Clear();\r
424             drp_audioMix.Items.Add("Mono");\r
425             drp_audioMix.Items.Add("Stereo");\r
426             drp_audioMix.Items.Add("Dolby Surround");\r
427             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
428             drp_audioMix.Items.Add("6 Channel Discrete");\r
429             drp_audioMix.Items.Add("AC3 Passthru");\r
430             drp_audioMix.Items.Add("DTS Passthru");\r
431 \r
432             drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
433 \r
434             switch (drp_audioEncoder.Text)\r
435             {\r
436                 case "AAC (faac)":\r
437                     drp_audioMix.Items.Remove("AC3 Passthru");\r
438                     drp_audioMix.Items.Remove("DTS Passthru");\r
439                     break;\r
440                 case "MP3 (lame)":\r
441                     drp_audioMix.Items.Remove("Mono");\r
442                     drp_audioMix.Items.Remove("6 Channel Discrete");\r
443                     drp_audioMix.Items.Remove("AC3 Passthru");\r
444                     drp_audioMix.Items.Remove("DTS Passthru");\r
445                     break;\r
446                 case "Vorbis (vorbis)":\r
447                     drp_audioMix.Items.Remove("AC3 Passthru");\r
448                     drp_audioMix.Items.Remove("DTS Passthru");\r
449                     break;\r
450                 case "AC3 Passthru":\r
451                     drp_audioMix.SelectedItem = "AC3 Passthru";\r
452                     break;\r
453                 case "DTS Passthru":\r
454                     drp_audioMix.SelectedItem = "DTS Passthru";\r
455                     break;\r
456             }\r
457         }\r
458     }\r
459 }