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                     if (drp_audioTrack.SelectedItem != null)\r
248                         foreach (ListViewItem item in lv_audioList.Items)\r
249                             item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
250                     else\r
251                     {\r
252                         drp_audioTrack.SelectedIndex = 0;\r
253                         if (drp_audioTrack.SelectedItem != null)\r
254                             foreach (ListViewItem item in lv_audioList.Items)\r
255                                 item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
256                     }\r
257                 }\r
258                 else\r
259                     drp_audioTrack.SelectedIndex = 0; // "Use Foreign language audio and Subtitles"\r
260             }\r
261             drp_audioMix.SelectedIndex = 0;\r
262         }\r
263         public ListView getAudioPanel()\r
264         {\r
265             return lv_audioList;\r
266         }\r
267         public void setAudioByContainer(String path)\r
268         {\r
269             if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
270             {\r
271                 string oldval = drp_audioEncoder.Text;\r
272                 drp_audioEncoder.Items.Clear();\r
273                 drp_audioEncoder.Items.Add("AAC (faac)");\r
274                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
275                 if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
276                     drp_audioEncoder.SelectedIndex = 0;\r
277 \r
278             }\r
279             else if (path.Contains("MKV"))\r
280             {\r
281                 drp_audioEncoder.Items.Clear();\r
282                 drp_audioEncoder.Items.Add("AAC (faac)");\r
283                 drp_audioEncoder.Items.Add("MP3 (lame)");\r
284                 drp_audioEncoder.Items.Add("AC3 Passthru");\r
285                 drp_audioEncoder.Items.Add("DTS Passthru");\r
286                 drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
287 \r
288                 if (drp_audioEncoder.Text == string.Empty)\r
289                     drp_audioEncoder.SelectedIndex = 0;\r
290             }\r
291 \r
292             // Make sure the table is updated with new audio codecs\r
293             foreach (ListViewItem row in lv_audioList.Items)\r
294             {\r
295                 if (!drp_audioEncoder.Items.Contains(row.SubItems[2].Text))\r
296                     row.SubItems[2].Text = drp_audioEncoder.Items[0].ToString();\r
297             }\r
298         }\r
299         public void addTrackForPreset(ListViewItem item)\r
300         {\r
301             lv_audioList.Items.Add(item);\r
302             if (this.AudioListChanged != null)\r
303                 this.AudioListChanged(this, new EventArgs());\r
304         }\r
305         public void clearAudioList()\r
306         {\r
307             lv_audioList.Items.Clear();\r
308             if (this.AudioListChanged != null)\r
309                 this.AudioListChanged(this, new EventArgs());\r
310         }\r
311         public int getNewID()\r
312         {\r
313             return lv_audioList.Items.Count + 1;\r
314         }\r
315 \r
316         // Helper Functions \r
317         private void reGenerateListIDs()\r
318         {\r
319             int i = 1;\r
320             foreach (ListViewItem item in lv_audioList.Items)\r
321             {\r
322                 item.SubItems[0].Text = i.ToString();\r
323                 i++;\r
324             }\r
325         }\r
326         private void setBitrate(int max)\r
327         {\r
328             if (max > 160)\r
329             {\r
330                 drp_audioBitrate.Items.Add("192");\r
331                 drp_audioBitrate.Items.Add("224");\r
332                 drp_audioBitrate.Items.Add("256");\r
333                 drp_audioBitrate.Items.Add("320");\r
334                 if (max == 384)\r
335                     drp_audioBitrate.Items.Add("384");\r
336                 else\r
337                     drp_audioBitrate.Items.Remove("384");\r
338             } \r
339             else\r
340             {\r
341                 drp_audioBitrate.Items.Remove("192");\r
342                 drp_audioBitrate.Items.Remove("224");\r
343                 drp_audioBitrate.Items.Remove("256");\r
344                 drp_audioBitrate.Items.Remove("320");\r
345                 drp_audioBitrate.Items.Remove("384");\r
346             }\r
347             if (drp_audioBitrate.SelectedItem == null)\r
348                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
349         }\r
350         private void setMixDown(Boolean aac)\r
351         {\r
352             drp_audioMix.Items.Clear();\r
353             drp_audioMix.Items.Add("Automatic");\r
354             if (aac)\r
355                 drp_audioMix.Items.Add("Mono");\r
356             drp_audioMix.Items.Add("Stereo");\r
357             drp_audioMix.Items.Add("Dolby Surround");\r
358             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
359             if (aac)\r
360                 drp_audioMix.Items.Add("6 Channel Discrete");\r
361         }\r
362         private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
363         {\r
364             // Set the dropdown controls based on the selected item in the Audio List.\r
365             if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
366             {\r
367                 drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
368                 drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
369                 drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
370                 drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
371                 drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
372                 double drcValue; int drcCalculated;\r
373                 double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
374                 if (drcValue == 0) drcCalculated = 0;\r
375                 else\r
376                     drcValue = ((drcValue * 10) + 1) - 10;\r
377                 int.TryParse(drcValue.ToString(), out drcCalculated);\r
378                 tb_drc.Value = drcCalculated;\r
379                 lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
380 \r
381                 AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
382             }\r
383             else\r
384                 AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
385         }\r
386 \r
387     }\r
388 }