public static void RemoveVirtualAudioListener(VirtualMultiAudioListener virtualAudioListener)
 {
     _virtualAudioListeners.Remove(virtualAudioListener);
     if (OnVirtualAudioListenerRemoved != null)
     {
         OnVirtualAudioListenerRemoved(virtualAudioListener);
     }
 }
        private void VirtualAudioListenerRemoved(VirtualMultiAudioListener virtualAudioListener)
        {
            var audioSource = _subAudioSources[virtualAudioListener];

            _subAudioSources.Remove(virtualAudioListener);

            if (audioSource != null)
            {
                MainMultiAudioListener.EnquequeAudioSourceInPool(audioSource);
            }
        }
 public static void AddVirtualAudioListener(VirtualMultiAudioListener virtualAudioListener)
 {
     if (_virtualAudioListeners.Contains(virtualAudioListener))
     {
         return;
     }
     _virtualAudioListeners.Add(virtualAudioListener);
     if (OnVirtualAudioListenerAdded != null)
     {
         OnVirtualAudioListenerAdded(virtualAudioListener);
     }
 }
        private void MoveSubAudioSourceToNeededLocation(VirtualMultiAudioListener virtualListener,
                                                        AudioSource subAudioSource)
        {
            //There is no main listener so translation is not needed
            if (MainMultiAudioListener.Main == null)
            {
                return;
            }

            //We calculate and translate the local pos of the audio from the virtual listener to the main listener
            var localPos = virtualListener.transform.InverseTransformPoint(transform.position);

            subAudioSource.transform.position = MainMultiAudioListener.Main.transform.TransformPoint(localPos);
        }
        private void CreateSubAudioSource(VirtualMultiAudioListener virtualAudioListener, ref bool hardWareChannelsLeft)
        {
            //Take time so that the new sub audio source starts at the correct time in the sound
            int timeSample = 0;

            if (_safetyAudioSource != null)
            {
                timeSample = _safetyAudioSource.timeSamples;
            }

            var audioSource = CreateAudioSource(timeSample, "Sub Audio Source", ref hardWareChannelsLeft);

            _subAudioSources.Add(virtualAudioListener, audioSource);
            audioSource.volume = Volume * virtualAudioListener.Volume;

            //Do transform
            MoveSubAudioSourceToNeededLocation(virtualAudioListener, audioSource);
            audioSource.playOnAwake = false;
        }
        private void VirtualAudioListenerAdded(VirtualMultiAudioListener virtualAudioListener)
        {
            bool hardwareChannelsLeft = true;

            CreateSubAudioSource(virtualAudioListener, ref hardwareChannelsLeft);
        }