/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 * 
 *  http://aws.amazon.com/apache2.0
 * 
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

/*
 * Do not modify this file. This file is generated from the mediaconvert-2017-08-29.normal.json service model.
 */
using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using System.Net;

using Amazon.Runtime;
using Amazon.Runtime.Internal;

namespace Amazon.MediaConvert.Model
{
    /// <summary>
    /// Use Audio selectors to specify a track or set of tracks from the input that you will
    /// use in your outputs. You can use multiple Audio selectors per input.
    /// </summary>
    public partial class AudioSelector
    {
        private AudioDurationCorrection _audioDurationCorrection;
        private string _customLanguageCode;
        private AudioDefaultSelection _defaultSelection;
        private string _externalAudioFileInput;
        private HlsRenditionGroupSettings _hlsRenditionGroupSettings;
        private LanguageCode _languageCode;
        private int? _offset;
        private List<int> _pids = new List<int>();
        private int? _programSelection;
        private RemixSettings _remixSettings;
        private AudioSelectorType _selectorType;
        private List<int> _tracks = new List<int>();

        /// <summary>
        /// Gets and sets the property AudioDurationCorrection. Apply audio timing corrections
        /// to help synchronize audio and video in your output. To apply timing corrections, your
        /// input must meet the following requirements: * Container: MP4, or MOV, with an accurate
        /// time-to-sample (STTS) table. * Audio track: AAC. Choose from the following audio timing
        /// correction settings: * Disabled (Default): Apply no correction. * Auto: Recommended
        /// for most inputs. MediaConvert analyzes the audio timing in your input and determines
        /// which correction setting to use, if needed. * Track: Adjust the duration of each audio
        /// frame by a constant amount to align the audio track length with STTS duration. Track-level
        /// correction does not affect pitch, and is recommended for tonal audio content such
        /// as music. * Frame: Adjust the duration of each audio frame by a variable amount to
        /// align audio frames with STTS timestamps. No corrections are made to already-aligned
        /// frames. Frame-level correction may affect the pitch of corrected frames, and is recommended
        /// for atonal audio content such as speech or percussion.
        /// </summary>
        public AudioDurationCorrection AudioDurationCorrection
        {
            get { return this._audioDurationCorrection; }
            set { this._audioDurationCorrection = value; }
        }

        // Check to see if AudioDurationCorrection property is set
        internal bool IsSetAudioDurationCorrection()
        {
            return this._audioDurationCorrection != null;
        }

        /// <summary>
        /// Gets and sets the property CustomLanguageCode. Selects a specific language code from
        /// within an audio source, using the ISO 639-2 or ISO 639-3 three-letter language code
        /// </summary>
        [AWSProperty(Min=3, Max=3)]
        public string CustomLanguageCode
        {
            get { return this._customLanguageCode; }
            set { this._customLanguageCode = value; }
        }

        // Check to see if CustomLanguageCode property is set
        internal bool IsSetCustomLanguageCode()
        {
            return this._customLanguageCode != null;
        }

        /// <summary>
        /// Gets and sets the property DefaultSelection. Enable this setting on one audio selector
        /// to set it as the default for the job. The service uses this default for outputs where
        /// it can't find the specified input audio. If you don't set a default, those outputs
        /// have no audio.
        /// </summary>
        public AudioDefaultSelection DefaultSelection
        {
            get { return this._defaultSelection; }
            set { this._defaultSelection = value; }
        }

        // Check to see if DefaultSelection property is set
        internal bool IsSetDefaultSelection()
        {
            return this._defaultSelection != null;
        }

        /// <summary>
        /// Gets and sets the property ExternalAudioFileInput. Specifies audio data from an external
        /// file source.
        /// </summary>
        public string ExternalAudioFileInput
        {
            get { return this._externalAudioFileInput; }
            set { this._externalAudioFileInput = value; }
        }

        // Check to see if ExternalAudioFileInput property is set
        internal bool IsSetExternalAudioFileInput()
        {
            return this._externalAudioFileInput != null;
        }

