OSDN Git Service

import original 0.9.5 release
[handbrake-jp/handbrake-jp.git] / win / C# / Controls / AudioPanel.cs
index b394e3c..e5f37d6 100644 (file)
 /*  AudioPanel.cs $\r
-       \r
-          This file is part of the HandBrake source code.\r
-          Homepage: <http://handbrake.fr>.\r
-          It may be used under the terms of the GNU General Public License. */\r
-\r
-using System;\r
-using System.Windows.Forms;\r
+    This file is part of the HandBrake source code.\r
+    Homepage: <http://handbrake.fr>.\r
+    It may be used under the terms of the GNU General Public License. */\r
 \r
 namespace Handbrake.Controls\r
 {\r
+    using System;\r
+    using System.Collections;\r
+    using System.Linq;\r
+    using System.Windows.Forms;\r
+    using Functions;\r
+\r
+    using HandBrake.ApplicationServices.Parsing;\r
+\r
+    using Presets;\r
+    using AudioTrack = Model.AudioTrack;\r
+\r
+    /// <summary>\r
+    /// The AudioPanel Control\r
+    /// </summary>\r
     public partial class AudioPanel : UserControl\r
     {\r
-        public event EventHandler AudioListChanged;\r
 \r
+        private const string AC3Passthru = "AC3 Passthru";\r
+\r
+        private const string DTSPassthru = "DTS Passthru";\r
+\r
+        /// <summary>\r
+        /// Initializes a new instance of the <see cref="AudioPanel"/> class. \r
+        /// Create a new instance of the Audio Panel\r
+        /// </summary>\r
         public AudioPanel()\r
         {\r
             InitializeComponent();\r
-            drp_audioMix.SelectedIndex = 0;\r
+            drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
+            drp_audioSample.SelectedIndex = 1;\r
         }\r
 \r
-        // Audio Track Options\r
-        private void drp_audioTrack_SelectedIndexChanged(object sender, EventArgs e)\r
+        /// <summary>\r
+        /// The audio list has changed\r
+        /// </summary>\r
+        public event EventHandler AudioListChanged;\r
+\r
+        /// <summary>\r
+        /// Get the audio panel\r
+        /// </summary>\r
+        /// <returns>A listview containing the audio tracks</returns>\r
+        public DataGridView GetAudioPanel()\r
         {\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text = drp_audioTrack.Text;\r
-                lv_audioList.Select();\r
-            }\r
+            return audioList;\r
         }\r
-        private void drp_audenc_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Set the File Container. This funciton is used to limit the available options for each file container.\r
+        /// </summary>\r
+        /// <param name="path">\r
+        /// the file path\r
+        /// </param>\r
+        public void SetContainer(string path)\r
         {\r
-            // Setup the widgets with the correct avail options\r
-            if (drp_audioEncoder.Text.Contains("AAC"))\r
+            string oldval = drp_audioEncoder.Text;\r
+\r
+            drp_audioEncoder.Items.Clear();\r
+            drp_audioEncoder.Items.Add("AAC (faac)");\r
+            drp_audioEncoder.Items.Add("MP3 (lame)");\r
+            drp_audioEncoder.Items.Add(AC3Passthru);\r
+            drp_audioEncoder.Items.Add("AC3 (ffmpeg)");\r
+\r
+            if (path.Contains("MKV"))\r
             {\r
-                setMixDown(true);\r
-                setBitrate(160);\r
+                drp_audioEncoder.Items.Add(DTSPassthru);\r
+                drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
             }\r
+\r
+            if (!drp_audioEncoder.Text.Contains(oldval))\r
+                drp_audioEncoder.SelectedIndex = 0;\r
             else\r
+                drp_audioEncoder.SelectedItem = oldval;\r
+\r
+            // Make sure the table is updated with new audio codecs\r
+            // Defaults to AAC encoding.\r
+            foreach (DataGridViewRow row in audioList.Rows)\r
             {\r
-                setMixDown(false);\r
-                setBitrate(320);\r
+                if (!drp_audioEncoder.Items.Contains(row.Cells[2].Value))\r
+                    row.Cells[2].Value = drp_audioEncoder.Items[0].ToString();\r
             }\r
+        }\r
 \r
-            // Configure the widgets with values\r
-            if (drp_audioEncoder.Text.Contains("AC3") || drp_audioEncoder.Text.Contains("DTS"))\r
-            {\r
-                drp_audioMix.Enabled = false;\r
-                drp_audioBitrate.Enabled = false;\r
-                drp_audioSample.Enabled = false;\r
+        /// <summary>\r
+        /// Checks if the settings used required the .m4v (rather than .mp4) extension\r
+        /// </summary>\r
+        /// <returns>True if m4v is required</returns>\r
+        public bool RequiresM4V()\r
+        {\r
+            return this.audioList.Rows.Cast<DataGridViewRow>().Any(row => row.Cells[2].Value.ToString().Contains("AC3"));\r
+        }\r
 \r
-                drp_audioMix.SelectedIndex = 0;\r
-                drp_audioBitrate.SelectedIndex = 0;\r
-                drp_audioSample.SelectedIndex = 0;\r
-            }\r
-            else\r
-            {\r
-                drp_audioMix.Enabled = true;\r
-                drp_audioBitrate.Enabled = true;\r
-                drp_audioSample.Enabled = true;\r
+        /// <summary>\r
+        /// Load an arraylist of AudioTrack items into the list.\r
+        /// </summary>\r
+        /// <param name="audioTracks">List of audio tracks</param>\r
+        public void LoadTracks(ArrayList audioTracks)\r
+        {\r
+            ClearAudioList();\r
 \r
-                drp_audioMix.SelectedIndex = 0;\r
-                drp_audioBitrate.SelectedIndex = 9;\r
-                drp_audioSample.SelectedIndex = 0;\r
-            }\r
+            if (audioTracks == null)\r
+                return;\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            foreach (AudioTrack track in audioTracks)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text = drp_audioEncoder.Text;\r
-                lv_audioList.Select();\r
+                DataGridViewRow newTrack = new DataGridViewRow();\r
+                newTrack.CreateCells(audioList);\r
+                newTrack.Cells[0].Value = GetNewID().ToString();\r
+                newTrack.Cells[1].Value = "Automatic";\r
+                newTrack.Cells[2].Value = track.Encoder;\r
+                newTrack.Cells[3].Value = track.MixDown;\r
+                newTrack.Cells[4].Value = track.SampleRate;\r
+                newTrack.Cells[5].Value = track.Encoder.Contains(AC3Passthru) || track.Encoder.Contains(DTSPassthru) ? "Auto" : track.Bitrate;\r
+                newTrack.Cells[6].Value = track.DRC;\r
+                AddTrackForPreset(newTrack);\r
             }\r
+\r
+            this.AutomaticTrackSelection();\r
         }\r
