|
- using System;
- using System.Reflection;
-
- using FMOD.Studio;
- using FMODUnity;
- using RobocraftX.Common.Audio;
- using Unity.Mathematics;
-
- namespace GamecraftModdingAPI.Utility
- {
- public class Audio
- {
- private EventInstance sound;
-
- public Audio(string uri) : this(RuntimeManager.PathToGUID(uri))
- {
- }
-
- public Audio(Guid uri)
- {
- sound = RuntimeManager.CreateInstance(uri);
- }
-
- public static Audio Random()
- {
- System.Random potato = new System.Random();
- FieldInfo[] options = typeof(FMODAudioEvents).GetFields();
- Guid audio_uri;
- while (true)
- {
- int index = potato.Next(0, options.Length);
- try
- {
- audio_uri = (Guid)options[index].GetValue(null);
- break;
- }
- catch (InvalidCastException) { }
- }
- return new Audio(audio_uri);
- }
-
- public float this[string key]
- {
- get
- {
- sound.getParameterValue(key, out float val, out float finalVal);
- return val;
- }
-
- set => sound.setParameterValue(key, value);
- }
-
- public float this[int index]
- {
- get
- {
- sound.getParameterValueByIndex(index, out float val, out float finalVal);
- return val;
- }
-
- set => sound.setParameterValueByIndex(index, value);
- }
-
- public string[] Parameters
- {
- get
- {
- sound.getParameterCount(out int count);
- string[] parameters = new string[count];
- for (int i = 0; i < count; i++)
- {
- sound.getParameterByIndex(i, out ParameterInstance param);
- param.getDescription(out PARAMETER_DESCRIPTION desc);
- parameters[i] = desc.name;
- }
- return parameters;
- }
- }
-
- public float3 Position
- {
- get
- {
- sound.get3DAttributes(out FMOD.ATTRIBUTES_3D attr);
- return new float3(attr.position.x, attr.position.y, attr.position.z);
- }
-
- set => sound.set3DAttributes(RuntimeUtils.To3DAttributes(value));
- }
-
- public void Play()
- {
- sound.start();
- }
-
- public void Stop(FMOD.Studio.STOP_MODE mode = FMOD.Studio.STOP_MODE.IMMEDIATE)
- {
- sound.stop(mode);
- }
-
- ~Audio() // Use the wannabe C++ destructor to destroy the C++ object
- {
- sound.release();
- }
- }
- }
|