        /// <summary>
        /// Gets and sets the property HlsRenditionGroupSettings. Settings specific to audio sources
        /// in an HLS alternate rendition group. Specify the properties (renditionGroupId, renditionName
        /// or renditionLanguageCode) to identify the unique audio track among the alternative
        /// rendition groups present in the HLS manifest. If no unique track is found, or multiple
        /// tracks match the properties provided, the job fails. If no properties in hlsRenditionGroupSettings
        /// are specified, the default audio track within the video segment is chosen. If there
        /// is no audio within video segment, the alternative audio with DEFAULT=YES is chosen
        /// instead.
        /// </summary>
        public HlsRenditionGroupSettings HlsRenditionGroupSettings
        {
            get { return this._hlsRenditionGroupSettings; }
            set { this._hlsRenditionGroupSettings = value; }
        }

        // Check to see if HlsRenditionGroupSettings property is set
        internal bool IsSetHlsRenditionGroupSettings()
        {
            return this._hlsRenditionGroupSettings != null;
        }

        /// <summary>
        /// Gets and sets the property LanguageCode. Selects a specific language code from within
        /// an audio source.
        /// </summary>
        public LanguageCode LanguageCode
        {
            get { return this._languageCode; }
            set { this._languageCode = value; }
        }

        // Check to see if LanguageCode property is set
        internal bool IsSetLanguageCode()
        {
            return this._languageCode != null;
        }

        /// <summary>
        /// Gets and sets the property Offset. Specifies a time delta in milliseconds to offset
        /// the audio from the input video.
        /// </summary>
        [AWSProperty(Min=-2147483648, Max=2147483647)]
        public int Offset
        {
            get { return this._offset.GetValueOrDefault(); }
            set { this._offset = value; }
        }

        // Check to see if Offset property is set
        internal bool IsSetOffset()
        {
            return this._offset.HasValue; 
        }

        /// <summary>
        /// Gets and sets the property Pids. Selects a specific PID from within an audio source
        /// (e.g. 257 selects PID 0x101).
        /// </summary>
        public List<int> Pids
        {
            get { return this._pids; }
            set { this._pids = value; }
        }

        // Check to see if Pids property is set
        internal bool IsSetPids()
        {
            return this._pids != null && this._pids.Count > 0; 
        }

        /// <summary>
        /// Gets and sets the property ProgramSelection. Use this setting for input streams that
        /// contain Dolby E, to have the service extract specific program data from the track.
        /// To select multiple programs, create multiple selectors with the same Track and different
        /// Program numbers. In the console, this setting is visible when you set Selector type
        /// to Track. Choose the program number from the dropdown list. If your input file has
        /// incorrect metadata, you can choose All channels instead of a program number to have
        /// the service ignore the program IDs and include all the programs in the track.
        /// </summary>
        [AWSProperty(Min=0, Max=8)]
        public int ProgramSelection
        {
            get { return this._programSelection.GetValueOrDefault(); }
            set { this._programSelection = value; }
        }

        // Check to see if ProgramSelection property is set
        internal bool IsSetProgramSelection()
        {
            return this._programSelection.HasValue; 
        }

        /// <summary>
        /// Gets and sets the property RemixSettings. Use these settings to reorder the audio
        /// channels of one input to match those of another input. This allows you to combine
        /// the two files into a single output, one after the other.
        /// </summary>
        public RemixSettings RemixSettings
        {
            get { return this._remixSettings; }
            set { this._remixSettings = value; }
        }

        // Check to see if RemixSettings property is set
        internal bool IsSetRemixSettings()
        {
            return this._remixSettings != null;
        }

        /// <summary>
        /// Gets and sets the property SelectorType. Specifies the type of the audio selector.
        /// </summary>
        public AudioSelectorType SelectorType
        {
            get { return this._selectorType; }
            set { this._selectorType = value; }
        }

        // Check to see if SelectorType property is set
        internal bool IsSetSelectorType()
        {
            return this._selectorType != null;
        }

        /// <summary>
        /// Gets and sets the property Tracks. Identify a track from the input audio to include
        /// in this selector by entering the track index number. To include several tracks in
        /// a single audio selector, specify multiple tracks as follows. Using the console, enter
        /// a comma-separated list. For example, type "1,2,3" to include tracks 1 through 3.
        /// </summary>
        public List<int> Tracks
        {
            get { return this._tracks; }
            set { this._tracks = value; }
        }

        // Check to see if Tracks property is set
        internal bool IsSetTracks()
        {
            return this._tracks != null && this._tracks.Count > 0; 
        }

    }
}