-        private void drp_audmix_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        /// <summary>\r
+        /// Set the Track list dropdown from the parsed title captured during the scan\r
+        /// </summary>\r
+        /// <param name="selectedTitle">The selected title</param>\r
+        /// <param name="preset">A preset</param>\r
+        public void SetTrackListFromPreset(Title selectedTitle, Preset preset)\r
         {\r
-            if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text == "6 Channel Discrete"))\r
-                setBitrate(384);\r
-            else if ((drp_audioEncoder.Text.Contains("AAC")) && (drp_audioMix.Text != "6 Channel Discrete"))\r
-                setBitrate(160);\r
+            if (selectedTitle.AudioTracks.Count == 0)\r
+            {\r
+                audioList.Rows.Clear();\r
+                drp_audioTrack.Items.Clear();\r
+                drp_audioTrack.Items.Add("None Found");\r
+                drp_audioTrack.SelectedIndex = 0;\r
+                return;\r
+            }\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            // Setup the Audio track source dropdown with the new audio tracks.\r
+            drp_audioTrack.Items.Clear();\r
+            drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
+\r
+            // Add any tracks the preset has, if there is a preset and no audio tracks in the list currently\r
+            if (audioList.Rows.Count == 0 && preset != null)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text = drp_audioMix.Text;\r
-                lv_audioList.Select();\r
+                QueryParser parsed = QueryParser.Parse(preset.Query);\r
+                foreach (AudioTrack audioTrack in parsed.AudioInformation)\r
+                {\r
+                    DataGridViewRow newTrack = new DataGridViewRow();\r
+                    newTrack.CreateCells(audioList);\r
+                    newTrack.Cells[0].Value = GetNewID().ToString();\r
+                    newTrack.Cells[1].Value = (audioTrack.Track);\r
+                    newTrack.Cells[2].Value = (audioTrack.Encoder);\r
+                    newTrack.Cells[3].Value = (audioTrack.MixDown);\r
+                    newTrack.Cells[4].Value = (audioTrack.SampleRate);\r
+                    newTrack.Cells[5].Value = (audioTrack.Bitrate);\r
+                    newTrack.Cells[6].Value = (audioTrack.DRC);\r
+                    audioList.Rows.Add(newTrack);\r
+                }\r
             }\r
