/// <summary>
        /// Updates listener state
        /// </summary>
        /// <param name="audioListener">Listener state</param>
        private void UpdateListener(GameAudioListener audioListener)
        {
            if (listener == null)
            {
                listener = new Listener();
            }

            listener.OrientFront = audioListener.Forward;
            listener.OrientTop   = audioListener.Up;
            listener.Position    = audioListener.Position;
            listener.Velocity    = audioListener.Velocity;

            if (audioListener.Cone.HasValue)
            {
                if (listener.Cone == null)
                {
                    listener.Cone = new Cone();
                }

                listener.Cone.InnerAngle  = audioListener.Cone.Value.InnerAngle;
                listener.Cone.InnerVolume = audioListener.Cone.Value.InnerVolume;
                listener.Cone.InnerLpf    = audioListener.Cone.Value.InnerLpf;
                listener.Cone.InnerReverb = audioListener.Cone.Value.InnerReverb;

                listener.Cone.OuterAngle  = audioListener.Cone.Value.OuterAngle;
                listener.Cone.OuterVolume = audioListener.Cone.Value.OuterVolume;
                listener.Cone.OuterLpf    = audioListener.Cone.Value.OuterLpf;
                listener.Cone.OuterReverb = audioListener.Cone.Value.OuterReverb;
            }
        }
        /// <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;
        }