From 5f692a69a63f106cabe9dad4dfc85cc5c6d93cb9 Mon Sep 17 00:00:00 2001 From: sr55 Date: Fri, 8 Apr 2011 19:34:20 +0000 Subject: [PATCH] WinGui: AudioPanel refactored. - Switch the Audio panel to use DataBinding to a BindingList collection leading to much cleaner code. - Added gain support (--gain=3,4) to the services library. (UI has not been done yet) git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3911 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- win/CS/Controls/AudioPanel.Designer.cs | 33 +-- win/CS/Controls/AudioPanel.cs | 271 +++++++++--------- win/CS/Controls/AudioPanel.resx | 3 - win/CS/Functions/QueryGenerator.cs | 174 +++-------- .../Converters/EnumToDescConverter.cs | 24 ++ .../Functions/EnumHelper.cs | 26 +- .../HandBrake.ApplicationServices.csproj | 1 + .../Model/Encoding/AudioEncoder.cs | 3 + .../Model/Encoding/AudioTrack.cs | 52 +++- .../Model/Encoding/Mixdown.cs | 11 +- .../Parsing/Subtitle.cs | 3 +- .../Utilities/PlistUtility.cs | 8 +- .../Utilities/QueryGeneratorUtility.cs | 9 +- .../Utilities/QueryParserUtility.cs | 2 +- win/CS/frmQueue.cs | 4 +- 15 files changed, 309 insertions(+), 315 deletions(-) create mode 100644 win/CS/HandBrake.ApplicationServices/Converters/EnumToDescConverter.cs diff --git a/win/CS/Controls/AudioPanel.Designer.cs b/win/CS/Controls/AudioPanel.Designer.cs index 43e5ba8ec..1ef05e377 100644 --- a/win/CS/Controls/AudioPanel.Designer.cs +++ b/win/CS/Controls/AudioPanel.Designer.cs @@ -59,7 +59,6 @@ namespace Handbrake.Controls this.AudioTrackGroup = new System.Windows.Forms.GroupBox(); this.AudioMenuRowHeightHack = new System.Windows.Forms.ImageList(this.components); this.audioList = new System.Windows.Forms.DataGridView(); - this.Track = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Source = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.AudioCodec = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.Mixdown = new System.Windows.Forms.DataGridViewTextBoxColumn(); @@ -87,7 +86,7 @@ namespace Handbrake.Controls this.audioList_moveup.Name = "audioList_moveup"; this.audioList_moveup.Size = new System.Drawing.Size(138, 22); this.audioList_moveup.Text = "Move Up"; - this.audioList_moveup.Click += new System.EventHandler(this.audioList_moveup_Click); + this.audioList_moveup.Click += new System.EventHandler(this.AudioList_moveup_Click); // // audioList_movedown // @@ -95,7 +94,7 @@ namespace Handbrake.Controls this.audioList_movedown.Size = new System.Drawing.Size(138, 22); this.audioList_movedown.Text = "Move Down"; this.audioList_movedown.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.audioList_movedown.Click += new System.EventHandler(this.audioList_movedown_Click); + this.audioList_movedown.Click += new System.EventHandler(this.AudioList_movedown_Click); // // toolStripSeparator2 // @@ -107,7 +106,7 @@ namespace Handbrake.Controls this.audioList_remove.Name = "audioList_remove"; this.audioList_remove.Size = new System.Drawing.Size(138, 22); this.audioList_remove.Text = "Remove"; - this.audioList_remove.Click += new System.EventHandler(this.audioList_remove_Click); + this.audioList_remove.Click += new System.EventHandler(this.AudioList_remove_Click); // // btn_RemoveAudioTrack // @@ -120,7 +119,7 @@ namespace Handbrake.Controls this.btn_RemoveAudioTrack.TabIndex = 64; this.btn_RemoveAudioTrack.Text = "Remove"; this.btn_RemoveAudioTrack.UseVisualStyleBackColor = false; - this.btn_RemoveAudioTrack.Click += new System.EventHandler(this.btn_RemoveAudioTrack_Click); + this.btn_RemoveAudioTrack.Click += new System.EventHandler(this.RemoveAudioTrack_Click); // // btn_addAudioTrack // @@ -133,7 +132,7 @@ namespace Handbrake.Controls this.btn_addAudioTrack.TabIndex = 63; this.btn_addAudioTrack.Text = "Add Track"; this.btn_addAudioTrack.UseVisualStyleBackColor = false; - this.btn_addAudioTrack.Click += new System.EventHandler(this.btn_addAudioTrack_Click); + this.btn_addAudioTrack.Click += new System.EventHandler(this.AddAudioTrack_Click); // // lbl_drc // @@ -351,7 +350,6 @@ namespace Handbrake.Controls this.audioList.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.None; this.audioList.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing; this.audioList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { - this.Track, this.Source, this.AudioCodec, this.Mixdown, @@ -374,32 +372,28 @@ namespace Handbrake.Controls this.audioList.TabIndex = 67; this.audioList.SelectionChanged += new System.EventHandler(this.audioList_SelectionChanged); // - // Track - // - this.Track.FillWeight = 304.2808F; - this.Track.HeaderText = "Track"; - this.Track.Name = "Track"; - this.Track.ReadOnly = true; - this.Track.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; - this.Track.Width = 50; - // // Source // + this.Source.DataPropertyName = "SourceTrack"; this.Source.FillWeight = 49.69727F; this.Source.HeaderText = "Source"; this.Source.Name = "Source"; + this.Source.ReadOnly = true; this.Source.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; - this.Source.Width = 150; + this.Source.Width = 170; // // AudioCodec // + this.AudioCodec.DataPropertyName = "Encoder"; this.AudioCodec.HeaderText = "Audio Codec"; this.AudioCodec.Name = "AudioCodec"; this.AudioCodec.ReadOnly = true; this.AudioCodec.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; + this.AudioCodec.Width = 120; // // Mixdown // + this.Mixdown.DataPropertyName = "Mixdown"; this.Mixdown.FillWeight = 49.69727F; this.Mixdown.HeaderText = "Mixdown"; this.Mixdown.Name = "Mixdown"; @@ -409,6 +403,7 @@ namespace Handbrake.Controls // // Samplerate // + this.Samplerate.DataPropertyName = "SampleRateDisplayValue"; this.Samplerate.FillWeight = 49.69727F; this.Samplerate.HeaderText = "Samplerate"; this.Samplerate.Name = "Samplerate"; @@ -418,6 +413,7 @@ namespace Handbrake.Controls // // Bitrate // + this.Bitrate.DataPropertyName = "BitRateDisplayValue"; this.Bitrate.FillWeight = 49.69727F; this.Bitrate.HeaderText = "Bitrate"; this.Bitrate.Name = "Bitrate"; @@ -428,10 +424,12 @@ namespace Handbrake.Controls // DRC // this.DRC.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill; + this.DRC.DataPropertyName = "DRC"; this.DRC.FillWeight = 96.36334F; this.DRC.HeaderText = "DRC"; this.DRC.Name = "DRC"; this.DRC.ReadOnly = true; + this.DRC.Resizable = System.Windows.Forms.DataGridViewTriState.True; this.DRC.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; // // AudioPanel @@ -482,7 +480,6 @@ namespace Handbrake.Controls private System.Windows.Forms.ToolStripMenuItem audioList_remove; internal System.Windows.Forms.ComboBox drp_audioBitrate; private System.Windows.Forms.DataGridView audioList; - private System.Windows.Forms.DataGridViewTextBoxColumn Track; private System.Windows.Forms.DataGridViewTextBoxColumn Source; private System.Windows.Forms.DataGridViewTextBoxColumn AudioCodec; private System.Windows.Forms.DataGridViewTextBoxColumn Mixdown; diff --git a/win/CS/Controls/AudioPanel.cs b/win/CS/Controls/AudioPanel.cs index 54e07af44..6ff6824c0 100644 --- a/win/CS/Controls/AudioPanel.cs +++ b/win/CS/Controls/AudioPanel.cs @@ -7,6 +7,7 @@ namespace Handbrake.Controls { using System; using System.Collections.Generic; + using System.ComponentModel; using System.Globalization; using System.Linq; using System.Windows.Forms; @@ -24,17 +25,29 @@ namespace Handbrake.Controls /// public partial class AudioPanel : UserControl { + /** + * TODO - There is a lot of old code in here that access the datagrid that can be refactored to work with + * the new AudioTrack BindingList. + */ + private static readonly CultureInfo Culture = new CultureInfo("en-US", false); private const string AC3Passthru = "AC3 Passthru"; private const string DTSPassthru = "DTS Passthru"; + private readonly BindingList audioTracks = new BindingList(); + + #region Constructor and Events + /// /// Initializes a new instance of the class. - /// Create a new instance of the Audio Panel /// public AudioPanel() { InitializeComponent(); + + this.audioList.AutoGenerateColumns = false; + this.audioList.DataSource = audioTracks; + drp_audioMix.SelectedItem = "Dolby Pro Logic II"; drp_audioSample.SelectedIndex = 1; } @@ -44,16 +57,25 @@ namespace Handbrake.Controls /// public event EventHandler AudioListChanged; - #region Public Methods + #endregion + + #region Properties + /// - /// Get the audio panel + /// Gets the AudioTracks Collection /// - /// A listview containing the audio tracks - public DataGridView GetAudioPanel() + public IEnumerable AudioTracks { - return audioList; + get + { + return this.audioTracks; + } } + #endregion + + #region Public Methods + /// /// Set the File Container. This funciton is used to limit the available options for each file container. /// @@ -65,29 +87,21 @@ namespace Handbrake.Controls string oldval = drp_audioEncoder.Text; drp_audioEncoder.Items.Clear(); - drp_audioEncoder.Items.Add("AAC (faac)"); - drp_audioEncoder.Items.Add("MP3 (lame)"); - drp_audioEncoder.Items.Add(AC3Passthru); - drp_audioEncoder.Items.Add("AC3 (ffmpeg)"); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.Faac)); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.Lame)); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.Ac3Passthrough)); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.Ac3)); if (path.Contains("MKV")) { - drp_audioEncoder.Items.Add(DTSPassthru); - drp_audioEncoder.Items.Add("Vorbis (vorbis)"); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.DtsPassthrough)); + drp_audioEncoder.Items.Add(EnumHelper.GetDescription(AudioEncoder.Vorbis)); } if (!drp_audioEncoder.Text.Contains(oldval)) drp_audioEncoder.SelectedIndex = 0; else drp_audioEncoder.SelectedItem = oldval; - - // Make sure the table is updated with new audio codecs - // Defaults to AAC encoding. - foreach (DataGridViewRow row in audioList.Rows) - { - if (!drp_audioEncoder.Items.Contains(row.Cells[2].Value)) - row.Cells[2].Value = drp_audioEncoder.Items[0].ToString(); - } } /// @@ -96,7 +110,7 @@ namespace Handbrake.Controls /// True if m4v is required public bool RequiresM4V() { - return this.audioList.Rows.Cast().Any(row => row.Cells[2].Value.ToString().Contains("AC3")); + return true; } /// @@ -112,19 +126,13 @@ namespace Handbrake.Controls foreach (AudioTrack track in audioTracks) { - DataGridViewRow newTrack = new DataGridViewRow(); - newTrack.CreateCells(audioList); - newTrack.Cells[0].Value = GetNewID().ToString(); - newTrack.Cells[1].Value = "Automatic"; - newTrack.Cells[2].Value = EnumHelper.GetDescription(track.Encoder); - newTrack.Cells[3].Value = EnumHelper.GetDescription(track.MixDown); - newTrack.Cells[4].Value = (track.Encoder == AudioEncoder.Ac3Passthrough || track.Encoder == AudioEncoder.DtsPassthrough || track.SampleRate == 0.0) ? "Auto" : track.SampleRate.ToString(); - newTrack.Cells[5].Value = (track.Encoder == AudioEncoder.Ac3Passthrough || track.Encoder == AudioEncoder.DtsPassthrough) ? "Auto" : track.Bitrate.ToString(); - newTrack.Cells[6].Value = (track.Encoder == AudioEncoder.Ac3Passthrough || track.Encoder == AudioEncoder.DtsPassthrough) ? string.Empty : track.DRC.ToString(); - AddTrackForPreset(newTrack); + this.audioTracks.Add(track); } this.AutomaticTrackSelection(); + + if (this.AudioListChanged != null) + this.AudioListChanged(this, new EventArgs()); } /// @@ -153,16 +161,7 @@ namespace Handbrake.Controls EncodeTask parsed = QueryParserUtility.Parse(preset.Query); foreach (AudioTrack audioTrack in parsed.AudioTracks) { - DataGridViewRow newTrack = new DataGridViewRow(); - newTrack.CreateCells(audioList); - newTrack.Cells[0].Value = GetNewID().ToString(); - newTrack.Cells[1].Value = (audioTrack.Track); - newTrack.Cells[2].Value = (audioTrack.Encoder); - newTrack.Cells[3].Value = (audioTrack.MixDown); - newTrack.Cells[4].Value = (audioTrack.SampleRate); - newTrack.Cells[5].Value = (audioTrack.Bitrate); - newTrack.Cells[6].Value = (audioTrack.DRC); - audioList.Rows.Add(newTrack); + this.audioTracks.Add(audioTrack); } } @@ -184,6 +183,17 @@ namespace Handbrake.Controls /// private void ControlChanged(object sender, EventArgs e) { + if (audioList.SelectedRows.Count == 0) + { + return; + } + + AudioTrack track = audioList.SelectedRows[0].DataBoundItem as AudioTrack; + if (track == null) + { + return; + } + Control ctl = (Control)sender; switch (ctl.Name) @@ -191,17 +201,17 @@ namespace Handbrake.Controls case "drp_audioTrack": if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) { - audioList.SelectedRows[0].Cells[1].Value = drp_audioTrack.Text; + track.SourceTrack = drp_audioTrack.Text; // If the track isn't AC3, and the encoder is, change it. - if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(AC3Passthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("(AC3)")) + if (track.Encoder == AudioEncoder.Ac3Passthrough && !track.SourceTrack.Contains("(AC3)")) { // Switch to AAC drp_audioEncoder.SelectedIndex = 0; } // If the track isn't DTS, and the encoder is, change it. - if (audioList.SelectedRows[0].Cells[2].Value.ToString().Contains(DTSPassthru) && !audioList.SelectedRows[0].Cells[1].Value.ToString().Contains("DTS")) + if (track.Encoder == AudioEncoder.DtsPassthrough && !track.SourceTrack.Contains("DTS")) { // Switch to AAC drp_audioEncoder.SelectedIndex = 0; @@ -225,23 +235,26 @@ namespace Handbrake.Controls } // Update an item in the Audio list if required. - if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) - audioList.SelectedRows[0].Cells[2].Value = drp_audioEncoder.Text; + track.Encoder = EnumHelper.GetValue(drp_audioEncoder.Text); break; case "drp_audioMix": SetBitrate(); - if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) - audioList.SelectedRows[0].Cells[3].Value = drp_audioMix.Text; + track.MixDown = EnumHelper.GetValue(drp_audioMix.Text); + break; case "drp_audioSample": - if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) - audioList.SelectedRows[0].Cells[4].Value = drp_audioSample.Text; + + double samplerate; + double.TryParse(drp_audioSample.Text, out samplerate); + track.SampleRate = samplerate; break; case "drp_audioBitrate": // Update an item in the Audio list if required. - if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) - audioList.SelectedRows[0].Cells[5].Value = drp_audioBitrate.Text; + int bitrate; + int.TryParse(drp_audioBitrate.Text, out bitrate); + + track.Bitrate = bitrate; break; case "tb_drc": double value; @@ -250,17 +263,13 @@ namespace Handbrake.Controls value = ((tb_drc.Value - 1) / 10.0) + 1; lbl_drc.Text = value.ToString(); - - // Update an item in the Audio list if required. - if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) - { - audioList.SelectedRows[0].Cells[6].Value = value.ToString(); - audioList.Select(); - } + track.DRC = value; + audioList.Select(); + audioList.Refresh(); break; } - audioList.Select(); + audioList.Refresh(); } /// @@ -277,21 +286,24 @@ namespace Handbrake.Controls // Set the dropdown controls based on the selected item in the Audio List. if (audioList.Rows.Count != 0 && audioList.SelectedRows.Count != 0) { - drp_audioTrack.SelectedItem = audioList.SelectedRows[0].Cells[1].Value; - drp_audioEncoder.SelectedItem = audioList.SelectedRows[0].Cells[2].Value; - drp_audioMix.SelectedItem = audioList.SelectedRows[0].Cells[3].Value; - drp_audioSample.SelectedItem = audioList.SelectedRows[0].Cells[4].Value; - drp_audioBitrate.SelectedItem = audioList.SelectedRows[0].Cells[5].Value; - double drcValue; - int drcCalculated; - double.TryParse(audioList.SelectedRows[0].Cells[6].Value.ToString(), out drcValue); - if (drcValue != 0) - drcValue = ((drcValue * 10) + 1) - 10; - int.TryParse(drcValue.ToString(Culture), out drcCalculated); - tb_drc.Value = drcCalculated; - lbl_drc.Text = audioList.SelectedRows[0].Cells[6].Value.ToString(); - - AudioTrackGroup.Text = "Selected Track: " + audioList.SelectedRows[0].Cells[0].Value; + AudioTrack track = audioList.SelectedRows[0].DataBoundItem as AudioTrack; + if (track != null) + { + drp_audioTrack.SelectedItem = track.SourceTrack; + drp_audioEncoder.SelectedItem = EnumHelper.GetDescription(track.Encoder); + drp_audioMix.SelectedItem = EnumHelper.GetDescription(track.MixDown); + drp_audioSample.SelectedItem = track.SampleRate; + drp_audioBitrate.SelectedItem = track.Bitrate; + double drcValue = 0; + int drcCalculated; + if (track.DRC != 0) + drcValue = ((track.DRC * 10) + 1) - 10; + int.TryParse(drcValue.ToString(Culture), out drcCalculated); + tb_drc.Value = drcCalculated; + lbl_drc.Text = track.DRC.ToString(); + + AudioTrackGroup.Text = "Selected Track: " + track.SourceTrack; + } } else AudioTrackGroup.Text = "Selected Track: None (Click \"Add Track\" to add)"; @@ -310,7 +322,7 @@ namespace Handbrake.Controls /// /// The e. /// - private void btn_addAudioTrack_Click(object sender, EventArgs e) + private void AddAudioTrack_Click(object sender, EventArgs e) { if (drp_audioTrack.Text == "None Found") { @@ -322,21 +334,30 @@ namespace Handbrake.Controls return; } - double value = 0; + // Get Some Values + double drcValue = 0; if (tb_drc.Value != 0) - value = ((tb_drc.Value - 1) / 10.0) + 1; - - // Create a new row for the Audio list based on the currently selected items in the dropdown. - DataGridViewRow newTrack = new DataGridViewRow(); - newTrack.CreateCells(audioList); - newTrack.Cells[0].Value = GetNewID().ToString(); - newTrack.Cells[1].Value = drp_audioTrack.Text; - newTrack.Cells[2].Value = drp_audioEncoder.Text; - newTrack.Cells[3].Value = drp_audioMix.Text; - newTrack.Cells[4].Value = drp_audioSample.Text; - newTrack.Cells[5].Value = drp_audioBitrate.Text; - newTrack.Cells[6].Value = value.ToString(); - audioList.Rows.Add(newTrack); + drcValue = ((tb_drc.Value - 1) / 10.0) + 1; + + int bitrate; + double samplerate; + + int.TryParse(drp_audioBitrate.Text, out bitrate); + double.TryParse(drp_audioSample.Text, out samplerate); + + // Create the Model + AudioTrack track = new AudioTrack + { + SourceTrack = this.drp_audioTrack.Text, + Encoder = EnumHelper.GetValue(this.drp_audioEncoder.Text), + MixDown = EnumHelper.GetValue(this.drp_audioMix.Text), + SampleRate = samplerate, + Bitrate = bitrate, + Gain = 0, + DRC = drcValue + }; + + this.audioTracks.Add(track); // The Audio List has changed to raise the event. if (this.AudioListChanged != null) @@ -357,7 +378,7 @@ namespace Handbrake.Controls /// /// The e. /// - private void btn_RemoveAudioTrack_Click(object sender, EventArgs e) + private void RemoveAudioTrack_Click(object sender, EventArgs e) { RemoveTrack(); } @@ -375,7 +396,7 @@ namespace Handbrake.Controls /// /// The e. /// - private void audioList_moveup_Click(object sender, EventArgs e) + private void AudioList_moveup_Click(object sender, EventArgs e) { MoveTrack(true); } @@ -389,7 +410,7 @@ namespace Handbrake.Controls /// /// The e. /// - private void audioList_movedown_Click(object sender, EventArgs e) + private void AudioList_movedown_Click(object sender, EventArgs e) { MoveTrack(false); } @@ -403,7 +424,7 @@ namespace Handbrake.Controls /// /// The e. /// - private void audioList_remove_Click(object sender, EventArgs e) + private void AudioList_remove_Click(object sender, EventArgs e) { RemoveTrack(); } @@ -412,18 +433,20 @@ namespace Handbrake.Controls #region Private Functions - + /// + /// Attempt to automatically select the correct audio tracks based on the users settings. + /// private void AutomaticTrackSelection() { // Handle Native Language and "Dub Foreign language audio" and "Use Foreign language audio and Subtitles" Options if (Properties.Settings.Default.NativeLanguage == "Any") { drp_audioTrack.SelectedIndex = 0; - foreach (DataGridViewRow item in audioList.Rows) + foreach (AudioTrack track in this.audioTracks) { if (this.drp_audioTrack.SelectedItem != null) { - item.Cells[1].Value = this.drp_audioTrack.SelectedItem.ToString(); + track.SourceTrack = this.drp_audioTrack.SelectedItem.ToString(); } } } @@ -449,14 +472,14 @@ namespace Handbrake.Controls } if (drp_audioTrack.SelectedItem != null) - foreach (DataGridViewRow item in audioList.Rows) - item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString(); + foreach (AudioTrack track in this.audioTracks) + track.SourceTrack = drp_audioTrack.SelectedItem.ToString(); else { drp_audioTrack.SelectedIndex = 0; if (drp_audioTrack.SelectedItem != null) - foreach (DataGridViewRow item in audioList.Rows) - item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString(); + foreach (AudioTrack track in this.audioTracks) + track.SourceTrack = drp_audioTrack.SelectedItem.ToString(); } break; @@ -466,47 +489,24 @@ namespace Handbrake.Controls drp_audioTrack.SelectedIndex = 0; if (drp_audioTrack.SelectedItem != null) - foreach (DataGridViewRow item in audioList.Rows) - item.Cells[1].Value = drp_audioTrack.SelectedItem.ToString(); + foreach (AudioTrack track in this.audioTracks) + track.SourceTrack = drp_audioTrack.SelectedItem.ToString(); break; } } } - /// - /// Add track for preset - /// - /// - /// The item. - /// - private void AddTrackForPreset(DataGridViewRow item) - { - audioList.Rows.Add(item); - if (this.AudioListChanged != null) - this.AudioListChanged(this, new EventArgs()); - } - /// /// Clear the audio list /// private void ClearAudioList() { - audioList.Rows.Clear(); + this.audioTracks.Clear(); + if (this.AudioListChanged != null) this.AudioListChanged(this, new EventArgs()); } - /// - /// Get a new ID for the next audio track - /// - /// - /// an int - /// - private int GetNewID() - { - return audioList.Rows.Count + 1; - } - /// /// Remove an audio track from the list /// @@ -535,8 +535,6 @@ namespace Handbrake.Controls audioList.Select(); } - // Regenerate the ID numers - ReGenerateListIDs(); } } @@ -565,19 +563,6 @@ namespace Handbrake.Controls } } - /// - /// Regenerate all the audio track id's on the audio list - /// - private void ReGenerateListIDs() - { - int i = 1; - foreach (DataGridViewRow item in audioList.Rows) - { - item.Cells[0].Value = i.ToString(); - i++; - } - } - /// /// Set the bitrate dropdown /// diff --git a/win/CS/Controls/AudioPanel.resx b/win/CS/Controls/AudioPanel.resx index ac50d9273..f114f8606 100644 --- a/win/CS/Controls/AudioPanel.resx +++ b/win/CS/Controls/AudioPanel.resx @@ -123,9 +123,6 @@ 35, 17 - - True - True diff --git a/win/CS/Functions/QueryGenerator.cs b/win/CS/Functions/QueryGenerator.cs index 297b0ab44..e3f2e792c 100644 --- a/win/CS/Functions/QueryGenerator.cs +++ b/win/CS/Functions/QueryGenerator.cs @@ -9,9 +9,12 @@ namespace Handbrake.Functions using System.Collections.Generic; using System.Globalization; using System.IO; + using System.Linq; using System.Windows.Forms; using HandBrake.ApplicationServices; + using HandBrake.ApplicationServices.Functions; + using HandBrake.ApplicationServices.Model.Encoding; using HandBrake.ApplicationServices.Services; using HandBrake.ApplicationServices.Services.Interfaces; @@ -363,152 +366,53 @@ namespace Handbrake.Functions private static string AudioSettingsQuery(frmMain mainWindow) { - string query = string.Empty; - - DataGridView audioTracks = mainWindow.AudioSettings.GetAudioPanel(); - List tracks = new List(); - List codecs = new List(); - List mixdowns = new List(); - List samplerates = new List(); - List bitrates = new List(); - List drcs = new List(); - - // No Audio - if (audioTracks.Rows.Count == 0) - query += " -a none "; - - // Gather information about each audio track and store them in the declared lists. - foreach (DataGridViewRow row in audioTracks.Rows) + // Queries for each option + string tracks = string.Empty; + string encoders = string.Empty; + string mixdowns = string.Empty; + string samplerates = string.Empty; + string bitrates = string.Empty; + string drvValues = string.Empty; + string gainValues = string.Empty; + + // If we have no audio tracks, set the query to none + if (mainWindow.AudioSettings.AudioTracks.ToList().Count == 0) { - // Audio Track (-a) - if (row.Cells[1].Value.ToString() == "Automatic") - tracks.Add("1"); - else if (row.Cells[1].Value.ToString() != "None") - { - string[] tempSub = row.Cells[1].Value.ToString().Split(' '); - tracks.Add(tempSub[0]); - } - - // Audio Codec (-E) - if (row.Cells[2].Value.ToString() != String.Empty) - codecs.Add(GetAudioEncoder(row.Cells[2].Value.ToString())); - - // Audio Mixdown (-6) - if (row.Cells[3].Value.ToString() != String.Empty) - mixdowns.Add(GetMixDown(row.Cells[3].Value.ToString())); - - // Sample Rate (-R) - if (row.Cells[4].Value.ToString() != String.Empty) - samplerates.Add(row.Cells[4].Value.ToString()); - - // Audio Bitrate (-B) - if (row.Cells[5].Value.ToString() != String.Empty) - bitrates.Add(row.Cells[5].Value.ToString().Replace("Auto", "auto")); - - // DRC (-D) - if (row.Cells[6].Value.ToString() != String.Empty) - drcs.Add(row.Cells[6].Value.ToString()); + return " -a none"; } - // Audio Track (-a) - string audioItems = string.Empty; - bool firstLoop = true; - - foreach (string item in tracks) + // Generate the sub queries + foreach (AudioTrack audioTrack in mainWindow.AudioSettings.AudioTracks) { - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; - } - if (audioItems.Trim() != String.Empty) - query += " -a " + audioItems; - firstLoop = true; - audioItems = string.Empty; // Reset for another pass. + // Audio Track (-a) + string track = audioTrack.Track.HasValue ? audioTrack.Track.ToString() : "1"; // Default to "1" + tracks += string.IsNullOrEmpty(tracks) ? track : string.Format(",{0}", track); - // Audio Codec (-E) - foreach (string item in codecs) - { - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; - } - if (audioItems.Trim() != String.Empty) - query += " -E " + audioItems; - firstLoop = true; - audioItems = string.Empty; // Reset for another pass. + // Audio Encoder (-E) + encoders += string.IsNullOrEmpty(encoders) + ? GetAudioEncoder(EnumHelper.GetDescription(audioTrack.Encoder)) + : string.Format(",{0}", GetAudioEncoder(EnumHelper.GetDescription(audioTrack.Encoder))); - // Audio Mixdown (-6) - foreach (string item in mixdowns) - { - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; - } - if (audioItems.Trim() != String.Empty) - query += " -6 " + audioItems; - firstLoop = true; - audioItems = string.Empty; // Reset for another pass. + // Audio Mixdowns (-6) + mixdowns += string.IsNullOrEmpty(mixdowns) + ? GetMixDown(EnumHelper.GetDescription(audioTrack.MixDown)) + : string.Format(",{0}", GetMixDown(EnumHelper.GetDescription(audioTrack.MixDown))); - // Sample Rate (-R) - foreach (string item in samplerates) - { - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; - } - if (audioItems.Trim() != String.Empty) - query += " -R " + audioItems; - firstLoop = true; - audioItems = string.Empty; // Reset for another pass. + // Audio Samplerates (-R) + string rate = audioTrack.SampleRate == 0 ? "Auto" : audioTrack.SampleRate.ToString(); // Default to "Auto" + samplerates += string.IsNullOrEmpty(samplerates) ? rate : string.Format(",{0}", rate); - // Audio Bitrate (-B) - foreach (string item in bitrates) - { - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; - } - if (audioItems.Trim() != String.Empty) - query += " -B " + audioItems; - firstLoop = true; - audioItems = string.Empty; // Reset for another pass. + // Audio Bitrates (-B) + bitrates += string.IsNullOrEmpty(bitrates) ? audioTrack.Bitrate.ToString() : string.Format(",{0}", audioTrack.Bitrate); - // DRC (-D) - foreach (var itm in drcs) - { - string item = itm.ToString(new CultureInfo("en-US")); - if (firstLoop) - { - audioItems = item; - firstLoop = false; - } - else - audioItems += "," + item; + // Audio DRC Values + drvValues += string.IsNullOrEmpty(drvValues) ? audioTrack.DRC.ToString() : string.Format(",{0}", audioTrack.DRC); + + // Audio Gain Control + gainValues += string.IsNullOrEmpty(gainValues) ? audioTrack.Gain.ToString() : string.Format(",{0}", audioTrack.Gain); } - if (audioItems.Trim() != String.Empty) - query += " -D " + audioItems; - return query; + return string.Format(" -a {0} -E {1} -B {2} -6 {3} -R {4} -D {5} --gain={6}", tracks, encoders, bitrates, mixdowns, samplerates, drvValues, gainValues); } private static string ChapterMarkersQuery(frmMain mainWindow) diff --git a/win/CS/HandBrake.ApplicationServices/Converters/EnumToDescConverter.cs b/win/CS/HandBrake.ApplicationServices/Converters/EnumToDescConverter.cs new file mode 100644 index 000000000..a03a3f071 --- /dev/null +++ b/win/CS/HandBrake.ApplicationServices/Converters/EnumToDescConverter.cs @@ -0,0 +1,24 @@ +namespace HandBrake.ApplicationServices.Converters +{ + using System.ComponentModel; + using System; + + using HandBrake.ApplicationServices.Functions; + + public class EnumToDescConveter : EnumConverter + { + public EnumToDescConveter(Type type) + : base(type) + { + } + + public override object ConvertTo( + ITypeDescriptorContext context, + System.Globalization.CultureInfo culture, + object value, + Type destinationType) + { + return EnumHelper.GetDescription((Enum)value); + } + } +} diff --git a/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs b/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs index 0bbc746d7..657434f31 100644 --- a/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs +++ b/win/CS/HandBrake.ApplicationServices/Functions/EnumHelper.cs @@ -12,7 +12,10 @@ namespace HandBrake.ApplicationServices.Functions /// /// Enum Helpers /// - public class EnumHelper + /// + /// The Type Parameter + /// + public class EnumHelper { /// /// Get the description of an Enum @@ -23,7 +26,7 @@ namespace HandBrake.ApplicationServices.Functions /// /// The Description string /// - public static string GetDescription(Enum value) + public static string GetDescription(T value) { FieldInfo fieldInfo = value.GetType().GetField(value.ToString()); DescriptionAttribute[] attributes = @@ -31,5 +34,24 @@ namespace HandBrake.ApplicationServices.Functions typeof(DescriptionAttribute), false); return (attributes.Length > 0) ? attributes[0].Description : value.ToString(); } + + /// + /// Get the Enumeration for a given Enum Description + /// + /// The String description + /// The Enum Value + public static T GetValue(string description) + { + foreach (T val in Enum.GetValues(typeof(T))) + { + string currDescription = GetDescription(val); + if (currDescription == description) + { + return val; + } + } + + throw new ArgumentOutOfRangeException("The Description for the enum was not recognized."); + } } } diff --git a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj index fcfb2fe03..48a1eb08a 100644 --- a/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj +++ b/win/CS/HandBrake.ApplicationServices/HandBrake.ApplicationServices.csproj @@ -83,6 +83,7 @@ + diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs index 23d7d9e2f..716f539f8 100644 --- a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs +++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioEncoder.cs @@ -7,6 +7,9 @@ namespace HandBrake.ApplicationServices.Model.Encoding { using System.ComponentModel; + using HandBrake.ApplicationServices.Converters; + + [TypeConverter(typeof(EnumToDescConveter))] public enum AudioEncoder { [Description("AAC (faac)")] diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs index 440f72226..6e47d3421 100644 --- a/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs +++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/AudioTrack.cs @@ -16,17 +16,58 @@ namespace HandBrake.ApplicationServices.Model.Encoding public AudioTrack() { // Default Values - this.Track = 1; + this.Encoder = AudioEncoder.Faac; this.MixDown = Mixdown.DolbyProLogicII; this.SampleRate = 48; this.Bitrate = 160; this.DRC = 1; + this.SourceTrack = "Automatic"; } /// - /// Gets or sets Audio Track Name + /// Gets the Audio Track Name /// - public int Track { get; set; } + public int? Track + { + get + { + string[] tempSub = SourceTrack.Split(' '); + int value; + if (int.TryParse(tempSub[0], out value)) + { + return value; + } + return null; + } + } + + /// + /// Gets the The UI display value for sample rate + /// + public string SampleRateDisplayValue + { + get + { + return SampleRate == 0 ? "Auto" : SampleRate.ToString(); + } + } + + /// + /// Gets the The UI display value for bit rate + /// + public string BitRateDisplayValue + { + get + { + return Bitrate == 0 ? "Auto" : Bitrate.ToString(); + } + } + + /// + /// Gets or sets the Source Track + /// Used for display purposes only. + /// + public string SourceTrack { get; set; } /// /// Gets or sets Audio Mixdown @@ -52,5 +93,10 @@ namespace HandBrake.ApplicationServices.Model.Encoding /// Gets or sets Dynamic Range Compression /// public double DRC { get; set; } + + /// + /// Gets or sets the Gain for the audio track + /// + public int Gain { get; set; } } } \ No newline at end of file diff --git a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs index 12611b454..8b0cc9005 100644 --- a/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs +++ b/win/CS/HandBrake.ApplicationServices/Model/Encoding/Mixdown.cs @@ -7,9 +7,12 @@ namespace HandBrake.ApplicationServices.Model.Encoding { using System.ComponentModel; + using HandBrake.ApplicationServices.Converters; + /// /// The Mixdown Mode /// + [TypeConverter(typeof(EnumToDescConveter))] public enum Mixdown { [Description("Dolby Pro Logic II")] @@ -28,6 +31,12 @@ namespace HandBrake.ApplicationServices.Model.Encoding DolbySurround, [Description("6 Channel Discrete")] - SixChannelDiscrete + SixChannelDiscrete, + + [Description("AC3 Passthru")] + Ac3Passthrough, + + [Description("DTS Passthru")] + DtsPassthrough, } } diff --git a/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs b/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs index 1ac827037..5e7b89a10 100644 --- a/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs +++ b/win/CS/HandBrake.ApplicationServices/Parsing/Subtitle.cs @@ -5,6 +5,7 @@ namespace HandBrake.ApplicationServices.Parsing { + using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; @@ -75,7 +76,7 @@ namespace HandBrake.ApplicationServices.Parsing { get { - return EnumHelper.GetDescription(this.SubtitleType); + return EnumHelper.GetDescription(this.SubtitleType); } } diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs b/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs index 0a8aa72ec..752141bf0 100644 --- a/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs +++ b/win/CS/HandBrake.ApplicationServices/Utilities/PlistUtility.cs @@ -68,7 +68,7 @@ namespace HandBrake.ApplicationServices.Utilities track.SampleRate = double.Parse(value); break; case "AudioTrack": - track.Track = int.Parse(value); + track.SourceTrack = value; break; case "AudioTrackDRCSlider": track.DRC = double.Parse(value); @@ -528,7 +528,7 @@ namespace HandBrake.ApplicationServices.Utilities // Video Settings AddEncodeElement(xmlWriter, "VideoAvgBitrate", "string", parsed.VideoBitrate.ToString()); - AddEncodeElement(xmlWriter, "VideoEncoder", "string", EnumHelper.GetDescription(parsed.VideoEncoder)); + AddEncodeElement(xmlWriter, "VideoEncoder", "string", EnumHelper.GetDescription(parsed.VideoEncoder)); AddEncodeElement(xmlWriter, "VideoFramerate", "string", parsed.Framerate.ToString()); AddEncodeElement(xmlWriter, "VideFrameratePFR", "integer", parsed.FramerateMode == FramerateMode.PFR ? "1" : "0"); AddEncodeElement(xmlWriter, "VideoGrayScale", "integer", parsed.Grayscale ? "1" : "0"); @@ -636,10 +636,10 @@ namespace HandBrake.ApplicationServices.Utilities xmlWriter.WriteElementString("string", audioTrack.Bitrate.ToString()); xmlWriter.WriteElementString("key", "AudioEncoder"); - xmlWriter.WriteElementString("string", EnumHelper.GetDescription(audioTrack.Encoder)); + xmlWriter.WriteElementString("string", EnumHelper.GetDescription(audioTrack.Encoder)); xmlWriter.WriteElementString("key", "AudioMixdown"); - xmlWriter.WriteElementString("string", EnumHelper.GetDescription(audioTrack.MixDown)); + xmlWriter.WriteElementString("string", EnumHelper.GetDescription(audioTrack.MixDown)); xmlWriter.WriteElementString("key", "AudioSamplerate"); xmlWriter.WriteElementString("string", audioTrack.SampleRate.ToString()); diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/QueryGeneratorUtility.cs b/win/CS/HandBrake.ApplicationServices/Utilities/QueryGeneratorUtility.cs index ce963188f..bd75880b9 100644 --- a/win/CS/HandBrake.ApplicationServices/Utilities/QueryGeneratorUtility.cs +++ b/win/CS/HandBrake.ApplicationServices/Utilities/QueryGeneratorUtility.cs @@ -136,7 +136,7 @@ namespace HandBrake.ApplicationServices.Utilities { string query = string.Empty; - query += string.Format(" -f {0} ", EnumHelper.GetDescription(task.OutputFormat).ToLower()); + query += string.Format(" -f {0} ", EnumHelper.GetDescription(task.OutputFormat).ToLower()); // These are output settings features if (task.LargeFile) @@ -373,7 +373,12 @@ namespace HandBrake.ApplicationServices.Utilities // Gather information about each audio track and store them in the declared lists. foreach (AudioTrack track in audioTracks) { - tracks.Add(track.Track); + if (track.Track == null) + { + continue; + } + + tracks.Add(track.Track.Value); // Audio Codec (-E) codecs.Add(track.Encoder); diff --git a/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs b/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs index 856114bb0..4d34ac937 100644 --- a/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs +++ b/win/CS/HandBrake.ApplicationServices/Utilities/QueryParserUtility.cs @@ -359,7 +359,7 @@ namespace HandBrake.ApplicationServices.Utilities AudioTrack track = new AudioTrack(); if (trackData != null) if (trackData.Length >= (x + 1)) // Audio Track - track.Track = int.Parse(trackData[x].Trim()); + track.SourceTrack = trackData[x].Trim(); if (trackMixes != null) if (trackMixes.Length >= (x + 1)) // Audio Mix diff --git a/win/CS/frmQueue.cs b/win/CS/frmQueue.cs index e5b2d68d7..ee9dae04f 100644 --- a/win/CS/frmQueue.cs +++ b/win/CS/frmQueue.cs @@ -372,7 +372,7 @@ namespace Handbrake if (audio != string.Empty) audio += ", " + track.Encoder; else - audio = EnumHelper.GetDescription(track.Encoder); + audio = EnumHelper.GetDescription(track.Encoder); } item.SubItems.Add(audio); // Audio @@ -429,7 +429,7 @@ namespace Handbrake if (audio != string.Empty) audio += ", " + track.Encoder; else - audio = EnumHelper.GetDescription(track.Encoder); + audio = EnumHelper.GetDescription(track.Encoder); } // found query is a global varible -- 2.40.0