+\r
+            this.AutomaticTrackSelection();\r
         }\r
-        private void drp_audsr_SelectedIndexChanged(object sender, EventArgs e)\r
+\r
+        private void AutomaticTrackSelection()\r
         {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
+            if (Properties.Settings.Default.NativeLanguage == "Any")\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text = drp_audioSample.Text;\r
-                lv_audioList.Select();\r
+                drp_audioTrack.SelectedIndex = 0;\r
+                foreach (DataGridViewRow item in audioList.Rows)\r
+                {\r
+                    if (this.drp_audioTrack.SelectedItem != null)\r
+                    {\r
+                        item.Cells[1].Value = this.drp_audioTrack.SelectedItem.ToString();\r
+                    }\r
+                }\r
             }\r
-        }\r
-        private void drp_audbit_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+            else\r
             {\r
-                if (drp_audioEncoder.Text.Contains("AC3"))\r
-                    drp_audioBitrate.SelectedItem = "Auto";\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text = drp_audioBitrate.Text;\r
-                lv_audioList.Select();\r
+                int mode = Properties.Settings.Default.DubMode;\r
+                switch (mode)\r
+                {\r
+                    case 1:\r
+                    case 3:\r
+                        // Dub Foreign Language Audio \r
+                        // Select the prefered language audio, or the first track if it doesn't exist.\r
+                        int i = 0;\r
+                        foreach (object item in drp_audioTrack.Items)\r
+                        {\r
+                            if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
+                            {\r
+                                drp_audioTrack.SelectedIndex = i;\r
+                                break;\r
+                            }\r
+\r
+                            i++;\r
+                        }\r
+\r
+                        if (drp_audioTrack.SelectedItem != null)\r
+                            foreach (DataGridViewRow item in audioList.Rows)\r
+                                item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        else\r
+                        {\r
+                            drp_audioTrack.SelectedIndex = 0;\r
+                            if (drp_audioTrack.SelectedItem != null)\r
+                                foreach (DataGridViewRow item in audioList.Rows)\r
+                                    item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        }\r
+\r
+                        break;\r
+                    case 2:\r
+                    default:\r
+                        // Select the first track which is hopefully the default and foreign track.\r
+                        drp_audioTrack.SelectedIndex = 0;\r
+\r
+                        if (drp_audioTrack.SelectedItem != null)\r
+                            foreach (DataGridViewRow item in audioList.Rows)\r
+                                item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString();\r
+                        break;\r
+                }\r
             }\r
         }\r
