UP-Viagg-io/Viagg-io/Assets/Plugins/FMOD/src/RuntimeUtils.cs

629 lines
20 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace FMOD
{
[Serializable]
public partial struct GUID : IEquatable<GUID>
{
public GUID(Guid guid)
{
byte[] bytes = guid.ToByteArray();
Data1 = BitConverter.ToInt32(bytes, 0);
Data2 = BitConverter.ToInt32(bytes, 4);
Data3 = BitConverter.ToInt32(bytes, 8);
Data4 = BitConverter.ToInt32(bytes, 12);
}
public static GUID Parse(string s)
{
return new GUID(new Guid(s));
}
public bool IsNull
{
get
{
return Data1 == 0
&& Data2 == 0
&& Data3 == 0
&& Data4 == 0;
}
}
public override bool Equals(object other)
{
return (other is GUID) && Equals((GUID)other);
}
public bool Equals(GUID other)
{
return Data1 == other.Data1
&& Data2 == other.Data2
&& Data3 == other.Data3
&& Data4 == other.Data4;
}
public static bool operator==(GUID a, GUID b)
{
return a.Equals(b);
}
public static bool operator!=(GUID a, GUID b)
{
return !a.Equals(b);
}
public override int GetHashCode()
{
return Data1 ^ Data2 ^ Data3 ^ Data4;
}
public static implicit operator Guid(GUID guid)
{
return new Guid(guid.Data1,
(short) ((guid.Data2 >> 0) & 0xFFFF),
(short) ((guid.Data2 >> 16) & 0xFFFF),
(byte) ((guid.Data3 >> 0) & 0xFF),
(byte) ((guid.Data3 >> 8) & 0xFF),
(byte) ((guid.Data3 >> 16) & 0xFF),
(byte) ((guid.Data3 >> 24) & 0xFF),
(byte) ((guid.Data4 >> 0) & 0xFF),
(byte) ((guid.Data4 >> 8) & 0xFF),
(byte) ((guid.Data4 >> 16) & 0xFF),
(byte) ((guid.Data4 >> 24) & 0xFF)
);
}
public override string ToString()
{
return ((Guid)this).ToString("B");
}
}
}
namespace FMODUnity
{
public class EventNotFoundException : Exception
{
public FMOD.GUID Guid;
public string Path;
public EventNotFoundException(string path)
: base("[FMOD] Event not found: '" + path + "'")
{
Path = path;
}
public EventNotFoundException(FMOD.GUID guid)
: base("[FMOD] Event not found: " + guid)
{
Guid = guid;
}
public EventNotFoundException(EventReference eventReference)
: base("[FMOD] Event not found: " + eventReference.ToString())
{
Guid = eventReference.Guid;
#if UNITY_EDITOR
Path = eventReference.Path;
#endif
}
}
public class BusNotFoundException : Exception
{
public string Path;
public BusNotFoundException(string path)
: base("[FMOD] Bus not found '" + path + "'")
{
Path = path;
}
}
public class VCANotFoundException : Exception
{
public string Path;
public VCANotFoundException(string path)
: base("[FMOD] VCA not found '" + path + "'")
{
Path = path;
}
}
public class BankLoadException : Exception
{
public string Path;
public FMOD.RESULT Result;
public BankLoadException(string path, FMOD.RESULT result)
: base(string.Format("[FMOD] Could not load bank '{0}' : {1} : {2}", path, result.ToString(), FMOD.Error.String(result)))
{
Path = path;
Result = result;
}
public BankLoadException(string path, string error)
: base(string.Format("[FMOD] Could not load bank '{0}' : {1}", path, error))
{
Path = path;
Result = FMOD.RESULT.ERR_INTERNAL;
}
}
public class SystemNotInitializedException : Exception
{
public FMOD.RESULT Result;
public string Location;
public SystemNotInitializedException(FMOD.RESULT result, string location)
: base(string.Format("[FMOD] Initialization failed : {2} : {0} : {1}", result.ToString(), FMOD.Error.String(result), location))
{
Result = result;
Location = location;
}
public SystemNotInitializedException(Exception inner)
: base("[FMOD] Initialization failed", inner)
{
}
}
public enum EmitterGameEvent : int
{
None,
ObjectStart,
ObjectDestroy,
TriggerEnter,
TriggerExit,
TriggerEnter2D,
TriggerExit2D,
CollisionEnter,
CollisionExit,
CollisionEnter2D,
CollisionExit2D,
ObjectEnable,
ObjectDisable,
ObjectMouseEnter,
ObjectMouseExit,
ObjectMouseDown,
ObjectMouseUp,
UIMouseEnter,
UIMouseExit,
UIMouseDown,
UIMouseUp,
}
public enum LoaderGameEvent : int
{
None,
ObjectStart,
ObjectDestroy,
TriggerEnter,
TriggerExit,
TriggerEnter2D,
TriggerExit2D,
ObjectEnable,
ObjectDisable,
}
// We use our own enum to avoid serialization issues if FMOD.THREAD_TYPE changes
public enum ThreadType
{
Mixer,
Feeder,
Stream,
File,
Nonblocking,
Record,
Geometry,
Profiler,
Studio_Update,
Studio_Load_Bank,
Studio_Load_Sample,
Convolution_1,
Convolution_2,
}
// We use our own enum to avoid serialization issues if FMOD.THREAD_AFFINITY changes
[Flags]
public enum ThreadAffinity : uint
{
Any = 0,
Core0 = 1 << 0,
Core1 = 1 << 1,
Core2 = 1 << 2,
Core3 = 1 << 3,
Core4 = 1 << 4,
Core5 = 1 << 5,
Core6 = 1 << 6,
Core7 = 1 << 7,
Core8 = 1 << 8,
Core9 = 1 << 9,
Core10 = 1 << 10,
Core11 = 1 << 11,
Core12 = 1 << 12,
Core13 = 1 << 13,
Core14 = 1 << 14,
Core15 = 1 << 15,
}
// Using a separate enum to avoid serialization issues if FMOD.SOUND_TYPE changes.
public enum CodecType : int
{
FADPCM,
Vorbis,
AT9,
XMA,
Opus
}
[Serializable]
public class ThreadAffinityGroup
{
public List<ThreadType> threads = new List<ThreadType>();
public ThreadAffinity affinity = ThreadAffinity.Any;
public ThreadAffinityGroup()
{
}
public ThreadAffinityGroup(ThreadAffinityGroup other)
{
threads = new List<ThreadType>(other.threads);
affinity = other.affinity;
}
public ThreadAffinityGroup(ThreadAffinity affinity, params ThreadType[] threads)
{
this.threads = new List<ThreadType>(threads);
this.affinity = affinity;
}
}
[Serializable]
public class CodecChannelCount
{
public CodecType format;
public int channels;
public CodecChannelCount() { }
public CodecChannelCount(CodecChannelCount other)
{
format = other.format;
channels = other.channels;
}
}
public static class RuntimeUtils
{
#if UNITY_EDITOR
private static string pluginBasePath;
public const string BaseFolderGUID = "06ae579381df01a4a87bb149dec89954";
public const string PluginBasePathDefault = "Assets/Plugins/FMOD";
public static string PluginBasePath
{
get
{
if (pluginBasePath == null)
{
pluginBasePath = AssetDatabase.GUIDToAssetPath(BaseFolderGUID);
if (string.IsNullOrEmpty(pluginBasePath))
{
pluginBasePath = PluginBasePathDefault;
DebugLogWarningFormat("FMOD: Couldn't find base folder with GUID {0}; defaulting to {1}",
BaseFolderGUID, pluginBasePath);
}
}
return pluginBasePath;
}
}
#endif
public static string GetCommonPlatformPath(string path)
{
if (string.IsNullOrEmpty(path))
{
return path;
}
return path.Replace('\\', '/');
}
public static FMOD.VECTOR ToFMODVector(this Vector3 vec)
{
FMOD.VECTOR temp;
temp.x = vec.x;
temp.y = vec.y;
temp.z = vec.z;
return temp;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(this Vector3 pos)
{
FMOD.ATTRIBUTES_3D attributes = new FMOD.ATTRIBUTES_3D();
attributes.forward = ToFMODVector(Vector3.forward);
attributes.up = ToFMODVector(Vector3.up);
attributes.position = ToFMODVector(pos);
return attributes;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(this Transform transform)
{
FMOD.ATTRIBUTES_3D attributes = new FMOD.ATTRIBUTES_3D();
attributes.forward = transform.forward.ToFMODVector();
attributes.up = transform.up.ToFMODVector();
attributes.position = transform.position.ToFMODVector();
return attributes;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(this Transform transform, Vector3 velocity)
{
FMOD.ATTRIBUTES_3D attributes = new FMOD.ATTRIBUTES_3D();
attributes.forward = transform.forward.ToFMODVector();
attributes.up = transform.up.ToFMODVector();
attributes.position = transform.position.ToFMODVector();
attributes.velocity = velocity.ToFMODVector();
return attributes;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(this GameObject go)
{
return go.transform.To3DAttributes();
}
#if UNITY_PHYSICS_EXIST
public static FMOD.ATTRIBUTES_3D To3DAttributes(Transform transform, Rigidbody rigidbody = null)
{
FMOD.ATTRIBUTES_3D attributes = transform.To3DAttributes();
if (rigidbody)
{
#if UNITY_6000_0_OR_NEWER
attributes.velocity = rigidbody.linearVelocity.ToFMODVector();
#else
attributes.velocity = rigidbody.velocity.ToFMODVector();
#endif
}
return attributes;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(GameObject go, Rigidbody rigidbody)
{
FMOD.ATTRIBUTES_3D attributes = go.transform.To3DAttributes();
if (rigidbody)
{
#if UNITY_6000_0_OR_NEWER
attributes.velocity = rigidbody.linearVelocity.ToFMODVector();
#else
attributes.velocity = rigidbody.velocity.ToFMODVector();
#endif
}
return attributes;
}
#endif
#if UNITY_PHYSICS2D_EXIST
public static FMOD.ATTRIBUTES_3D To3DAttributes(Transform transform, Rigidbody2D rigidbody)
{
FMOD.ATTRIBUTES_3D attributes = transform.To3DAttributes();
if (rigidbody)
{
FMOD.VECTOR vel;
#if UNITY_6000_1_OR_NEWER
vel.x = rigidbody.linearVelocity.x;
vel.y = rigidbody.linearVelocity.y;
#else
#pragma warning disable CS0618
vel.x = rigidbody.velocity.x;
vel.y = rigidbody.velocity.y;
#pragma warning restore CS0618
#endif
vel.z = 0;
attributes.velocity = vel;
}
return attributes;
}
public static FMOD.ATTRIBUTES_3D To3DAttributes(GameObject go, Rigidbody2D rigidbody)
{
FMOD.ATTRIBUTES_3D attributes = go.transform.To3DAttributes();
if (rigidbody)
{
FMOD.VECTOR vel;
#if UNITY_6000_1_OR_NEWER
vel.x = rigidbody.linearVelocity.x;
vel.y = rigidbody.linearVelocity.y;
#else
#pragma warning disable CS0618
vel.x = rigidbody.velocity.x;
vel.y = rigidbody.velocity.y;
#pragma warning restore CS0618
#endif
vel.z = 0;
attributes.velocity = vel;
}
return attributes;
}
#endif
public static FMOD.THREAD_TYPE ToFMODThreadType(ThreadType threadType)
{
switch (threadType)
{
case ThreadType.Mixer:
return FMOD.THREAD_TYPE.MIXER;
case ThreadType.Feeder:
return FMOD.THREAD_TYPE.FEEDER;
case ThreadType.Stream:
return FMOD.THREAD_TYPE.STREAM;
case ThreadType.File:
return FMOD.THREAD_TYPE.FILE;
case ThreadType.Nonblocking:
return FMOD.THREAD_TYPE.NONBLOCKING;
case ThreadType.Record:
return FMOD.THREAD_TYPE.RECORD;
case ThreadType.Geometry:
return FMOD.THREAD_TYPE.GEOMETRY;
case ThreadType.Profiler:
return FMOD.THREAD_TYPE.PROFILER;
case ThreadType.Studio_Update:
return FMOD.THREAD_TYPE.STUDIO_UPDATE;
case ThreadType.Studio_Load_Bank:
return FMOD.THREAD_TYPE.STUDIO_LOAD_BANK;
case ThreadType.Studio_Load_Sample:
return FMOD.THREAD_TYPE.STUDIO_LOAD_SAMPLE;
case ThreadType.Convolution_1:
return FMOD.THREAD_TYPE.CONVOLUTION1;
case ThreadType.Convolution_2:
return FMOD.THREAD_TYPE.CONVOLUTION2;
default:
throw new ArgumentException("Unrecognised thread type '" + threadType.ToString() + "'");
}
}
public static string DisplayName(this ThreadType thread)
{
return thread.ToString().Replace('_', ' ');
}
public static FMOD.THREAD_AFFINITY ToFMODThreadAffinity(ThreadAffinity affinity)
{
FMOD.THREAD_AFFINITY fmodAffinity = FMOD.THREAD_AFFINITY.CORE_ALL;
SetFMODAffinityBit(affinity, ThreadAffinity.Core0, FMOD.THREAD_AFFINITY.CORE_0, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core1, FMOD.THREAD_AFFINITY.CORE_1, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core2, FMOD.THREAD_AFFINITY.CORE_2, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core3, FMOD.THREAD_AFFINITY.CORE_3, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core4, FMOD.THREAD_AFFINITY.CORE_4, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core5, FMOD.THREAD_AFFINITY.CORE_5, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core6, FMOD.THREAD_AFFINITY.CORE_6, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core7, FMOD.THREAD_AFFINITY.CORE_7, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core8, FMOD.THREAD_AFFINITY.CORE_8, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core9, FMOD.THREAD_AFFINITY.CORE_9, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core10, FMOD.THREAD_AFFINITY.CORE_10, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core11, FMOD.THREAD_AFFINITY.CORE_11, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core12, FMOD.THREAD_AFFINITY.CORE_12, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core13, FMOD.THREAD_AFFINITY.CORE_13, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core14, FMOD.THREAD_AFFINITY.CORE_14, ref fmodAffinity);
SetFMODAffinityBit(affinity, ThreadAffinity.Core15, FMOD.THREAD_AFFINITY.CORE_15, ref fmodAffinity);
return fmodAffinity;
}
private static void SetFMODAffinityBit(ThreadAffinity affinity, ThreadAffinity mask,
FMOD.THREAD_AFFINITY fmodMask, ref FMOD.THREAD_AFFINITY fmodAffinity)
{
if ((affinity & mask) != 0)
{
fmodAffinity |= fmodMask;
}
}
public static void EnforceLibraryOrder()
{
// Call a function in fmod.dll to make sure it's loaded before fmodstudio.dll
int temp1, temp2;
FMOD.Memory.GetStats(out temp1, out temp2);
FMOD.GUID temp3;
FMOD.Studio.Util.parseID("", out temp3);
}
public static void DebugLog(string message)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel == FMOD.DEBUG_FLAGS.LOG)
{
Debug.Log(message);
}
}
public static void DebugLogFormat(string format, params object[] args)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel == FMOD.DEBUG_FLAGS.LOG)
{
Debug.LogFormat(format, args);
}
}
public static void DebugLogWarning(string message)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel >= FMOD.DEBUG_FLAGS.WARNING)
{
Debug.LogWarning(message);
}
}
public static void DebugLogWarningFormat(string format, params object[] args)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel >= FMOD.DEBUG_FLAGS.WARNING)
{
Debug.LogWarningFormat(format, args);
}
}
public static void DebugLogError(string message)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel >= FMOD.DEBUG_FLAGS.ERROR)
{
Debug.LogError(message);
}
}
public static void DebugLogErrorFormat(string format, params object[] args)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel >= FMOD.DEBUG_FLAGS.ERROR)
{
Debug.LogErrorFormat(format, args);
}
}
public static void DebugLogException(Exception e)
{
if (!Settings.IsInitialized() || Settings.Instance.LoggingLevel >= FMOD.DEBUG_FLAGS.ERROR)
{
Debug.LogException(e);
}
}
#if UNITY_EDITOR
public static string WritableAssetPath(string subPath)
{
if (RuntimeUtils.PluginBasePath.StartsWith("Assets/"))
{
return $"{RuntimeUtils.PluginBasePath}/{subPath}.asset";
}
else
{
return $"Assets/Plugins/FMOD/{subPath}.asset";
}
}
#endif
}
}