/// <summary>
    /// Fades primary theme with secondary theme
    /// </summary>
    /// <param name="hash"></param>
    //public void PlaySecondaryMusic(string hash, bool loop = true, bool startsMuted = false, Vector3 position = default(Vector3))
    //{
    //    //if (activeSecondaryMusicAudioSource.Source == null)
    //    //    BuildSecondaryMusicSource();

    //    //if (activeSecondaryMusicAudioSource.clip == musicList[hash])
    //    //    return;

    //    //get music object, set the audio clip to it and save reference
    //    AudioSerial audioToPlay = musicList[hash];
    //    activeSecondaryMusicAudioSource.Source.Stop();
    //    activeSecondaryMusicAudioSource.Source.clip = audioToPlay.source;
    //    activeSecondaryMusicAudioSource.Source.priority = 0;
    //    activeSecondaryMusicAudioSource.Source.volume = startsMuted ? 0 : musicVolume * audioToPlay._relativeVolume;
    //    activeSecondaryMusicAudioSource.Source.loop = loop;
    //    activeSecondaryMusicAudioSource.Source.maxDistance = maxHearingDistance;
    //    activeSecondaryMusicAudioSource.Source.Play();
    //    //Debug.Log("Playing secondary");
    //    activeSecondaryMusicAudioHash = hash;

    //    activeSecondaryMusicAudioSource.Serial = audioToPlay;
    //    _currentMusicAudio = activeSecondaryMusicAudioSource;
    //    if (_isLoggingAudio)
    //    {
    //        if (OnLogAudio != null)
    //            OnLogAudio(hash, 2, loop, Time.time);
    //    }

    //    //_secondarySnap.TransitionTo(_toSecondaryTransitionTime);
    //}

    //public void TransitionToMainSnapshot()
    //{
    //    _mainSnap.TransitionTo(_toMainTransitionTime);
    //    //StopCoroutine("StopSecondaryMusicIn");
    //    //StartCoroutine("StopSecondaryMusicIn", _toMainTransitionTime);
    //}

    //public void TransitionToSlomoSnapshot()
    //{
    //    _slowMotionSnapShot.TransitionTo(_toSlomoTime);
    //}

    //IEnumerator StopSecondaryMusicIn(float time)
    //{
    //    yield return new WaitForSeconds(time);
    //    if (activeSecondaryMusicAudioSource.Source != null)
    //    {
    //        activeSecondaryMusicAudioSource.Source.Stop();
    //        Debug.Log("SEcondary music stopped");
    //    }

    //}

    public AudioSource PlaySFX(string hash, bool loop, Transform parent, bool singleInstance = false, float addedRandomPitch = 0, float addedPitch = 0)
    {
        if (hash == "")
        {
            return(null);
        }

        if (singleInstance)
        {
            StopSFX(hash, true);
        }

        if (!sfxList.ContainsKey(hash))
        {
            return(null);
        }

        AudioDetails audioDetail = new AudioDetails();

        //get new audiosource object, set the clip and properties and save reference
        AudioSerial audioToPlay = sfxList[hash];

        GameObject sfxObj = new GameObject(hash); //TODO: once a pool is made, get gameobject from pool instead of creating new

        sfxObj.transform.parent        = parent;
        sfxObj.transform.localPosition = Vector3.zero;
        AudioSource source = sfxObj.AddComponent <AudioSource>();

        source.GetComponent <AudioSource>().clip = audioToPlay.source;
        source.volume                = audioToPlay._relativeVolume * sfxVolume;
        source.loop                  = loop;
        source.minDistance           = maxHearingDistance;
        source.maxDistance           = maxHearingDistance;
        source.pitch                += (Random.value - 0.5f) * 2 * addedRandomPitch + addedPitch;
        source.dopplerLevel          = 0f; //sets doppler to 0 to cancel pitch distortions on movement
        source.outputAudioMixerGroup = _sfxMixerGroup;
        if (parent == null)
        {
            DontDestroyOnLoad(source.gameObject);
        }
        source.Play();

        if (_isLoggingAudio)
        {
            if (OnLogAudio != null)
            {
                OnLogAudio(hash, 1, loop, Time.time);
            }
        }

        audioDetail.Source = source;
        audioDetail.Serial = audioToPlay;
        activeSFXAudioSources.Add(audioDetail);
        return(source);
    }
    public void PlayMusic(string hash, bool loop = true, MusicMixerGroup group = MusicMixerGroup.DEFAULT_LOW, bool fadeToSnapshot = false, Vector3 position = default(Vector3))
    {
        Debug.Log("Playing song " + hash);
        if (hash == null || !musicList.ContainsKey(hash))
        {
            return;
        }

        AudioDetails musicDetail = activeMusicAudioSource;

        switch (group)
        {
        case MusicMixerGroup.DEFAULT_LOW:
            Debug.Log("set as low");
            musicDetail = activeMusicAudioSource;
            break;

        case MusicMixerGroup.DEFAULT_HIGH:
            Debug.Log("set as high");
            musicDetail = activeSecondaryMusicAudioSource;
            break;

        case MusicMixerGroup.PAUSE:
            Debug.Log("set as pause");
            musicDetail = pauseMusicSource;
            break;
        }

        if (musicDetail.Source.clip == null || musicDetail.Source.clip != musicList[hash].source)
        {
            Debug.Log("music source set to " + musicDetail.Source.name);
            //get music object, set the audio clip to it and save reference
            AudioSerial audioToPlay = musicList[hash];
            musicDetail.Source.Stop();
            musicDetail.Source.clip        = audioToPlay.source;
            musicDetail.Source.priority    = 0;
            musicDetail.Source.volume      = musicVolume * audioToPlay._relativeVolume;
            musicDetail.Source.loop        = loop;
            musicDetail.Source.maxDistance = maxHearingDistance;
            musicDetail.Source.Play();
            musicDetail.Serial   = musicList[hash];
            activeMusicAudioHash = hash;
        }


        if (_currentMusicAudio != null && fadeToSnapshot && _currentMusicAudio.Source.clip != musicDetail.Source.clip)
        {
            CrossFade(_currentMusicAudio, musicDetail, _fadeTime);
        }

        _currentMusicAudio = musicDetail;


        //_currentMusicSourceVolume = musicVolume * audioToPlay._relativeVolume;
        if (_isLoggingAudio)
        {
            if (OnLogAudio != null)
            {
                OnLogAudio(hash, 0, loop, Time.time);
            }
        }
    }