/// <summary>
        /// Constructor
        /// </summary>
        /// <param name="soundEffect">Sound effect</param>
        /// <param name="sourceVoice">Source voice</param>
        /// <param name="emitterDescription">Emitter description</param>
        /// <param name="listenerDescription">Listener description</param>
        /// <param name="destroyWhenFinished">Sets whether the instance must be disposed after it's finished</param>
        internal GameAudioEffectInstance(
            GameAudioEffect soundEffect,
            SourceVoice sourceVoice,
            GameAudioSourceDescription emitterDescription,
            GameAudioSourceDescription listenerDescription,
            bool destroyWhenFinished)
        {
            Effect       = soundEffect;
            voice        = sourceVoice;
            paused       = false;
            IsLooped     = false;
            volume       = 1.0f;
            pan          = 0.0f;
            pitch        = 0.0f;
            outputMatrix = null;

            Emitter  = new GameAudioEmitter(emitterDescription);
            Listener = new GameAudioListener(listenerDescription);

            voice.BufferStart += SourceVoice_BufferStart;
            voice.BufferEnd   += SourceVoice_BufferEnd;
            voice.LoopEnd     += SourceVoice_LoopEnd;

            this.destroyWhenFinished = destroyWhenFinished;
        }
        /// <summary>
        /// Updates emitter state
        /// </summary>
        /// <param name="audioEmitter">Emitter state</param>
        private void UpdateEmitter(GameAudioEmitter audioEmitter)
        {
            if (emitter == null)
            {
                emitter = new Emitter();
            }

            emitter.Position    = audioEmitter.Position;
            emitter.OrientFront = audioEmitter.Forward;
            emitter.OrientTop   = audioEmitter.Up;
            emitter.Velocity    = audioEmitter.Velocity;

            emitter.ChannelCount  = this.Effect.WaveFormat.Channels;
            emitter.ChannelRadius = 1;
            if (emitter.ChannelCount > 1)
            {
                emitter.ChannelAzimuths = new float[emitter.ChannelCount];
            }

            emitter.InnerRadius      = 2;
            emitter.InnerRadiusAngle = MathUtil.PiOverFour;

            emitter.VolumeCurve = GameAudioPresets.DefaultLinearCurve;
            emitter.LfeCurve    = GameAudioPresets.DefaultEmitterLfeCurve;
            emitter.ReverbCurve = GameAudioPresets.DefaultEmitterReverbCurve;

            emitter.CurveDistanceScaler = GameAudio.DistanceScale * audioEmitter.Radius;
            emitter.DopplerScaler       = GameAudio.DopplerScale;

            if (audioEmitter.Cone.HasValue)
            {
                if (emitter.Cone == null)
                {
                    emitter.Cone = new Cone();
                }

                emitter.Cone.InnerAngle  = audioEmitter.Cone.Value.InnerAngle;
                emitter.Cone.InnerVolume = audioEmitter.Cone.Value.InnerVolume;
                emitter.Cone.InnerLpf    = audioEmitter.Cone.Value.InnerLpf;
                emitter.Cone.InnerReverb = audioEmitter.Cone.Value.InnerReverb;

                emitter.Cone.OuterAngle  = audioEmitter.Cone.Value.OuterAngle;
                emitter.Cone.OuterVolume = audioEmitter.Cone.Value.OuterVolume;
                emitter.Cone.OuterLpf    = audioEmitter.Cone.Value.OuterLpf;
                emitter.Cone.OuterReverb = audioEmitter.Cone.Value.OuterReverb;
            }
        }