using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using FMODUnity; using FMOD.Studio; namespace GamecraftModdingAPI.Utility { /// <summary> /// Common operations on audio objects /// </summary> public static class AudioTools { /// <summary> /// Retrieve the list of mixers (aka VCAs) /// </summary> /// <returns>The names of the mixers (without "vca:/")</returns> public static string[] GetMixers() { Bank masterBank; RuntimeManager.StudioSystem.getBank("bank:/Master Bank", out masterBank); VCA[] masterVCAs; int count; masterBank.getVCAList(out masterVCAs); masterBank.getVCACount(out count); string[] result = new string[count]; string path; for (int i = 0; i < count; i++) { masterVCAs[i].getPath(out path); result[i] = path.Replace("vca:/", ""); } return result; } /// <summary> /// Get the volume of an audio mixer /// </summary> /// <param name="mixer">The name of the mixer</param> /// <returns>The volume</returns> public static float GetVolume(string mixer) { float volume, finalVolume; RuntimeManager.GetVCA($"vca:/{mixer}").getVolume(out volume, out finalVolume); return volume; } /// <summary> /// Get the volume of an audio mixer at output time (this is influenced by the mixer volume and master volume) /// </summary> /// <param name="mixer">The name of the mixer</param> /// <returns>The final volume</returns> public static float GetVolumeOutput(string mixer) { float volume, finalVolume; RuntimeManager.GetVCA($"vca:/{mixer}").getVolume(out volume, out finalVolume); return finalVolume; } /// <summary> /// Set the volume of an audio mixer (like a VCA aka Voltage-Controlled Amplifier) /// </summary> /// <param name="volume">The volume from 0.0 to 1.0 (1.0+ is valid too)</param> /// <param name="mixer">The name of the mixer, as retrieved from GetMixers()</param> public static void SetVolume(float volume, string mixer) { RuntimeManager.GetVCA($"vca:/{mixer}").setVolume(volume); } /// <summary> /// Set the volume for all future audio /// </summary> /// <param name="volume">The volume from 0.0 to 1.0 (1.0+ is valid too)</param> public static void SetVolumeMaster(float volume) { RuntimeManager.GetBus("bus:/").setVolume(volume); } } }