// -------------------------------------------------------------------------------------------------------------------- // // This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License. // // // An Audio Track for the Audio Panel // // -------------------------------------------------------------------------------------------------------------------- namespace HandBrake.ApplicationServices.Model.Encoding { using System; using System.ComponentModel; using System.Globalization; using Caliburn.Micro; using HandBrake.ApplicationServices.Parsing; using HandBrake.ApplicationServices.Utilities; using HandBrake.Interop.Model.Encoding; /// /// An Audio Track for the Audio Panel /// public class AudioTrack : PropertyChangedBase { #region Constants and Fields /// /// The bitrate. /// private int bitrate; /// /// The DRC Value /// private double drc; /// /// The encoder. /// private AudioEncoder encoder; /// /// The gain value /// private int gain; /// /// The mix down. /// private Mixdown mixDown; /// /// The sample rate. /// private double sampleRate; /// /// The Scanned Audio Track /// [NonSerialized] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] private Audio scannedTrack; /// /// The is default. /// private bool isDefault; #endregion #region Constructors and Destructors /// /// Initializes a new instance of the class. /// public AudioTrack() { // Default Values this.Encoder = AudioEncoder.ffaac; this.MixDown = Mixdown.DolbyProLogicII; this.SampleRate = 48; this.Bitrate = 160; this.DRC = 0; this.ScannedTrack = new Audio(); this.TrackName = string.Empty; } /// /// Initializes a new instance of the class. /// Copy Constructor /// /// /// The track. /// public AudioTrack(AudioTrack track) { this.bitrate = track.Bitrate; this.drc = track.DRC; this.encoder = track.Encoder; this.gain = track.Gain; this.mixDown = track.MixDown; this.sampleRate = track.SampleRate; this.scannedTrack = track.ScannedTrack ?? new Audio(); this.TrackName = track.TrackName; } #endregion #region Public Properties /// /// Gets AudioEncoderDisplayValue. /// public string AudioEncoderDisplayValue { get { return EnumHelper.GetDisplay(this.Encoder); } } /// /// Gets AudioMixdownDisplayValue. /// public string AudioMixdownDisplayValue { get { return EnumHelper.GetDisplay(this.MixDown); } } /// /// Gets the The UI display value for bit rate /// public string BitRateDisplayValue { get { if (this.Encoder == AudioEncoder.Ac3Passthrough || this.Encoder == AudioEncoder.DtsPassthrough || this.Encoder == AudioEncoder.DtsHDPassthrough) { return "Auto"; } return this.Bitrate.ToString(); } } /// /// Gets or sets Audio Bitrate /// public int Bitrate { get { return this.bitrate; } set { this.bitrate = value; this.NotifyOfPropertyChange(() => this.Bitrate); } } /// /// Gets or sets Dynamic Range Compression /// public double DRC { get { return this.drc; } set { if (!object.Equals(value, this.drc)) { this.drc = value; this.NotifyOfPropertyChange(() => this.DRC); } } } /// /// Gets or sets a value indicating whether is default. /// public bool IsDefault { get { return this.isDefault; } set { this.isDefault = value; } } /// /// Gets or sets Audio Encoder /// public AudioEncoder Encoder { get { return this.encoder; } set { this.encoder = value; this.NotifyOfPropertyChange(() => this.Encoder); this.NotifyOfPropertyChange(() => this.IsPassthru); this.NotifyOfPropertyChange(() => this.CannotSetBitrate); this.NotifyOfPropertyChange(() => this.TrackReference); } } /// /// Gets or sets the Gain for the audio track /// public int Gain { get { return this.gain; } set { if (!object.Equals(value, this.gain)) { this.gain = value; this.NotifyOfPropertyChange(() => this.Gain); } } } /// /// Gets or sets Audio Mixdown /// public Mixdown MixDown { get { return this.mixDown; } set { this.mixDown = value; this.NotifyOfPropertyChange(() => this.MixDown); this.NotifyOfPropertyChange(() => this.TrackReference); } } /// /// Gets or sets Audio SampleRate /// public double SampleRate { get { return this.sampleRate; } set { this.sampleRate = value; this.NotifyOfPropertyChange(() => this.SampleRate); this.NotifyOfPropertyChange(() => this.TrackReference); } } /// /// Gets or sets the The UI display value for sample rate /// public string SampleRateDisplayValue { get { return this.SampleRate == 0 ? "Auto" : this.SampleRate.ToString(CultureInfo.InvariantCulture); } set { // TODO change this to be a converted field if (string.IsNullOrEmpty(value)) { return; } double samplerate; double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out samplerate); this.SampleRate = samplerate; } } /// /// Gets or sets the Scanned Audio Tracks /// [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public Audio ScannedTrack { get { return this.scannedTrack; } set { this.scannedTrack = value; this.NotifyOfPropertyChange(() => this.ScannedTrack); } } /// /// Gets the Audio Track Name /// public int? Track { get { if (this.ScannedTrack != null) { return this.ScannedTrack.TrackNumber; } return null; } } /// /// Gets a value indicating whether IsPassthru. /// public bool IsPassthru { get { if (this.Encoder == AudioEncoder.Ac3Passthrough || this.Encoder == AudioEncoder.DtsPassthrough || this.Encoder == AudioEncoder.DtsHDPassthrough || this.Encoder == AudioEncoder.AacPassthru || this.Encoder == AudioEncoder.Mp3Passthru || this.Encoder == AudioEncoder.Passthrough) { return true; } return false; } } /// /// Gets a value indicating whether can set bitrate. /// public bool CannotSetBitrate { get { return this.IsPassthru || this.Encoder == AudioEncoder.ffflac || this.Encoder == AudioEncoder.ffflac24; } } /// /// Gets a value indicating whether IsLossless. /// public bool IsLossless { get { return this.IsPassthru || this.Encoder == AudioEncoder.ffflac || this.Encoder == AudioEncoder.ffflac24; } } /// /// Gets TrackReference. /// public AudioTrack TrackReference { get { return this; } } /// /// Gets or sets the track name. /// public string TrackName { get; set; } #endregion } }