using Unity.BossRoom.Utils;
using UnityEngine;
using UnityEngine.Audio;
namespace Unity.BossRoom.Audio
{
///
/// Initializes the game's AudioMixer to use volumes stored in preferences. Provides
/// a public function that can be called when these values change.
///
public class AudioMixerConfigurator : MonoBehaviour
{
[SerializeField]
private AudioMixer m_Mixer;
[SerializeField]
private string m_MixerVarMainVolume = "OverallVolume";
[SerializeField]
private string m_MixerVarMusicVolume = "MusicVolume";
public static AudioMixerConfigurator Instance { get; private set; }
///
/// The audio sliders use a value between 0.0001 and 1, but the mixer works in decibels -- by default, -80 to 0.
/// To convert, we use log10(slider) multiplied by 20. Why 20? because log10(.0001)*20=-80, which is the
/// bottom range for our mixer, meaning it's disabled.
///
private const float k_VolumeLog10Multiplier = 20;
private void Awake()
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
private void Start()
{
// note that trying to configure the AudioMixer during Awake does not work, must be initialized in Start
Configure();
}
public void Configure()
{
m_Mixer.SetFloat(m_MixerVarMainVolume, GetVolumeInDecibels(ClientPrefs.GetMasterVolume()));
m_Mixer.SetFloat(m_MixerVarMusicVolume, GetVolumeInDecibels(ClientPrefs.GetMusicVolume()));
}
private float GetVolumeInDecibels(float volume)
{
if (volume <= 0) // sanity-check in case we have bad prefs data
{
volume = 0.0001f;
}
return Mathf.Log10(volume) * k_VolumeLog10Multiplier;
}
}
}