// --------------------------------------------------------------------------------------------------------------------
//
// 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
}
}