-        private void tb_drc_Scroll(object sender, EventArgs e)\r
+\r
+        // Control and ListView\r
+\r
+        /// <summary>\r
+        /// one of the controls has changed. Event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void ControlChanged(object sender, EventArgs e)\r
         {\r
-            double value;\r
-            if (tb_drc.Value == 0) value = 0;\r
-            else\r
-                value = ((tb_drc.Value - 1) / 10.0) + 1;\r
+            Control ctl = (Control)sender;\r
 \r
-            lbl_drc.Text = value.ToString();\r
+            switch (ctl.Name)\r
+            {\r
+                case "drp_audioTrack":\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                    {\r
+                        audioList.SelectedRows[0].Cells[1].Value = drp_audioTrack.Text;\r
 \r
-            // Update an item in the Audio list if required.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
+                        // If the track isn't AC3, and the encoder is, change it.\r
+                        if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(AC3Passthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("(AC3)"))\r
+                        {\r
+                            // Switch to AAC\r
+                            drp_audioEncoder.SelectedIndex = 0;\r
+                        }\r
+\r
+                        // If the track isn't DTS, and the encoder is, change it.\r
+                        if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(DTSPassthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("DTS"))\r
+                        {\r
+                            // Switch to AAC\r
+                            drp_audioEncoder.SelectedIndex = 0;\r
+                        }\r
+                    }\r
+                    break;\r
+                case "drp_audioEncoder":\r
+                    SetMixDown();\r
+                    SetBitrate();\r
+\r
+                    // Configure the widgets with values\r
+                    if (drp_audioEncoder.Text.Contains(AC3Passthru) || drp_audioEncoder.Text.Contains(DTSPassthru))\r
+                    {\r
+                        drp_audioMix.Enabled =\r
+                            drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = false;\r
+                        lbl_bitrate.Enabled =\r
+                            lbl_drc.Enabled =\r
+                            lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = false;\r
+                    }\r
+                    else\r
+                    {\r
+                        drp_audioMix.Enabled =\r
+                            drp_audioBitrate.Enabled = drp_audioSample.Enabled = tb_drc.Enabled = true;\r
+                        lbl_bitrate.Enabled =\r
+                            lbl_drc.Enabled =\r
+                            lbl_drcHeader.Enabled = lbl_mixdown.Enabled = lbl_sampleRate.Enabled = true;\r
+                    }\r
+\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[2].Value = drp_audioEncoder.Text;\r
+                    break;\r
+                case "drp_audioMix":\r
+                    SetBitrate();\r
+\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[3].Value = drp_audioMix.Text;\r
+                    break;\r
+                case "drp_audioSample":\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[4].Value = drp_audioSample.Text;\r
+                    break;\r
+                case "drp_audioBitrate":\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                        audioList.SelectedRows[0].Cells[5].Value = drp_audioBitrate.Text;\r
+                    break;\r
+                case "tb_drc":\r
+                    double value;\r
+                    if (tb_drc.Value == 0) value = 0;\r
+                    else\r
+                        value = ((tb_drc.Value - 1) / 10.0) + 1;\r
+\r
+                    lbl_drc.Text = value.ToString();\r
+\r
+                    // Update an item in the Audio list if required.\r
+                    if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
+                    {\r
+                        audioList.SelectedRows[0].Cells[6].Value = value.ToString();\r
+                        audioList.Select();\r
+                    }\r
+                    break;\r
+            }\r
+\r
+            audioList.Select();\r
+        }\r
+\r
+        /// <summary>\r
+        /// The Audio List selected index changed event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
+        private void audioList_SelectionChanged(object sender, EventArgs e)\r
+        {\r
+            // Set the dropdown controls based on the selected item in the Audio List.\r
+            if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0)\r
             {\r
-                lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text = value.ToString();\r
-                lv_audioList.Select();\r
+                drp_audioTrack.SelectedItem = audioList.SelectedRows[0].Cells[1].Value;\r
+                drp_audioEncoder.SelectedItem = audioList.SelectedRows[0].Cells[2].Value;\r
+                drp_audioMix.SelectedItem = audioList.SelectedRows[0].Cells[3].Value;\r
+                drp_audioSample.SelectedItem = audioList.SelectedRows[0].Cells[4].Value;\r
+                drp_audioBitrate.SelectedItem = audioList.SelectedRows[0].Cells[5].Value;\r
+                double drcValue;\r
+                int drcCalculated;\r
+                double.TryParse(audioList.SelectedRows[0].Cells[6].Value.ToString(), out drcValue);\r
+                if (drcValue != 0)\r
+                    drcValue = ((drcValue * 10) + 1) - 10;\r
+                int.TryParse(drcValue.ToString(), out drcCalculated);\r
+                tb_drc.Value = drcCalculated;\r
+                lbl_drc.Text = audioList.SelectedRows[0].Cells[6].Value.ToString();\r
+\r
+                AudioTrackGroup.Text = "Selected Track: " + audioList.SelectedRows[0].Cells[0].Value;\r
             }\r
+            else\r
+                AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
         }\r
 \r
         // Track Controls\r
+\r
+        /// <summary>\r
+        /// The Add Audio Track button event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_addAudioTrack_Click(object sender, EventArgs e)\r
         {\r
+            if (drp_audioTrack.Text == "None Found")\r
+            {\r
+                MessageBox.Show(\r
+                    "Your source appears to have no audio tracks that HandBrake supports.",\r
+                    "Warning",\r
+                    MessageBoxButtons.OK,\r
+                    MessageBoxIcon.Warning);\r
+                return;\r
+            }\r
+\r
             double value = 0;\r
             if (tb_drc.Value != 0)\r
                 value = ((tb_drc.Value - 1) / 10.0) + 1;\r
 \r
             // Create a new row for the Audio list based on the currently selected items in the dropdown.\r
-            ListViewItem newTrack = new ListViewItem(GetNewID().ToString());\r
-            newTrack.SubItems.Add(drp_audioTrack.Text);\r
-            newTrack.SubItems.Add(drp_audioEncoder.Text);\r
-            newTrack.SubItems.Add(drp_audioMix.Text);\r
-            newTrack.SubItems.Add(drp_audioSample.Text);\r
-            newTrack.SubItems.Add(drp_audioBitrate.Text);\r
-            newTrack.SubItems.Add(value.ToString());\r
-            lv_audioList.Items.Add(newTrack);\r
+            DataGridViewRow newTrack = new DataGridViewRow();\r
+            newTrack.CreateCells(audioList);\r
+            newTrack.Cells[0].Value = GetNewID().ToString();\r
+            newTrack.Cells[1].Value = drp_audioTrack.Text;\r
+            newTrack.Cells[2].Value = drp_audioEncoder.Text;\r
+            newTrack.Cells[3].Value = drp_audioMix.Text;\r
+            newTrack.Cells[4].Value = drp_audioSample.Text;\r
+            newTrack.Cells[5].Value = drp_audioBitrate.Text;\r
+            newTrack.Cells[6].Value = value.ToString();\r
+            audioList.Rows.Add(newTrack);\r
 \r
             // The Audio List has changed to raise the event.\r
             if (this.AudioListChanged != null)\r
                 this.AudioListChanged(this, new EventArgs());\r
 \r
             // Select the newly added track and select the control       \r
-            lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
-            lv_audioList.Select();\r
+            audioList.ClearSelection();\r
+            audioList.Rows[audioList.Rows.Count - 1].Selected = true;\r
+            audioList.Select();\r
         }\r
