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.Windows.Forms;\r
9 \r
10 namespace Handbrake.Controls\r
11 {\r
12     public partial class AudioPanel : UserControl\r
13     {\r
14         public event EventHandler AudioListChanged;\r
15 \r
16         public AudioPanel()\r
17         {\r
18             InitializeComponent();\r
19             drp_audioMix.SelectedIndex = 0;\r
20         }\r
21         \r
22         // Audio Track Options\r
23         private void drp_audioTrack_SelectedIndexChanged(object sender, EventArgs e)\r
24         {\r
25             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
26             {\r
27                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audioTrack.Text;\r
28                 lv_audioList.Select();\r
29             }\r
30         }\r
31         private void drp_audenc_SelectedIndexChanged(object sender, EventArgs e)\r
32         {\r
33             // Setup the widgets with the correct avail options\r
34             if (drp_audioEncoder.Text.Contains("AAC"))\r
35             {\r
36                 setMixDown(true);\r
37                 setBitrate(160);\r
38             }\r
39             else\r
40             {\r
41                 setMixDown(false);\r
42                 setBitrate(320);\r
43             }\r
44 \r
45             // Configure the widgets with values\r
46             if (drp_audioEncoder.Text.Contains("AC3") || drp_audioEncoder.Text.Contains("DTS"))\r
47             {\r
48                 drp_audioMix.Enabled = false;\r
49                 drp_audioBitrate.Enabled = false;\r
50                 drp_audioSample.Enabled = false;\r
51 \r
52                 drp_audioMix.SelectedIndex = 0;\r
53                 drp_audioBitrate.SelectedIndex = 0;\r
54                 drp_audioSample.SelectedIndex = 0;\r
55             }\r
56             else\r
57             {\r
58                 drp_audioMix.Enabled = true;\r
59                 drp_audioBitrate.Enabled = true;\r
60                 drp_audioSample.Enabled = true;\r
61 \r
62                 drp_audioMix.SelectedIndex = 0;\r
63                 drp_audioBitrate.SelectedIndex = 9;\r
64                 drp_audioSample.SelectedIndex = 0;\r
65             }\r
66 \r
67             // Update an item in the Audio list if required.\r
68             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
69             {\r
70                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
71                 lv_audioList.Select();\r
72             }\r
73         }\r
74         private void drp_audmix_SelectedIndexChanged(object sender, EventArgs e)\r
75         {\r
76             if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text == "6 Channel Discrete"))\r
77                 setBitrate(384);\r
78             else if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text != "6 Channel Discrete"))\r
79                 setBitrate(160);\r
80 \r
81             // Update an item in the Audio list if required.\r
82             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
83             {\r
84                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
85                 lv_audioList.Select();\r
86             }\r
87         }\r
88         private void drp_audsr_SelectedIndexChanged(object sender, EventArgs e)\r
89         {\r
90             // Update an item in the Audio list if required.\r
91             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
92             {\r
93                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
94                 lv_audioList.Select();\r
95             }\r
96         }\r
97         private void drp_audbit_SelectedIndexChanged(object sender, EventArgs e)\r
98         {\r
99             // Update an item in the Audio list if required.\r
100             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
101             {\r
102                 if (drp_audioEncoder.Text.Contains("AC3"))\r
103                     drp_audioBitrate.SelectedItem = "Auto";\r
104                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
105                 lv_audioList.Select();\r
106             }\r
107         }\r
108         private void tb_drc_Scroll(object sender, EventArgs e)\r
109         {\r
110             double value;\r
111             if (tb_drc.Value == 0) value = 0;\r
112             else\r
113                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
114 \r
115             lbl_drc.Text = value.ToString();\r
116 \r
117             // Update an item in the Audio list if required.\r
118             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
119             {\r
120                 lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
121                 lv_audioList.Select();\r
122             }\r
123         }\r
124 \r
125         // Track Controls\r
126         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
127         {\r
128             double value = 0;\r
129             if (tb_drc.Value != 0)\r
130                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
131 \r
132             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
133             ListViewItem newTrack = new ListViewItem(getNewID().ToString());\r
134             newTrack.SubItems.Add(drp_audioTrack.Text);\r
135             newTrack.SubItems.Add(drp_audioEncoder.Text);\r
136             newTrack.SubItems.Add(drp_audioMix.Text);\r
137             newTrack.SubItems.Add(drp_audioSample.Text);\r
138             newTrack.SubItems.Add(drp_audioBitrate.Text);\r
139             newTrack.SubItems.Add(value.ToString());\r
140             lv_audioList.Items.Add(newTrack);\r
141 \r
142             // The Audio List has changed to raise the event.\r
143             if (this.AudioListChanged != null)\r
144                 this.AudioListChanged(this, new EventArgs());\r
145 \r
146             // Select the newly added track and select the control       \r
147             lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
148             lv_audioList.Select();\r
149         }\r
150         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
151         {\r
152             removeAudioTrack();\r
153         }\r
154 \r
155         // Audio List Menu\r
156         private void audioList_moveup_Click(object sender, EventArgs e)\r
157         {\r
158             if (lv_audioList.SelectedIndices.Count != 0)\r
159             {\r
160                 ListViewItem item = lv_audioList.SelectedItems[0];\r
161                 int index = item.Index;\r
162                 index--;\r
163 \r
164                 if (lv_audioList.Items.Count > index && index >= 0)\r
165                 {\r
166                     lv_audioList.Items.Remove(item);\r
167                     lv_audioList.Items.Insert(index, item);\r
168                     item.Selected = true;\r
169                     lv_audioList.Focus();\r
170                 }\r
171             }\r
172         }\r
173         private void audioList_movedown_Click(object sender, EventArgs e)\r
174         {\r
175             if (lv_audioList.SelectedIndices.Count != 0)\r
176             {\r
177                 ListViewItem item = lv_audioList.SelectedItems[0];\r
178                 int index = item.Index;\r
179                 index++;\r
180 \r
181                 if (index < lv_audioList.Items.Count)\r
182                 {\r
183                     lv_audioList.Items.Remove(item);\r
184                     lv_audioList.Items.Insert(index, item);\r
185                     item.Selected = true;\r
186                     lv_audioList.Focus();\r
187                 }\r
188             }\r
189         }\r
190         private void audioList_remove_Click(object sender, EventArgs e)\r
191         {\r
192             removeAudioTrack();\r
193         }\r
194         private void removeAudioTrack()\r
195         {\r
196             // Remove the Item and reselect the control if the following conditions are met.\r
197             if (lv_audioList.SelectedItems.Count != 0)\r
198             {\r
199                 // The Audio List is about to change so raise the event.\r
200                 if (this.AudioListChanged != null)\r
201                     this.AudioListChanged(this, new EventArgs());\r
202 \r
203                 // Record the current selected index.\r
204                 int currentPosition = lv_audioList.SelectedIndices[0];\r
205 \r
206                 lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
207 \r
208                 // Now reslect the correct item and give focus to the audio list.\r
209                 if (lv_audioList.Items.Count != 0)\r
210                 {\r
211                     if (currentPosition <= (lv_audioList.Items.Count - 1))\r
212                         lv_audioList.Items[currentPosition].Selected = true;\r
213                     else if (currentPosition > (lv_audioList.Items.Count - 1))\r
214                         lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
215 \r
216                     lv_audioList.Select();\r
217                 }\r
218                 // Regenerate the ID numers\r
219                 reGenerateListIDs();\r
220             }\r
221         }\r
222 \r
223         // Public Functions\r
224         public void setTrackList(Parsing.Title selectedTitle)\r
225         {\r
226             drp_audioTrack.Items.Clear();\r
227             drp_audioTrack.Items.Add("Automatic");\r
228             drp_audioTrack.Items.Add("None");\r
229             drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
230 \r
231             // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
232             if (Properties.Settings.Default.NativeLanguage == "Any")\r
233                 drp_audioTrack.SelectedIndex = 0;\r
234             else\r
235             {\r
236                 if (Properties.Settings.Default.DubAudio) // "Dub Foreign language audio" \r
237                 {\r
238                     int i = 0;\r
239                     foreach (object item in drp_audioTrack.Items)\r
240                     {\r
241                         if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
242                             drp_audioTrack.SelectedIndex = i;\r
243 \r
244                         i++;\r
245                     }\r
246 \r
247                     foreach (ListViewItem item in lv_audioList.Items)\r
248                         item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();     \r
249                 }\r
250                 else\r
251                     drp_audioTrack.SelectedIndex = 0; // "Use Foreign language audio and Subtitles"\r
252             }\r
253             drp_audioMix.SelectedIndex = 0;\r
254         }\r
255         public ListView getAudioPanel()\r
256         {\r
257             return lv_audioList;\r
258         }\r
259         public void setAudioByContainer(String path)\r
260         {\r
261             if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
262             {\r
263                 string oldval = drp_audioEncoder.Text;\r
264                 drp_audioEncoder.Items.Clear();\r
265                 drp_audioEncoder.Items.Add("AAC (faac)");\r
266                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
267                 if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
268                     drp_audioEncoder.SelectedIndex = 0;\r
269 \r
270             }\r
271             else if (path.Contains("MKV"))\r
272             {\r
273                 drp_audioEncoder.Items.Clear();\r
274                 drp_audioEncoder.Items.Add("AAC (faac)");\r
275                 drp_audioEncoder.Items.Add("MP3 (lame)");\r
276                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
277                 drp_audioEncoder.Items.Add("DTS Passthru");\r
278                 drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
279 \r
280                 if (drp_audioEncoder.Text == string.Empty)\r
281                     drp_audioEncoder.SelectedIndex = 0;\r
282             }\r
283 \r
284             // Make sure the table is updated with new audio codecs\r
285             foreach (ListViewItem row in lv_audioList.Items)\r
286             {\r
287                 if (!drp_audioEncoder.Items.Contains(row.SubItems[2].Text))\r
288                     row.SubItems[2].Text = drp_audioEncoder.Items[0].ToString();\r
289             }\r
290         }\r
291         public 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         public 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         public int getNewID()\r
304         {\r
305             return lv_audioList.Items.Count + 1;\r
306         }\r
307 \r
308         // Helper Functions \r
309         private void reGenerateListIDs()\r
310         {\r
311             int i = 1;\r
312             foreach (ListViewItem item in lv_audioList.Items)\r
313             {\r
314                 item.SubItems[0].Text = i.ToString();\r
315                 i++;\r
316             }\r
317         }\r
318         private void setBitrate(int max)\r
319         {\r
320             if (max > 160)\r
321             {\r
322                 drp_audioBitrate.Items.Add("192");\r
323                 drp_audioBitrate.Items.Add("224");\r
324                 drp_audioBitrate.Items.Add("256");\r
325                 drp_audioBitrate.Items.Add("320");\r
326                 if (max == 384)\r
327                     drp_audioBitrate.Items.Add("384");\r
328                 else\r
329                     drp_audioBitrate.Items.Remove("384");\r
330             } \r
331             else\r
332             {\r
333                 drp_audioBitrate.Items.Remove("192");\r
334                 drp_audioBitrate.Items.Remove("224");\r
335                 drp_audioBitrate.Items.Remove("256");\r
336                 drp_audioBitrate.Items.Remove("320");\r
337                 drp_audioBitrate.Items.Remove("384");\r
338             }\r
339             if (drp_audioBitrate.SelectedItem == null)\r
340                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
341         }\r
342         private void setMixDown(Boolean aac)\r
343         {\r
344             drp_audioMix.Items.Clear();\r
345             drp_audioMix.Items.Add("Automatic");\r
346             if (aac)\r
347                 drp_audioMix.Items.Add("Mono");\r
348             drp_audioMix.Items.Add("Stereo");\r
349             drp_audioMix.Items.Add("Dolby Surround");\r
350             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
351             if (aac)\r
352                 drp_audioMix.Items.Add("6 Channel Discrete");\r
353         }\r
354         private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
355         {\r
356             // Set the dropdown controls based on the selected item in the Audio List.\r
357             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
358             {\r
359                 drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
360                 drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
361                 drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
362                 drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
363                 drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
364                 double drcValue; int drcCalculated;\r
365                 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
366                 if (drcValue == 0) drcCalculated = 0;\r
367                 else\r
368                     drcValue = ((drcValue * 10) + 1) - 10;\r
369                 int.TryParse(drcValue.ToString(), out drcCalculated);\r
370                 tb_drc.Value = drcCalculated;\r
371                 lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
372 \r
373                 AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
374             }\r
375             else\r
376                 AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
377         }\r
378 \r
379     }\r
380 }