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         // Control and ListView\r
116         private void controlChanged(object sender, EventArgs e)\r
117         {\r
118             Control ctl = (Control)sender;\r
119 \r
120             switch (ctl.Name)\r
121             {\r
122                 case "drp_audioTrack":\r
123                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
124                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audioTrack.Text;\r
125                     break;\r
126                 case "drp_audioEncoder":\r
127                     SetMixDown();\r
128                     SetBitrate();\r
129 \r
130                     // Configure the widgets with values\r
131                     if (drp_audioEncoder.Text.Contains("AC3") || drp_audioEncoder.Text.Contains("DTS"))\r
132                     {\r
133                         drp_audioMix.Enabled = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;\r
134                         lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;\r
135                     }\r
136                     else\r
137                     {\r
138                         drp_audioMix.Enabled = drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;\r
139                         lbl_bitrate.Enabled = lbl_drc.Enabled = lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;\r
140                     }\r
141 \r
142                     // Update an item in the Audio list if required.\r
143                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
144                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
145                     break;\r
146                 case "drp_audioMix":\r
147                     SetBitrate();\r
148 \r
149                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
150                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
151                     break;\r
152                 case "drp_audioSample":\r
153                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
154                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
155                     break;\r
156                 case "drp_audioBitrate":\r
157                     // Update an item in the Audio list if required.\r
158                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
159                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
160                     break;\r
161                 case "tb_drc":\r
162                     double value;\r
163                     if (tb_drc.Value == 0) value = 0;\r
164                     else\r
165                         value = ((tb_drc.Value - 1) / 10.0) + 1;\r
166 \r
167                     lbl_drc.Text = value.ToString();\r
168 \r
169                     // Update an item in the Audio list if required.\r
170                     if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
171                     {\r
172                         lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
173                         lv_audioList.Select();\r
174                     }\r
175                     break;\r
176             }\r
177 \r
178             lv_audioList.Select();\r
179         }\r
180         private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
181         {\r
182             // Set the dropdown controls based on the selected item in the Audio List.\r
183             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
184             {\r
185                 drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
186                 drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
187                 drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
188                 drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
189                 drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
190                 double drcValue; int drcCalculated;\r
191                 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
192                 if (drcValue != 0)\r
193                     drcValue = ((drcValue * 10) + 1) - 10;\r
194                 int.TryParse(drcValue.ToString(), out drcCalculated);\r
195                 tb_drc.Value = drcCalculated;\r
196                 lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
197 \r
198                 AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
199             }\r
200             else\r
201                 AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
202         }\r
203 \r
204         // Track Controls\r
205         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
206         {\r
207             double value = 0;\r
208             if (tb_drc.Value != 0)\r
209                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
210 \r
211             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
212             ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
213             newTrack.SubItems.Add(drp_audioTrack.Text);\r
214             newTrack.SubItems.Add(drp_audioEncoder.Text);\r
215             newTrack.SubItems.Add(drp_audioMix.Text);\r
216             newTrack.SubItems.Add(drp_audioSample.Text);\r
217             newTrack.SubItems.Add(drp_audioBitrate.Text);\r
218             newTrack.SubItems.Add(value.ToString());\r
219             lv_audioList.Items.Add(newTrack);\r
220 \r
221             // The Audio List has changed to raise the event.\r
222             if (this.AudioListChanged != null)\r
223                 this.AudioListChanged(this, new EventArgs());\r
224 \r
225             // Select the newly added track and select the control       \r
226             lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
227             lv_audioList.Select();\r
228         }\r
229         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
230         {\r
231             RemoveTrack();\r
232         }\r
233 \r
234         // Audio List Menu\r
235         private void audioList_moveup_Click(object sender, EventArgs e)\r
236         {\r
237             MoveTrack(true);\r
238         }\r
239         private void audioList_movedown_Click(object sender, EventArgs e)\r
240         {\r
241             MoveTrack(false);\r
242         }\r
243         private void audioList_remove_Click(object sender, EventArgs e)\r
244         {\r
245             RemoveTrack();\r
246         }\r
247 \r
248         // Public Functions\r
249         public void SetTrackList(Parsing.Title selectedTitle)\r
250         {\r
251             drp_audioTrack.Items.Clear();\r
252             drp_audioTrack.Items.Add("Automatic");\r
253             drp_audioTrack.Items.Add("None");\r
254             drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
255 \r
256             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
257             if (Properties.Settings.Default.NativeLanguage == "Any")\r
258                 drp_audioTrack.SelectedIndex = drp_audioTrack.Items.Count >= 3 ? 2 : 0;\r
259             else\r
260             {\r
261                 if (Properties.Settings.Default.DubAudio) // "Dub Foreign language audio" \r
262                 {\r
263                     int i = 0;\r
264                     foreach (object item in drp_audioTrack.Items)\r
265                     {\r
266                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
267                         {\r
268                             drp_audioTrack.SelectedIndex = i;\r
269                             break;\r
270                         }\r
271 \r
272                         i++;\r
273                     }\r
274 \r
275                     if (drp_audioTrack.SelectedItem != null)\r
276                         foreach (ListViewItem item in lv_audioList.Items)\r
277                             item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
278                     else\r
279                     {\r
280                         drp_audioTrack.SelectedIndex = 0;\r
281                         if (drp_audioTrack.SelectedItem != null)\r
282                             foreach (ListViewItem item in lv_audioList.Items)\r
283                                 item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
284                     }\r
285                 }\r
286                 else\r
287                     drp_audioTrack.SelectedIndex = drp_audioTrack.Items.Count >= 3 ? 2 : 0; // "Use Foreign language audio and Subtitles"\r
288             }\r
289             drp_audioMix.SelectedIndex = 0;\r
290         }\r
291         private void AddTrackForPreset(ListViewItem item)\r
292         {\r
293             lv_audioList.Items.Add(item);\r
294             if (this.AudioListChanged != null)\r
295                 this.AudioListChanged(this, new EventArgs());\r
296         }\r
297         private void ClearAudioList()\r
298         {\r
299             lv_audioList.Items.Clear();\r
300             if (this.AudioListChanged != null)\r
301                 this.AudioListChanged(this, new EventArgs());\r
302         }\r
303         private int GetNewID()\r
304         {\r
305             return lv_audioList.Items.Count + 1;\r
306         }\r
307         private void RemoveTrack()\r
308         {\r
309             // Remove the Item and reselect the control if the following conditions are met.\r
310             if (lv_audioList.SelectedItems.Count != 0)\r
311             {\r
312                 // The Audio List is about to change so raise the event.\r
313                 if (this.AudioListChanged != null)\r
314                     this.AudioListChanged(this, new EventArgs());\r
315 \r
316                 // Record the current selected index.\r
317                 int currentPosition = lv_audioList.SelectedIndices[0];\r
318 \r
319                 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
320 \r
321                 // Now reslect the correct item and give focus to the audio list.\r
322                 if (lv_audioList.Items.Count != 0)\r
323                 {\r
324                     if (currentPosition <= (lv_audioList.Items.Count - 1))\r
325                         lv_audioList.Items[currentPosition].Selected = true;\r
326                     else if (currentPosition > (lv_audioList.Items.Count - 1))\r
327                         lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
328 \r
329                     lv_audioList.Select();\r
330                 }\r
331                 // Regenerate the ID numers\r
332                 ReGenerateListIDs();\r
333             }\r
334         }\r
335         private void MoveTrack(bool up)\r
336         {\r
337             if (lv_audioList.SelectedIndices.Count == 0) return;\r
338 \r
339             ListViewItem item = lv_audioList.SelectedItems[0];\r
340             int index = item.Index;\r
341 \r
342             if (up) index--; else index++;\r
343 \r
344             if (index < lv_audioList.Items.Count || (lv_audioList.Items.Count > index && index >= 0))\r
345             {\r
346                 lv_audioList.Items.Remove(item);\r
347                 lv_audioList.Items.Insert(index, item);\r
348                 item.Selected = true;\r
349                 lv_audioList.Focus();\r
350             }\r
351         }\r
352         private void ReGenerateListIDs()\r
353         {\r
354             int i = 1;\r
355             foreach (ListViewItem item in lv_audioList.Items)\r
356             {\r
357                 item.SubItems[0].Text = i.ToString();\r
358                 i++;\r
359             }\r
360         }\r
361         private void SetBitrate()\r
362         {\r
363             int max = 0;\r
364             drp_audioBitrate.Items.Remove("Auto");\r
365             drp_audioBitrate.Items.Remove("192");\r
366             drp_audioBitrate.Items.Remove("224");\r
367             drp_audioBitrate.Items.Remove("256");\r
368             drp_audioBitrate.Items.Remove("320");\r
369 \r
370             switch (drp_audioEncoder.Text)\r
371             {\r
372                 case "AAC (faac)":\r
373                     max = drp_audioMix.Text.Contains("6 Channel") ? 384 : 160;\r
374                     break;\r
375                 case "MP3 (lame)":\r
376                     max = 320;\r
377                     break;\r
378                 case "Vorbis (vorbis)":\r
379                     max = 384;\r
380                     break;\r
381                 case "AC3 Passthru":\r
382                     drp_audioBitrate.Items.Add("Auto");\r
383                     drp_audioBitrate.SelectedItem = "Auto";\r
384                     drp_audioSample.SelectedItem = "Auto";\r
385                     break;\r
386                 case "DTS 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             }\r
392 \r
393             if (max > 160)\r
394             {\r
395                 drp_audioBitrate.Items.Add("192");\r
396                 drp_audioBitrate.Items.Add("224");\r
397                 drp_audioBitrate.Items.Add("256");\r
398                 drp_audioBitrate.Items.Add("320");\r
399                 if (max == 384)\r
400                     drp_audioBitrate.Items.Add("384");\r
401                 else\r
402                     drp_audioBitrate.Items.Remove("384");\r
403             }\r
404             else\r
405             {\r
406                 drp_audioBitrate.Items.Remove("192");\r
407                 drp_audioBitrate.Items.Remove("224");\r
408                 drp_audioBitrate.Items.Remove("256");\r
409                 drp_audioBitrate.Items.Remove("320");\r
410                 drp_audioBitrate.Items.Remove("384");\r
411             }\r
412 \r
413             if (drp_audioBitrate.SelectedItem == null)\r
414                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
415         }\r
416         private void SetMixDown()\r
417         {\r
418             drp_audioMix.Items.Clear();\r
419             drp_audioMix.Items.Add("Mono");\r
420             drp_audioMix.Items.Add("Stereo");\r
421             drp_audioMix.Items.Add("Dolby Surround");\r
422             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
423             drp_audioMix.Items.Add("6 Channel Discrete");\r
424             drp_audioMix.Items.Add("AC3 Passthru");\r
425             drp_audioMix.Items.Add("DTS Passthru");\r
426 \r
427             drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
428 \r
429             switch (drp_audioEncoder.Text)\r
430             {\r
431                 case "AAC (faac)":\r
432                     drp_audioMix.Items.Remove("AC3 Passthru");\r
433                     drp_audioMix.Items.Remove("DTS Passthru");\r
434                     break;\r
435                 case "MP3 (lame)":\r
436                     drp_audioMix.Items.Remove("Mono");\r
437                     drp_audioMix.Items.Remove("6 Channel Discrete");\r
438                     drp_audioMix.Items.Remove("AC3 Passthru");\r
439                     drp_audioMix.Items.Remove("DTS Passthru");\r
440                     break;\r
441                 case "Vorbis (vorbis)":\r
442                     drp_audioMix.Items.Remove("AC3 Passthru");\r
443                     drp_audioMix.Items.Remove("DTS Passthru");\r
444                     break;\r
445                 case "AC3 Passthru":\r
446                     drp_audioMix.SelectedItem = "AC3 Passthru";\r
447                     break;\r
448                 case "DTS Passthru":\r
449                     drp_audioMix.SelectedItem = "DTS Passthru";\r
450                     break;\r
451             }\r
452         }\r
453     }\r
454 }