+\r
+        /// <summary>\r
+        /// The Remove Track button event handler\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void btn_RemoveAudioTrack_Click(object sender, EventArgs e)\r
         {\r
-            RemoveAudioTrack();\r
+            RemoveTrack();\r
         }\r
 \r
         // Audio List Menu\r
+\r
+        /// <summary>\r
+        /// The Audio List Move Up menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_moveup_Click(object sender, EventArgs e)\r
         {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index--;\r
-\r
-                if (lv_audioList.Items.Count > index && index >= 0)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
+            MoveTrack(true);\r
         }\r
+\r
+        /// <summary>\r
+        /// The audio list move down menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_movedown_Click(object sender, EventArgs e)\r
         {\r
-            if (lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                ListViewItem item = lv_audioList.SelectedItems[0];\r
-                int index = item.Index;\r
-                index++;\r
-\r
-                if (index < lv_audioList.Items.Count)\r
-                {\r
-                    lv_audioList.Items.Remove(item);\r
-                    lv_audioList.Items.Insert(index, item);\r
-                    item.Selected = true;\r
-                    lv_audioList.Focus();\r
-                }\r
-            }\r
+            MoveTrack(false);\r
         }\r
+\r
+        /// <summary>\r
+        /// The audio list remove menu item\r
+        /// </summary>\r
+        /// <param name="sender">\r
+        /// The sender.\r
+        /// </param>\r
+        /// <param name="e">\r
+        /// The e.\r
+        /// </param>\r
         private void audioList_remove_Click(object sender, EventArgs e)\r
         {\r
-            RemoveAudioTrack();\r
+            RemoveTrack();\r
         }\r
-        private void RemoveAudioTrack()\r
+\r
+        // Private Functions\r
+\r
+        /// <summary>\r
+        /// Add track for preset\r
+        /// </summary>\r
+        /// <param name="item">\r
+        /// The item.\r
+        /// </param>\r
+        private void AddTrackForPreset(DataGridViewRow item)\r
+        {\r
+            audioList.Rows.Add(item);\r
+            if (this.AudioListChanged != null)\r
+                this.AudioListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Clear the audio list\r
+        /// </summary>\r
+        private void ClearAudioList()\r
+        {\r
+            audioList.Rows.Clear();\r
+            if (this.AudioListChanged != null)\r
+                this.AudioListChanged(this, new EventArgs());\r
+        }\r
+\r
+        /// <summary>\r
+        /// Get a new ID for the next audio track\r
+        /// </summary>\r
+        /// <returns>\r
+        /// an int\r
+        /// </returns>\r
+        private int GetNewID()\r
+        {\r
+            return audioList.Rows.Count + 1;\r
+        }\r
+\r
+        /// <summary>\r
+        /// Remove an audio track from the list\r
+        /// </summary>\r
+        private void RemoveTrack()\r
         {\r
             // Remove the Item and reselect the control if the following conditions are met.\r
-            if (lv_audioList.SelectedItems.Count != 0)\r
+            if (audioList.SelectedRows.Count != 0)\r
             {\r
                 // The Audio List is about to change so raise the event.\r
                 if (this.AudioListChanged != null)\r
                     this.AudioListChanged(this, new EventArgs());\r
 \r
                 // Record the current selected index.\r
-                int currentPosition = lv_audioList.SelectedIndices[0];\r
+                int currentPosition = audioList.SelectedRows[0].Index;\r
 \r
-                lv_audioList.Items.RemoveAt(lv_audioList.SelectedIndices[0]);\r
+                audioList.Rows.Remove(audioList.SelectedRows[0]);\r
 \r
                 // Now reslect the correct item and give focus to the audio list.\r
-                if (lv_audioList.Items.Count != 0)\r
+                if (audioList.Rows.Count != 0)\r
                 {\r
-                    if (currentPosition <= (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[currentPosition].Selected = true;\r
-                    else if (currentPosition > (lv_audioList.Items.Count - 1))\r
-                        lv_audioList.Items[lv_audioList.Items.Count - 1].Selected = true;\r
+                    audioList.ClearSelection();\r
+                    if (currentPosition <= (audioList.Rows.Count - 1))\r
+                        audioList.Rows[currentPosition].Selected = true;\r
+                    else if (currentPosition > (audioList.Rows.Count - 1))\r
+                        audioList.Rows[audioList.Rows.Count - 1].Selected = true;\r
 \r
-                    lv_audioList.Select();\r
+                    audioList.Select();\r
                 }\r
                 // Regenerate the ID numers\r
-                reGenerateListIDs();\r
+                ReGenerateListIDs();\r
             }\r
         }\r
 \r
-        // Public Functions\r
-        public void SetTrackList(Parsing.Title selectedTitle)\r
-        {\r
-            drp_audioTrack.Items.Clear();\r
-            drp_audioTrack.Items.Add("Automatic");\r
-            drp_audioTrack.Items.Add("None");\r
-            drp_audioTrack.Items.AddRange(selectedTitle.AudioTracks.ToArray());\r
-\r
-            // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options\r
-            if (Properties.Settings.Default.NativeLanguage == "Any")\r
-                drp_audioTrack.SelectedIndex = 0;\r
-            else\r
-            {\r
-                if (Properties.Settings.Default.DubAudio) // "Dub Foreign language audio" \r
-                {\r
-                    int i = 0;\r
-                    foreach (object item in drp_audioTrack.Items)\r
-                    {\r
-                        if (item.ToString().Contains(Properties.Settings.Default.NativeLanguage))\r
-                        {\r
-                            drp_audioTrack.SelectedIndex = i;\r
-                            break;\r
-                        }\r
-\r
-                        i++;\r
-                    }\r
-\r
-                    if (drp_audioTrack.SelectedItem != null)\r
-                        foreach (ListViewItem item in lv_audioList.Items)\r
-                            item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
-                    else\r
-                    {\r
-                        drp_audioTrack.SelectedIndex = 0;\r
-                        if (drp_audioTrack.SelectedItem != null)\r
-                            foreach (ListViewItem item in lv_audioList.Items)\r
-                                item.SubItems[1].Text = drp_audioTrack.SelectedItem.ToString();\r
-                    }\r
-                }\r
-                else\r
-                    drp_audioTrack.SelectedIndex = 0; // "Use Foreign language audio and Subtitles"\r
-            }\r
-            drp_audioMix.SelectedIndex = 0;\r
-        }\r
-        public ListView GetAudioPanel()\r
-        {\r
-            return lv_audioList;\r
-        }\r
-        public void SetContainer(String path)\r
+        /// <summary>\r
+        /// Move an audio track up or down the audio list\r
+        /// </summary>\r
+        /// <param name="up">\r
+        /// The up.\r
+        /// </param>\r
+        private void MoveTrack(bool up)\r
         {\r
-            string oldval = drp_audioEncoder.Text;\r
-            if ((path.Contains("MP4")) || (path.Contains("M4V")))\r
-            {\r
-                drp_audioEncoder.Items.Clear();\r
-                drp_audioEncoder.Items.Add("AAC (faac)");\r
-                drp_audioEncoder.Items.Add("AC3 Passthru");\r
-                if ((oldval != "AAC (faac)") && (oldval != "AC3 Passthru"))\r
-                    drp_audioEncoder.SelectedIndex = 0;\r
-                else\r
-                    drp_audioEncoder.SelectedItem = oldval;\r
+            if (audioList.SelectedRows.Count == 0) return;\r
 \r
-            }\r
-            else if (path.Contains("MKV"))\r
-            {\r
-                drp_audioEncoder.Items.Clear();\r
-                drp_audioEncoder.Items.Add("AAC (faac)");\r
-                drp_audioEncoder.Items.Add("MP3 (lame)");\r
-                drp_audioEncoder.Items.Add("AC3 Passthru");\r
-                drp_audioEncoder.Items.Add("DTS Passthru");\r
-                drp_audioEncoder.Items.Add("Vorbis (vorbis)");\r
-                drp_audioEncoder.SelectedItem = oldval;\r
+            DataGridViewRow item = audioList.SelectedRows[0];\r
+            int index = item.Index;\r
 \r
-                if (drp_audioEncoder.Text == string.Empty)\r
-                    drp_audioEncoder.SelectedIndex = 0;\r
-            }\r
+            if (up) index--;\r
+            else index++;\r
 \r
-            // Make sure the table is updated with new audio codecs\r
-            foreach (ListViewItem row in lv_audioList.Items)\r
+            if (index < audioList.Rows.Count || (audioList.Rows.Count > index && index >= 0))\r
             {\r
-                if (!drp_audioEncoder.Items.Contains(row.SubItems[2].Text))\r
-                    row.SubItems[2].Text = drp_audioEncoder.Items[0].ToString();\r
+                audioList.Rows.Remove(item);\r
+                audioList.Rows.Insert(index, item);\r
+                audioList.ClearSelection();\r
+                item.Selected = true;\r
             }\r
         }\r
-        public void AddTrackForPreset(ListViewItem item)\r
-        {\r
-            lv_audioList.Items.Add(item);\r
-            if (this.AudioListChanged != null)\r
-                this.AudioListChanged(this, new EventArgs());\r
-        }\r
-        public void ClearAudioList()\r
-        {\r
-            lv_audioList.Items.Clear();\r
-            if (this.AudioListChanged != null)\r
-                this.AudioListChanged(this, new EventArgs());\r
-        }\r
-        public int GetNewID()\r
-        {\r
-            return lv_audioList.Items.Count + 1;\r
-        }\r
-        public Boolean RequiresM4V()\r
-        {\r
-            foreach (ListViewItem item in lv_audioList.Items)\r
-            {\r
-                if (item.SubItems[2].Text.Contains("AC3"))\r
-                    return true;\r
-            }\r
-            return false;\r
-        }\r
 \r
-        // Helper Functions \r
-        private void reGenerateListIDs()\r
+        /// <summary>\r
+        /// Regenerate all the audio track id's on the audio list\r
+        /// </summary>\r
+        private void ReGenerateListIDs()\r
         {\r
             int i = 1;\r
-            foreach (ListViewItem item in lv_audioList.Items)\r
+            foreach (DataGridViewRow item in audioList.Rows)\r
             {\r
-                item.SubItems[0].Text = i.ToString();\r
+                item.Cells[0].Value = i.ToString();\r
                 i++;\r
             }\r
         }\r
-        private void setBitrate(int max)\r
+\r
+        /// <summary>\r
+        /// Set the bitrate dropdown\r
+        /// </summary>\r
+        private void SetBitrate()\r
         {\r
+            int max = 0;\r
+            drp_audioBitrate.Items.Remove("Auto");\r
+            drp_audioBitrate.Items.Remove("192");\r
+            drp_audioBitrate.Items.Remove("224");\r
+            drp_audioBitrate.Items.Remove("256");\r
+            drp_audioBitrate.Items.Remove("320");\r
+            drp_audioBitrate.Items.Remove("384");\r
+            drp_audioBitrate.Items.Remove("448");\r
+            drp_audioBitrate.Items.Remove("640");\r
+            drp_audioBitrate.Items.Remove("768");\r
+\r
+            switch (drp_audioEncoder.Text)\r
+            {\r
+                case "AAC (faac)":\r
+                    max = drp_audioMix.Text.Contains("6 Channel") ? 768 : 320;\r
+                    break;\r
+                case "MP3 (lame)":\r
+                    max = 320;\r
+                    break;\r
+                case "Vorbis (vorbis)":\r
+                    max = 384;\r
+                    break;\r
+                case "AC3 (ffmpeg)":\r
+                    max = 640;\r
+                    break;\r
+                case AC3Passthru:\r
+                    drp_audioBitrate.Items.Add("Auto");\r
+                    drp_audioBitrate.SelectedItem = "Auto";\r
+                    drp_audioSample.SelectedItem = "Auto";\r
+                    break;\r
+                case DTSPassthru:\r
+                    drp_audioBitrate.Items.Add("Auto");\r
+                    drp_audioBitrate.SelectedItem = "Auto";\r
+                    drp_audioSample.SelectedItem = "Auto";\r
+                    break;\r
+            }\r
+\r
             if (max > 160)\r
             {\r
                 drp_audioBitrate.Items.Add("192");\r
                 drp_audioBitrate.Items.Add("224");\r
                 drp_audioBitrate.Items.Add("256");\r
                 drp_audioBitrate.Items.Add("320");\r
-                if (max == 384)\r
-                    drp_audioBitrate.Items.Add("384");\r
-                else\r
-                    drp_audioBitrate.Items.Remove("384");\r
             }\r
-            else\r
+\r
+            if (max > 320)\r
             {\r
-                drp_audioBitrate.Items.Remove("192");\r
-                drp_audioBitrate.Items.Remove("224");\r
-                drp_audioBitrate.Items.Remove("256");\r
-                drp_audioBitrate.Items.Remove("320");\r
-                drp_audioBitrate.Items.Remove("384");\r
+                drp_audioBitrate.Items.Add("384");\r
             }\r
-            if (drp_audioBitrate.SelectedItem == null)\r
+\r
+            if (max >= 640)\r
+            {\r
+                drp_audioBitrate.Items.Add("448");\r
+                drp_audioBitrate.Items.Add("640");\r
+            }\r
+\r
+            if (max == 768)\r
+            {\r
+                drp_audioBitrate.Items.Add("768");\r
+            }\r
+\r
+            if (drp_audioBitrate.SelectedItem == null && audioList.SelectedRows.Count == 0)\r
                 drp_audioBitrate.SelectedIndex = drp_audioBitrate.Items.Count - 1;\r
+\r
+            if (drp_audioBitrate.SelectedItem == null && audioList.SelectedRows.Count != 0 && (string)this.audioList.SelectedRows[0].Cells[5].Value == "Auto")\r
+            {\r
+                drp_audioBitrate.SelectedItem = "160";\r
+            }\r
         }\r
-        private void setMixDown(Boolean aac)\r
+\r
+        /// <summary>\r
+        /// Set the mixdown dropdown\r
+        /// </summary>\r
+        private void SetMixDown()\r
         {\r
             drp_audioMix.Items.Clear();\r
-            drp_audioMix.Items.Add("Automatic");\r
-            if (aac)\r
-                drp_audioMix.Items.Add("Mono");\r
+            drp_audioMix.Items.Add("Mono");\r
             drp_audioMix.Items.Add("Stereo");\r
             drp_audioMix.Items.Add("Dolby Surround");\r
             drp_audioMix.Items.Add("Dolby Pro Logic II");\r
-            if (aac)\r
-                drp_audioMix.Items.Add("6 Channel Discrete");\r
-        }\r
-        private void lv_audioList_SelectedIndexChanged(object sender, EventArgs e)\r
-        {\r
-            // Set the dropdown controls based on the selected item in the Audio List.\r
-            if (lv_audioList.Items.Count != 0 && lv_audioList.SelectedIndices.Count != 0)\r
-            {\r
-                drp_audioTrack.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[1].Text;\r
-                drp_audioEncoder.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[2].Text;\r
-                drp_audioMix.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[3].Text;\r
-                drp_audioSample.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[4].Text;\r
-                drp_audioBitrate.SelectedItem = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[5].Text;\r
-                double drcValue; int drcCalculated;\r
-                double.TryParse(lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text, out drcValue);\r
-                if (drcValue == 0) drcCalculated = 0;\r
-                else\r
-                    drcValue = ((drcValue * 10) + 1) - 10;\r
-                int.TryParse(drcValue.ToString(), out drcCalculated);\r
-                tb_drc.Value = drcCalculated;\r
-                lbl_drc.Text = lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[6].Text;\r
+            drp_audioMix.Items.Add("6 Channel Discrete");\r
+            drp_audioMix.Items.Add(AC3Passthru);\r
+            drp_audioMix.Items.Add(DTSPassthru);\r
+\r
+            drp_audioMix.SelectedItem = "Dolby Pro Logic II";\r
 \r
-                AudioTrackGroup.Text = "Selected Track: " + lv_audioList.Items[lv_audioList.SelectedIndices[0]].SubItems[0].Text;\r
+            switch (drp_audioEncoder.Text)\r
+            {\r
+                case "AAC (faac)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "MP3 (lame)":\r
+                    drp_audioMix.Items.Remove("6 Channel Discrete");\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "Vorbis (vorbis)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "AC3 (ffmpeg)":\r
+                    drp_audioMix.Items.Remove(AC3Passthru);\r
+                    drp_audioMix.Items.Remove(DTSPassthru);\r
+                    break;\r
+                case "AC3 Passthru":\r
+                    drp_audioMix.SelectedItem = AC3Passthru;\r
+                    break;\r
+                case "DTS Passthru":\r
+                    drp_audioMix.SelectedItem = DTSPassthru;\r
+                    break;\r
             }\r
-            else\r
-                AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)";\r
         }\r
-\r
     }\r
 }
\ No newline at end of file