/* ======================================================================================== */ /* FMOD Studio API - C# wrapper. */ /* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2025. */ /* */ /* For more detail visit: */ /* https://fmod.com/docs/2.03/api/studio-api.html */ /* ======================================================================================== */ using Ghost.FMOD.Core; using System.Runtime.InteropServices; namespace Ghost.FMOD.Studio { public partial class STUDIO_VERSION { public const string DLL = "fmodstudio"; } public enum STOP_MODE : int { ALLOWFADEOUT, IMMEDIATE, } public enum LOADING_STATE : int { UNLOADING, UNLOADED, LOADING, LOADED, ERROR, } [StructLayout(LayoutKind.Sequential)] public struct PROGRAMMER_SOUND_PROPERTIES { public StringWrapper name; public IntPtr sound; public int subsoundIndex; } [StructLayout(LayoutKind.Sequential)] public struct TIMELINE_MARKER_PROPERTIES { public StringWrapper name; public int position; } [StructLayout(LayoutKind.Sequential)] public struct TIMELINE_BEAT_PROPERTIES { public int bar; public int beat; public int position; public float tempo; public int timesignatureupper; public int timesignaturelower; } [StructLayout(LayoutKind.Sequential)] public struct TIMELINE_NESTED_BEAT_PROPERTIES { public GUID eventid; public TIMELINE_BEAT_PROPERTIES properties; } [StructLayout(LayoutKind.Sequential)] public struct ADVANCEDSETTINGS { public int cbsize; public int commandqueuesize; public int handleinitialsize; public int studioupdateperiod; public int idlesampledatapoolsize; public int streamingscheduledelay; public IntPtr encryptionkey; } [StructLayout(LayoutKind.Sequential)] public struct CPU_USAGE { public float update; } [StructLayout(LayoutKind.Sequential)] public struct BUFFER_INFO { public int currentusage; public int peakusage; public int capacity; public int stallcount; public float stalltime; } [StructLayout(LayoutKind.Sequential)] public struct BUFFER_USAGE { public BUFFER_INFO studiocommandqueue; public BUFFER_INFO studiohandle; } [StructLayout(LayoutKind.Sequential)] public struct BANK_INFO { public int size; public IntPtr userdata; public int userdatalength; public FILE_OPEN_CALLBACK opencallback; public FILE_CLOSE_CALLBACK closecallback; public FILE_READ_CALLBACK readcallback; public FILE_SEEK_CALLBACK seekcallback; } [Flags] public enum SYSTEM_CALLBACK_TYPE : uint { PREUPDATE = 0x00000001, POSTUPDATE = 0x00000002, BANK_UNLOAD = 0x00000004, LIVEUPDATE_CONNECTED = 0x00000008, LIVEUPDATE_DISCONNECTED = 0x00000010, ALL = 0xFFFFFFFF, } public delegate RESULT SYSTEM_CALLBACK(IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata, IntPtr userdata); public enum PARAMETER_TYPE : int { GAME_CONTROLLED, AUTOMATIC_DISTANCE, AUTOMATIC_EVENT_CONE_ANGLE, AUTOMATIC_EVENT_ORIENTATION, AUTOMATIC_DIRECTION, AUTOMATIC_ELEVATION, AUTOMATIC_LISTENER_ORIENTATION, AUTOMATIC_SPEED, AUTOMATIC_SPEED_ABSOLUTE, AUTOMATIC_DISTANCE_NORMALIZED, MAX } [Flags] public enum PARAMETER_FLAGS : uint { READONLY = 0x00000001, AUTOMATIC = 0x00000002, GLOBAL = 0x00000004, DISCRETE = 0x00000008, LABELED = 0x00000010, } [StructLayout(LayoutKind.Sequential)] public struct PARAMETER_ID { public uint data1; public uint data2; } [StructLayout(LayoutKind.Sequential)] public struct PARAMETER_DESCRIPTION { public StringWrapper name; public PARAMETER_ID id; public float minimum; public float maximum; public float defaultvalue; public PARAMETER_TYPE type; public PARAMETER_FLAGS flags; public GUID guid; } // This is only need for loading memory and given our C# wrapper LOAD_MEMORY_POINT isn't feasible anyway enum LOAD_MEMORY_MODE : int { LOAD_MEMORY, LOAD_MEMORY_POINT, } enum LOAD_MEMORY_ALIGNMENT : int { VALUE = 32 } [StructLayout(LayoutKind.Sequential)] public struct SOUND_INFO { public IntPtr name_or_data; public MODE mode; public CREATESOUNDEXINFO exinfo; public int subsoundindex; public string name { get { using (var encoding = StringHelper.GetFreeHelper()) { return ((mode & (MODE.OPENMEMORY | MODE.OPENMEMORY_POINT)) == 0) ? encoding.stringFromNative(name_or_data) : String.Empty; } } } } public enum USER_PROPERTY_TYPE : int { INTEGER, BOOLEAN, FLOAT, STRING, } [StructLayout(LayoutKind.Sequential)] public struct USER_PROPERTY { public StringWrapper name; public USER_PROPERTY_TYPE type; private Union_IntBoolFloatString value; public int intValue() { return (type == USER_PROPERTY_TYPE.INTEGER) ? value.intvalue : -1; } public bool boolValue() { return (type == USER_PROPERTY_TYPE.BOOLEAN) ? value.boolvalue : false; } public float floatValue() { return (type == USER_PROPERTY_TYPE.FLOAT) ? value.floatvalue : -1; } public string stringValue() { return (type == USER_PROPERTY_TYPE.STRING) ? value.stringvalue : ""; } }; [StructLayout(LayoutKind.Explicit)] struct Union_IntBoolFloatString { [FieldOffset(0)] public int intvalue; [FieldOffset(0)] public bool boolvalue; [FieldOffset(0)] public float floatvalue; [FieldOffset(0)] public StringWrapper stringvalue; } [Flags] public enum INITFLAGS : uint { NORMAL = 0x00000000, LIVEUPDATE = 0x00000001, ALLOW_MISSING_PLUGINS = 0x00000002, SYNCHRONOUS_UPDATE = 0x00000004, DEFERRED_CALLBACKS = 0x00000008, LOAD_FROM_UPDATE = 0x00000010, MEMORY_TRACKING = 0x00000020, } [Flags] public enum LOAD_BANK_FLAGS : uint { NORMAL = 0x00000000, NONBLOCKING = 0x00000001, DECOMPRESS_SAMPLES = 0x00000002, UNENCRYPTED = 0x00000004, } [Flags] public enum COMMANDCAPTURE_FLAGS : uint { NORMAL = 0x00000000, FILEFLUSH = 0x00000001, SKIP_INITIAL_STATE = 0x00000002, } [Flags] public enum COMMANDREPLAY_FLAGS : uint { NORMAL = 0x00000000, SKIP_CLEANUP = 0x00000001, FAST_FORWARD = 0x00000002, SKIP_BANK_LOAD = 0x00000004, } public enum PLAYBACK_STATE : int { PLAYING, SUSTAINING, STOPPED, STARTING, STOPPING, } public enum EVENT_PROPERTY : int { CHANNELPRIORITY, SCHEDULE_DELAY, SCHEDULE_LOOKAHEAD, MINIMUM_DISTANCE, MAXIMUM_DISTANCE, COOLDOWN, MAX }; [StructLayout(LayoutKind.Sequential)] public struct PLUGIN_INSTANCE_PROPERTIES { public IntPtr name; public IntPtr dsp; } [Flags] public enum EVENT_CALLBACK_TYPE : uint { CREATED = 0x00000001, DESTROYED = 0x00000002, STARTING = 0x00000004, STARTED = 0x00000008, RESTARTED = 0x00000010, STOPPED = 0x00000020, START_FAILED = 0x00000040, CREATE_PROGRAMMER_SOUND = 0x00000080, DESTROY_PROGRAMMER_SOUND = 0x00000100, PLUGIN_CREATED = 0x00000200, PLUGIN_DESTROYED = 0x00000400, TIMELINE_MARKER = 0x00000800, TIMELINE_BEAT = 0x00001000, SOUND_PLAYED = 0x00002000, SOUND_STOPPED = 0x00004000, REAL_TO_VIRTUAL = 0x00008000, VIRTUAL_TO_REAL = 0x00010000, START_EVENT_COMMAND = 0x00020000, NESTED_TIMELINE_BEAT = 0x00040000, ALL = 0xFFFFFFFF, } public delegate RESULT EVENT_CALLBACK(EVENT_CALLBACK_TYPE type, IntPtr _event, IntPtr parameters); public delegate RESULT COMMANDREPLAY_FRAME_CALLBACK(IntPtr replay, int commandindex, float currenttime, IntPtr userdata); public delegate RESULT COMMANDREPLAY_LOAD_BANK_CALLBACK(IntPtr replay, int commandindex, GUID bankguid, IntPtr bankfilename, LOAD_BANK_FLAGS flags, out IntPtr bank, IntPtr userdata); public delegate RESULT COMMANDREPLAY_CREATE_INSTANCE_CALLBACK(IntPtr replay, int commandindex, IntPtr eventdescription, out IntPtr instance, IntPtr userdata); public enum INSTANCETYPE : int { NONE, SYSTEM, EVENTDESCRIPTION, EVENTINSTANCE, PARAMETERINSTANCE, BUS, VCA, BANK, COMMANDREPLAY, } [StructLayout(LayoutKind.Sequential)] public struct COMMAND_INFO { public StringWrapper commandname; public int parentcommandindex; public int framenumber; public float frametime; public INSTANCETYPE instancetype; public INSTANCETYPE outputtype; public UInt32 instancehandle; public UInt32 outputhandle; } [StructLayout(LayoutKind.Sequential)] public struct MEMORY_USAGE { public int exclusive; public int inclusive; public int sampledata; } public struct Util { public static RESULT parseID(string idString, out GUID id) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_ParseID(encoder.byteFromStringUTF8(idString), out id); } } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_ParseID(byte[] idString, out GUID id); #endregion } public struct System { // Initialization / system functions. public static RESULT create(out System system) { return FMOD_Studio_System_Create(out system.handle, VERSION.NUMBER); } public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings) { settings.cbsize = Marshal.SizeOf(); return FMOD_Studio_System_SetAdvancedSettings(this.handle, ref settings); } public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings, string encryptionKey) { using (var encoder = StringHelper.GetFreeHelper()) { var userKey = settings.encryptionkey; settings.encryptionkey = encoder.intptrFromStringUTF8(encryptionKey); var result = setAdvancedSettings(settings); settings.encryptionkey = userKey; return result; } } public RESULT getAdvancedSettings(out ADVANCEDSETTINGS settings) { settings.cbsize = Marshal.SizeOf(); return FMOD_Studio_System_GetAdvancedSettings(this.handle, out settings); } public RESULT initialize(int maxchannels, INITFLAGS studioflags, INITFLAGS flags, IntPtr extradriverdata) { return FMOD_Studio_System_Initialize(this.handle, maxchannels, studioflags, flags, extradriverdata); } public RESULT release() { return FMOD_Studio_System_Release(this.handle); } public RESULT update() { return FMOD_Studio_System_Update(this.handle); } public RESULT getCoreSystem(out System coresystem) { return FMOD_Studio_System_GetCoreSystem(this.handle, out coresystem.handle); } public RESULT getEvent(string path, out EventDescription _event) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_GetEvent(this.handle, encoder.byteFromStringUTF8(path), out _event.handle); } } public RESULT getBus(string path, out Bus bus) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_GetBus(this.handle, encoder.byteFromStringUTF8(path), out bus.handle); } } public RESULT getVCA(string path, out VCA vca) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_GetVCA(this.handle, encoder.byteFromStringUTF8(path), out vca.handle); } } public RESULT getBank(string path, out Bank bank) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_GetBank(this.handle, encoder.byteFromStringUTF8(path), out bank.handle); } } public RESULT getEventByID(GUID id, out EventDescription _event) { return FMOD_Studio_System_GetEventByID(this.handle, ref id, out _event.handle); } public RESULT getBusByID(GUID id, out Bus bus) { return FMOD_Studio_System_GetBusByID(this.handle, ref id, out bus.handle); } public RESULT getVCAByID(GUID id, out VCA vca) { return FMOD_Studio_System_GetVCAByID(this.handle, ref id, out vca.handle); } public RESULT getBankByID(GUID id, out Bank bank) { return FMOD_Studio_System_GetBankByID(this.handle, ref id, out bank.handle); } public RESULT getSoundInfo(string key, out SOUND_INFO info) { using var encoder = StringHelper.GetFreeHelper(); return FMOD_Studio_System_GetSoundInfo(this.handle, encoder.byteFromStringUTF8(key), out info); } public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) { using var encoder = StringHelper.GetFreeHelper(); return FMOD_Studio_System_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); } public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) { return FMOD_Studio_System_GetParameterDescriptionByID(this.handle, id, out parameter); } public RESULT getParameterLabelByName(string name, int labelindex, out string? label) { label = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var nameBytes = encoder.byteFromStringUTF8(name); var result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out var retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { label = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string? label) { label = null; using (var encoder = StringHelper.GetFreeHelper()) { var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_System_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { label = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } } public RESULT getParameterByID(PARAMETER_ID id, out float value) { float finalValue; return getParameterByID(id, out value, out finalValue); } public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) { return FMOD_Studio_System_GetParameterByID(this.handle, id, out value, out finalvalue); } public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) { return FMOD_Studio_System_SetParameterByID(this.handle, id, value, ignoreseekspeed); } public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); } } public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) { return FMOD_Studio_System_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); } public RESULT getParameterByName(string name, out float value) { float finalValue; return getParameterByName(name, out value, out finalValue); } public RESULT getParameterByName(string name, out float value, out float finalvalue) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); } } public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); } } public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), labelEncoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); } } public RESULT lookupID(string path, out GUID id) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_LookupID(this.handle, encoder.byteFromStringUTF8(path), out id); } } public RESULT lookupPath(GUID id, out string? path) { path = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_System_LookupPath(this.handle, ref id, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getNumListeners(out int numlisteners) { return FMOD_Studio_System_GetNumListeners(this.handle, out numlisteners); } public RESULT setNumListeners(int numlisteners) { return FMOD_Studio_System_SetNumListeners(this.handle, numlisteners); } public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes) { return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, IntPtr.Zero); } public RESULT getListenerAttributes(int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition) { return FMOD_Studio_System_GetListenerAttributes(this.handle, listener, out attributes, out attenuationposition); } public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes) { return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, IntPtr.Zero); } public RESULT setListenerAttributes(int listener, ATTRIBUTES_3D attributes, VECTOR attenuationposition) { return FMOD_Studio_System_SetListenerAttributes(this.handle, listener, ref attributes, ref attenuationposition); } public RESULT getListenerWeight(int listener, out float weight) { return FMOD_Studio_System_GetListenerWeight(this.handle, listener, out weight); } public RESULT setListenerWeight(int listener, float weight) { return FMOD_Studio_System_SetListenerWeight(this.handle, listener, weight); } public RESULT loadBankFile(string filename, LOAD_BANK_FLAGS flags, out Bank bank) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_LoadBankFile(this.handle, encoder.byteFromStringUTF8(filename), flags, out bank.handle); } } public RESULT loadBankMemory(byte[] buffer, LOAD_BANK_FLAGS flags, out Bank bank) { // Manually pin the byte array. It's what the marshaller should do anyway but don't leave it to chance. var pinnedArray = GCHandle.Alloc(buffer, GCHandleType.Pinned); var pointer = pinnedArray.AddrOfPinnedObject(); var result = FMOD_Studio_System_LoadBankMemory(this.handle, pointer, buffer.Length, LOAD_MEMORY_MODE.LOAD_MEMORY, flags, out bank.handle); pinnedArray.Free(); return result; } public RESULT loadBankCustom(BANK_INFO info, LOAD_BANK_FLAGS flags, out Bank bank) { info.size = Marshal.SizeOf(); return FMOD_Studio_System_LoadBankCustom(this.handle, ref info, flags, out bank.handle); } public RESULT unloadAll() { return FMOD_Studio_System_UnloadAll(this.handle); } public RESULT flushCommands() { return FMOD_Studio_System_FlushCommands(this.handle); } public RESULT flushSampleLoading() { return FMOD_Studio_System_FlushSampleLoading(this.handle); } public RESULT startCommandCapture(string filename, COMMANDCAPTURE_FLAGS flags) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_StartCommandCapture(this.handle, encoder.byteFromStringUTF8(filename), flags); } } public RESULT stopCommandCapture() { return FMOD_Studio_System_StopCommandCapture(this.handle); } public RESULT loadCommandReplay(string filename, COMMANDREPLAY_FLAGS flags, out CommandReplay replay) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_System_LoadCommandReplay(this.handle, encoder.byteFromStringUTF8(filename), flags, out replay.handle); } } public RESULT getBankCount(out int count) { return FMOD_Studio_System_GetBankCount(this.handle, out count); } public RESULT getBankList(out Bank[]? array) { array = null; RESULT result; result = FMOD_Studio_System_GetBankCount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new Bank[0]; return result; } var rawArray = new IntPtr[capacity]; result = FMOD_Studio_System_GetBankList(this.handle, rawArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount > capacity) // More items added since we queried just now? { actualCount = capacity; } array = new Bank[actualCount]; for (var i = 0; i < actualCount; ++i) { array[i].handle = rawArray[i]; } return RESULT.OK; } public RESULT getParameterDescriptionCount(out int count) { return FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out count); } public RESULT getParameterDescriptionList(out PARAMETER_DESCRIPTION[]? array) { array = null; var result = FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new PARAMETER_DESCRIPTION[0]; return RESULT.OK; } var tempArray = new PARAMETER_DESCRIPTION[capacity]; result = FMOD_Studio_System_GetParameterDescriptionList(this.handle, tempArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount != capacity) { Array.Resize(ref tempArray, actualCount); } array = tempArray; return RESULT.OK; } public RESULT getCPUUsage(out CPU_USAGE usage, out CPU_USAGE usage_core) { return FMOD_Studio_System_GetCPUUsage(this.handle, out usage, out usage_core); } public RESULT getBufferUsage(out BUFFER_USAGE usage) { return FMOD_Studio_System_GetBufferUsage(this.handle, out usage); } public RESULT resetBufferUsage() { return FMOD_Studio_System_ResetBufferUsage(this.handle); } public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) { return FMOD_Studio_System_SetCallback(this.handle, callback, callbackmask); } public RESULT getUserData(out IntPtr userdata) { return FMOD_Studio_System_GetUserData(this.handle, out userdata); } public RESULT setUserData(IntPtr userdata) { return FMOD_Studio_System_SetUserData(this.handle, userdata); } public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) { return FMOD_Studio_System_GetMemoryUsage(this.handle, out memoryusage); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_Create(out IntPtr system, uint headerversion); [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_System_IsValid(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetAdvancedSettings(IntPtr system, ref ADVANCEDSETTINGS settings); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetAdvancedSettings(IntPtr system, out ADVANCEDSETTINGS settings); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_Initialize(IntPtr system, int maxchannels, INITFLAGS studioflags, INITFLAGS flags, IntPtr extradriverdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_Release(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_Update(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetCoreSystem(IntPtr system, out IntPtr coresystem); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetEvent(IntPtr system, byte[] path, out IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBus(IntPtr system, byte[] path, out IntPtr bus); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetVCA(IntPtr system, byte[] path, out IntPtr vca); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBank(IntPtr system, byte[] path, out IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetEventByID(IntPtr system, ref GUID id, out IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBusByID(IntPtr system, ref GUID id, out IntPtr bus); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetVCAByID(IntPtr system, ref GUID id, out IntPtr vca); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBankByID(IntPtr system, ref GUID id, out IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetSoundInfo(IntPtr system, byte[] key, out SOUND_INFO info); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByName(IntPtr system, byte[] name, out PARAMETER_DESCRIPTION parameter); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterDescriptionByID(IntPtr system, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterLabelByName(IntPtr system, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterLabelByID(IntPtr system, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterByID(IntPtr system, PARAMETER_ID id, out float value, out float finalvalue); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetParameterByID(IntPtr system, PARAMETER_ID id, float value, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetParameterByIDWithLabel(IntPtr system, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetParametersByIDs(IntPtr system, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterByName(IntPtr system, byte[] name, out float value, out float finalvalue); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetParameterByName(IntPtr system, byte[] name, float value, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetParameterByNameWithLabel(IntPtr system, byte[] name, byte[] label, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LookupID(IntPtr system, byte[] path, out GUID id); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LookupPath(IntPtr system, ref GUID id, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetNumListeners(IntPtr system, out int numlisteners); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetNumListeners(IntPtr system, int numlisteners); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetListenerAttributes(IntPtr system, int listener, out ATTRIBUTES_3D attributes, IntPtr zero); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetListenerAttributes(IntPtr system, int listener, out ATTRIBUTES_3D attributes, out VECTOR attenuationposition); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetListenerAttributes(IntPtr system, int listener, ref ATTRIBUTES_3D attributes, IntPtr zero); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetListenerAttributes(IntPtr system, int listener, ref ATTRIBUTES_3D attributes, ref VECTOR attenuationposition); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetListenerWeight(IntPtr system, int listener, out float weight); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetListenerWeight(IntPtr system, int listener, float weight); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LoadBankFile(IntPtr system, byte[] filename, LOAD_BANK_FLAGS flags, out IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LoadBankMemory(IntPtr system, IntPtr buffer, int length, LOAD_MEMORY_MODE mode, LOAD_BANK_FLAGS flags, out IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LoadBankCustom(IntPtr system, ref BANK_INFO info, LOAD_BANK_FLAGS flags, out IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_UnloadAll(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_FlushCommands(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_FlushSampleLoading(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_StartCommandCapture(IntPtr system, byte[] filename, COMMANDCAPTURE_FLAGS flags); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_StopCommandCapture(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_LoadCommandReplay(IntPtr system, byte[] filename, COMMANDREPLAY_FLAGS flags, out IntPtr replay); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBankCount(IntPtr system, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBankList(IntPtr system, IntPtr[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterDescriptionCount(IntPtr system, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetParameterDescriptionList(IntPtr system, [Out] PARAMETER_DESCRIPTION[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetCPUUsage(IntPtr system, out CPU_USAGE usage, out CPU_USAGE usage_core); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetBufferUsage(IntPtr system, out BUFFER_USAGE usage); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_ResetBufferUsage(IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetCallback(IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetUserData(IntPtr system, out IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_SetUserData(IntPtr system, IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_System_GetMemoryUsage(IntPtr system, out MEMORY_USAGE memoryusage); #endregion #region wrapperinternal public IntPtr handle; public System(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_System_IsValid(this.handle); } #endregion } public struct EventDescription { public RESULT getID(out GUID id) { return FMOD_Studio_EventDescription_GetID(this.handle, out id); } public RESULT getPath(out string? path) { path = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, 256, out var retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getParameterDescriptionCount(out int count) { return FMOD_Studio_EventDescription_GetParameterDescriptionCount(this.handle, out count); } public RESULT getParameterDescriptionByIndex(int index, out PARAMETER_DESCRIPTION parameter) { return FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(this.handle, index, out parameter); } public RESULT getParameterDescriptionByName(string name, out PARAMETER_DESCRIPTION parameter) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventDescription_GetParameterDescriptionByName(this.handle, encoder.byteFromStringUTF8(name), out parameter); } } public RESULT getParameterDescriptionByID(PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter) { return FMOD_Studio_EventDescription_GetParameterDescriptionByID(this.handle, id, out parameter); } public RESULT getParameterLabelByIndex(int index, int labelindex, out string? label) { label = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, IntPtr.Zero, 0, out retrieved); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_EventDescription_GetParameterLabelByIndex(this.handle, index, labelindex, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { label = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getParameterLabelByName(string name, int labelindex, out string? label) { label = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var nameBytes = encoder.byteFromStringUTF8(name); var result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, IntPtr.Zero, 0, out retrieved); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_EventDescription_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { label = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getParameterLabelByID(PARAMETER_ID id, int labelindex, out string? label) { label = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, IntPtr.Zero, 0, out retrieved); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_EventDescription_GetParameterLabelByID(this.handle, id, labelindex, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { label = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getUserPropertyCount(out int count) { return FMOD_Studio_EventDescription_GetUserPropertyCount(this.handle, out count); } public RESULT getUserPropertyByIndex(int index, out USER_PROPERTY property) { return FMOD_Studio_EventDescription_GetUserPropertyByIndex(this.handle, index, out property); } public RESULT getUserProperty(string name, out USER_PROPERTY property) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventDescription_GetUserProperty(this.handle, encoder.byteFromStringUTF8(name), out property); } } public RESULT getLength(out int length) { return FMOD_Studio_EventDescription_GetLength(this.handle, out length); } public RESULT getMinMaxDistance(out float min, out float max) { return FMOD_Studio_EventDescription_GetMinMaxDistance(this.handle, out min, out max); } public RESULT getSoundSize(out float size) { return FMOD_Studio_EventDescription_GetSoundSize(this.handle, out size); } public RESULT isSnapshot(out bool snapshot) { return FMOD_Studio_EventDescription_IsSnapshot(this.handle, out snapshot); } public RESULT isOneshot(out bool oneshot) { return FMOD_Studio_EventDescription_IsOneshot(this.handle, out oneshot); } public RESULT isStream(out bool isStream) { return FMOD_Studio_EventDescription_IsStream(this.handle, out isStream); } public RESULT is3D(out bool is3D) { return FMOD_Studio_EventDescription_Is3D(this.handle, out is3D); } public RESULT isDopplerEnabled(out bool doppler) { return FMOD_Studio_EventDescription_IsDopplerEnabled(this.handle, out doppler); } public RESULT hasSustainPoint(out bool sustainPoint) { return FMOD_Studio_EventDescription_HasSustainPoint(this.handle, out sustainPoint); } public RESULT createInstance(out EventInstance instance) { return FMOD_Studio_EventDescription_CreateInstance(this.handle, out instance.handle); } public RESULT getInstanceCount(out int count) { return FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out count); } public RESULT getInstanceList(out EventInstance[]? array) { array = null; RESULT result; result = FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new EventInstance[0]; return result; } var rawArray = new IntPtr[capacity]; result = FMOD_Studio_EventDescription_GetInstanceList(this.handle, rawArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount > capacity) // More items added since we queried just now? { actualCount = capacity; } array = new EventInstance[actualCount]; for (var i = 0; i < actualCount; ++i) { array[i].handle = rawArray[i]; } return RESULT.OK; } public RESULT loadSampleData() { return FMOD_Studio_EventDescription_LoadSampleData(this.handle); } public RESULT unloadSampleData() { return FMOD_Studio_EventDescription_UnloadSampleData(this.handle); } public RESULT getSampleLoadingState(out LOADING_STATE state) { return FMOD_Studio_EventDescription_GetSampleLoadingState(this.handle, out state); } public RESULT releaseAllInstances() { return FMOD_Studio_EventDescription_ReleaseAllInstances(this.handle); } public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) { return FMOD_Studio_EventDescription_SetCallback(this.handle, callback, callbackmask); } public RESULT getUserData(out IntPtr userdata) { return FMOD_Studio_EventDescription_GetUserData(this.handle, out userdata); } public RESULT setUserData(IntPtr userdata) { return FMOD_Studio_EventDescription_SetUserData(this.handle, userdata); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_EventDescription_IsValid(IntPtr eventdescription); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetID(IntPtr eventdescription, out GUID id); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetPath(IntPtr eventdescription, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionCount(IntPtr eventdescription, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByIndex(IntPtr eventdescription, int index, out PARAMETER_DESCRIPTION parameter); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByName(IntPtr eventdescription, byte[] name, out PARAMETER_DESCRIPTION parameter); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterDescriptionByID(IntPtr eventdescription, PARAMETER_ID id, out PARAMETER_DESCRIPTION parameter); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByIndex(IntPtr eventdescription, int index, int labelindex, IntPtr label, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByName(IntPtr eventdescription, byte[] name, int labelindex, IntPtr label, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetParameterLabelByID(IntPtr eventdescription, PARAMETER_ID id, int labelindex, IntPtr label, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyCount(IntPtr eventdescription, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetUserPropertyByIndex(IntPtr eventdescription, int index, out USER_PROPERTY property); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetUserProperty(IntPtr eventdescription, byte[] name, out USER_PROPERTY property); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetLength(IntPtr eventdescription, out int length); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetMinMaxDistance(IntPtr eventdescription, out float min, out float max); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetSoundSize(IntPtr eventdescription, out float size); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_IsSnapshot(IntPtr eventdescription, out bool snapshot); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_IsOneshot(IntPtr eventdescription, out bool oneshot); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_IsStream(IntPtr eventdescription, out bool isStream); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_Is3D(IntPtr eventdescription, out bool is3D); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_IsDopplerEnabled(IntPtr eventdescription, out bool doppler); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_HasSustainPoint(IntPtr eventdescription, out bool sustainPoint); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_CreateInstance(IntPtr eventdescription, out IntPtr instance); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetInstanceCount(IntPtr eventdescription, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetInstanceList(IntPtr eventdescription, IntPtr[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_LoadSampleData(IntPtr eventdescription); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_UnloadSampleData(IntPtr eventdescription); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetSampleLoadingState(IntPtr eventdescription, out LOADING_STATE state); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_ReleaseAllInstances(IntPtr eventdescription); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_SetCallback(IntPtr eventdescription, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_GetUserData(IntPtr eventdescription, out IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventDescription_SetUserData(IntPtr eventdescription, IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public EventDescription(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_EventDescription_IsValid(this.handle); } #endregion } public struct EventInstance { public RESULT getDescription(out EventDescription description) { return FMOD_Studio_EventInstance_GetDescription(this.handle, out description.handle); } public RESULT getSystem(out System system) { return FMOD_Studio_EventInstance_GetSystem(this.handle, out system.handle); } public RESULT getVolume(out float volume) { return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, IntPtr.Zero); } public RESULT getVolume(out float volume, out float finalvolume) { return FMOD_Studio_EventInstance_GetVolume(this.handle, out volume, out finalvolume); } public RESULT setVolume(float volume) { return FMOD_Studio_EventInstance_SetVolume(this.handle, volume); } public RESULT getPitch(out float pitch) { return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, IntPtr.Zero); } public RESULT getPitch(out float pitch, out float finalpitch) { return FMOD_Studio_EventInstance_GetPitch(this.handle, out pitch, out finalpitch); } public RESULT setPitch(float pitch) { return FMOD_Studio_EventInstance_SetPitch(this.handle, pitch); } public RESULT get3DAttributes(out ATTRIBUTES_3D attributes) { return FMOD_Studio_EventInstance_Get3DAttributes(this.handle, out attributes); } public RESULT set3DAttributes(ATTRIBUTES_3D attributes) { return FMOD_Studio_EventInstance_Set3DAttributes(this.handle, ref attributes); } public RESULT getListenerMask(out uint mask) { return FMOD_Studio_EventInstance_GetListenerMask(this.handle, out mask); } public RESULT setListenerMask(uint mask) { return FMOD_Studio_EventInstance_SetListenerMask(this.handle, mask); } public RESULT getProperty(EVENT_PROPERTY index, out float value) { return FMOD_Studio_EventInstance_GetProperty(this.handle, index, out value); } public RESULT setProperty(EVENT_PROPERTY index, float value) { return FMOD_Studio_EventInstance_SetProperty(this.handle, index, value); } public RESULT getReverbLevel(int index, out float level) { return FMOD_Studio_EventInstance_GetReverbLevel(this.handle, index, out level); } public RESULT setReverbLevel(int index, float level) { return FMOD_Studio_EventInstance_SetReverbLevel(this.handle, index, level); } public RESULT getPaused(out bool paused) { return FMOD_Studio_EventInstance_GetPaused(this.handle, out paused); } public RESULT setPaused(bool paused) { return FMOD_Studio_EventInstance_SetPaused(this.handle, paused); } public RESULT start() { return FMOD_Studio_EventInstance_Start(this.handle); } public RESULT stop(STOP_MODE mode) { return FMOD_Studio_EventInstance_Stop(this.handle, mode); } public RESULT getTimelinePosition(out int position) { return FMOD_Studio_EventInstance_GetTimelinePosition(this.handle, out position); } public RESULT setTimelinePosition(int position) { return FMOD_Studio_EventInstance_SetTimelinePosition(this.handle, position); } public RESULT getPlaybackState(out PLAYBACK_STATE state) { return FMOD_Studio_EventInstance_GetPlaybackState(this.handle, out state); } public RESULT getChannelGroup(out ChannelGroup group) { return FMOD_Studio_EventInstance_GetChannelGroup(this.handle, out group.handle); } public RESULT getMinMaxDistance(out float min, out float max) { return FMOD_Studio_EventInstance_GetMinMaxDistance(this.handle, out min, out max); } public RESULT release() { return FMOD_Studio_EventInstance_Release(this.handle); } public RESULT isVirtual(out bool virtualstate) { return FMOD_Studio_EventInstance_IsVirtual(this.handle, out virtualstate); } public RESULT getParameterByID(PARAMETER_ID id, out float value) { float finalvalue; return getParameterByID(id, out value, out finalvalue); } public RESULT getParameterByID(PARAMETER_ID id, out float value, out float finalvalue) { return FMOD_Studio_EventInstance_GetParameterByID(this.handle, id, out value, out finalvalue); } public RESULT setParameterByID(PARAMETER_ID id, float value, bool ignoreseekspeed = false) { return FMOD_Studio_EventInstance_SetParameterByID(this.handle, id, value, ignoreseekspeed); } public RESULT setParameterByIDWithLabel(PARAMETER_ID id, string label, bool ignoreseekspeed = false) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventInstance_SetParameterByIDWithLabel(this.handle, id, encoder.byteFromStringUTF8(label), ignoreseekspeed); } } public RESULT setParametersByIDs(PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed = false) { return FMOD_Studio_EventInstance_SetParametersByIDs(this.handle, ids, values, count, ignoreseekspeed); } public RESULT getParameterByName(string name, out float value) { float finalValue; return getParameterByName(name, out value, out finalValue); } public RESULT getParameterByName(string name, out float value, out float finalvalue) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventInstance_GetParameterByName(this.handle, encoder.byteFromStringUTF8(name), out value, out finalvalue); } } public RESULT setParameterByName(string name, float value, bool ignoreseekspeed = false) { using (var encoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventInstance_SetParameterByName(this.handle, encoder.byteFromStringUTF8(name), value, ignoreseekspeed); } } public RESULT setParameterByNameWithLabel(string name, string label, bool ignoreseekspeed = false) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper(), labelEncoder = StringHelper.GetFreeHelper()) { return FMOD_Studio_EventInstance_SetParameterByNameWithLabel(this.handle, encoder.byteFromStringUTF8(name), labelEncoder.byteFromStringUTF8(label), ignoreseekspeed); } } public RESULT keyOff() { return FMOD_Studio_EventInstance_KeyOff(this.handle); } public RESULT setCallback(EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask = EVENT_CALLBACK_TYPE.ALL) { return FMOD_Studio_EventInstance_SetCallback(this.handle, callback, callbackmask); } public RESULT getUserData(out IntPtr userdata) { return FMOD_Studio_EventInstance_GetUserData(this.handle, out userdata); } public RESULT setUserData(IntPtr userdata) { return FMOD_Studio_EventInstance_SetUserData(this.handle, userdata); } public RESULT getCPUUsage(out uint exclusive, out uint inclusive) { return FMOD_Studio_EventInstance_GetCPUUsage(this.handle, out exclusive, out inclusive); } public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) { return FMOD_Studio_EventInstance_GetMemoryUsage(this.handle, out memoryusage); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_EventInstance_IsValid(IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetDescription(IntPtr _event, out IntPtr description); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetSystem(IntPtr _event, out IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetVolume(IntPtr _event, out float volume, IntPtr zero); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetVolume(IntPtr _event, out float volume, out float finalvolume); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetVolume(IntPtr _event, float volume); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetPitch(IntPtr _event, out float pitch, IntPtr zero); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetPitch(IntPtr _event, out float pitch, out float finalpitch); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetPitch(IntPtr _event, float pitch); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_Get3DAttributes(IntPtr _event, out ATTRIBUTES_3D attributes); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_Set3DAttributes(IntPtr _event, ref ATTRIBUTES_3D attributes); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetListenerMask(IntPtr _event, out uint mask); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetListenerMask(IntPtr _event, uint mask); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetProperty(IntPtr _event, EVENT_PROPERTY index, out float value); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetProperty(IntPtr _event, EVENT_PROPERTY index, float value); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetReverbLevel(IntPtr _event, int index, out float level); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetReverbLevel(IntPtr _event, int index, float level); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetPaused(IntPtr _event, out bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetPaused(IntPtr _event, bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_Start(IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_Stop(IntPtr _event, STOP_MODE mode); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetTimelinePosition(IntPtr _event, out int position); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetTimelinePosition(IntPtr _event, int position); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetPlaybackState(IntPtr _event, out PLAYBACK_STATE state); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetChannelGroup(IntPtr _event, out IntPtr group); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetMinMaxDistance(IntPtr _event, out float min, out float max); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_Release(IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_IsVirtual(IntPtr _event, out bool virtualstate); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetParameterByName(IntPtr _event, byte[] name, out float value, out float finalvalue); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetParameterByName(IntPtr _event, byte[] name, float value, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetParameterByNameWithLabel(IntPtr _event, byte[] name, byte[] label, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetParameterByID(IntPtr _event, PARAMETER_ID id, out float value, out float finalvalue); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetParameterByID(IntPtr _event, PARAMETER_ID id, float value, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetParameterByIDWithLabel(IntPtr _event, PARAMETER_ID id, byte[] label, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetParametersByIDs(IntPtr _event, PARAMETER_ID[] ids, float[] values, int count, bool ignoreseekspeed); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_KeyOff(IntPtr _event); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetCallback(IntPtr _event, EVENT_CALLBACK callback, EVENT_CALLBACK_TYPE callbackmask); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetUserData(IntPtr _event, out IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_SetUserData(IntPtr _event, IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetCPUUsage(IntPtr _event, out uint exclusive, out uint inclusive); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_EventInstance_GetMemoryUsage(IntPtr _event, out MEMORY_USAGE memoryusage); #endregion #region wrapperinternal public IntPtr handle; public EventInstance(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_EventInstance_IsValid(this.handle); } #endregion } public struct Bus { public RESULT getID(out GUID id) { return FMOD_Studio_Bus_GetID(this.handle, out id); } public RESULT getPath(out string? path) { path = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_Bus_GetPath(this.handle, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getVolume(out float volume) { float finalVolume; return getVolume(out volume, out finalVolume); } public RESULT getVolume(out float volume, out float finalvolume) { return FMOD_Studio_Bus_GetVolume(this.handle, out volume, out finalvolume); } public RESULT setVolume(float volume) { return FMOD_Studio_Bus_SetVolume(this.handle, volume); } public RESULT getPaused(out bool paused) { return FMOD_Studio_Bus_GetPaused(this.handle, out paused); } public RESULT setPaused(bool paused) { return FMOD_Studio_Bus_SetPaused(this.handle, paused); } public RESULT getMute(out bool mute) { return FMOD_Studio_Bus_GetMute(this.handle, out mute); } public RESULT setMute(bool mute) { return FMOD_Studio_Bus_SetMute(this.handle, mute); } public RESULT stopAllEvents(STOP_MODE mode) { return FMOD_Studio_Bus_StopAllEvents(this.handle, mode); } public RESULT lockChannelGroup() { return FMOD_Studio_Bus_LockChannelGroup(this.handle); } public RESULT unlockChannelGroup() { return FMOD_Studio_Bus_UnlockChannelGroup(this.handle); } public RESULT getChannelGroup(out ChannelGroup group) { return FMOD_Studio_Bus_GetChannelGroup(this.handle, out group.handle); } public RESULT getCPUUsage(out uint exclusive, out uint inclusive) { return FMOD_Studio_Bus_GetCPUUsage(this.handle, out exclusive, out inclusive); } public RESULT getMemoryUsage(out MEMORY_USAGE memoryusage) { return FMOD_Studio_Bus_GetMemoryUsage(this.handle, out memoryusage); } public RESULT getPortIndex(out ulong index) { return FMOD_Studio_Bus_GetPortIndex(this.handle, out index); } public RESULT setPortIndex(ulong index) { return FMOD_Studio_Bus_SetPortIndex(this.handle, index); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_Bus_IsValid(IntPtr bus); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetID(IntPtr bus, out GUID id); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetPath(IntPtr bus, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetVolume(IntPtr bus, out float volume, out float finalvolume); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_SetVolume(IntPtr bus, float volume); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetPaused(IntPtr bus, out bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_SetPaused(IntPtr bus, bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetMute(IntPtr bus, out bool mute); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_SetMute(IntPtr bus, bool mute); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_StopAllEvents(IntPtr bus, STOP_MODE mode); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_LockChannelGroup(IntPtr bus); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_UnlockChannelGroup(IntPtr bus); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetChannelGroup(IntPtr bus, out IntPtr group); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetCPUUsage(IntPtr bus, out uint exclusive, out uint inclusive); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetMemoryUsage(IntPtr bus, out MEMORY_USAGE memoryusage); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_GetPortIndex(IntPtr bus, out ulong index); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bus_SetPortIndex(IntPtr bus, ulong index); #endregion #region wrapperinternal public IntPtr handle; public Bus(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_Bus_IsValid(this.handle); } #endregion } public struct VCA { public RESULT getID(out GUID id) { return FMOD_Studio_VCA_GetID(this.handle, out id); } public RESULT getPath(out string? path) { path = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_VCA_GetPath(this.handle, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getVolume(out float volume) { float finalVolume; return getVolume(out volume, out finalVolume); } public RESULT getVolume(out float volume, out float finalvolume) { return FMOD_Studio_VCA_GetVolume(this.handle, out volume, out finalvolume); } public RESULT setVolume(float volume) { return FMOD_Studio_VCA_SetVolume(this.handle, volume); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_VCA_IsValid(IntPtr vca); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_VCA_GetID(IntPtr vca, out GUID id); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_VCA_GetPath(IntPtr vca, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_VCA_GetVolume(IntPtr vca, out float volume, out float finalvolume); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_VCA_SetVolume(IntPtr vca, float volume); #endregion #region wrapperinternal public IntPtr handle; public VCA(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_VCA_IsValid(this.handle); } #endregion } public struct Bank { // Property access public RESULT getID(out GUID id) { return FMOD_Studio_Bank_GetID(this.handle, out id); } public RESULT getPath(out string? path) { path = null; using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_Bank_GetPath(this.handle, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT unload() { return FMOD_Studio_Bank_Unload(this.handle); } public RESULT loadSampleData() { return FMOD_Studio_Bank_LoadSampleData(this.handle); } public RESULT unloadSampleData() { return FMOD_Studio_Bank_UnloadSampleData(this.handle); } public RESULT getLoadingState(out LOADING_STATE state) { return FMOD_Studio_Bank_GetLoadingState(this.handle, out state); } public RESULT getSampleLoadingState(out LOADING_STATE state) { return FMOD_Studio_Bank_GetSampleLoadingState(this.handle, out state); } // Enumeration public RESULT getStringCount(out int count) { return FMOD_Studio_Bank_GetStringCount(this.handle, out count); } public RESULT getStringInfo(int index, out GUID id, out string? path) { path = null; id = new GUID(); using var encoder = StringHelper.GetFreeHelper(); var stringMem = Marshal.AllocHGlobal(256); var retrieved = 0; var result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, 256, out retrieved); if (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringMem = Marshal.AllocHGlobal(retrieved); result = FMOD_Studio_Bank_GetStringInfo(this.handle, index, out id, stringMem, retrieved, out retrieved); } if (result == RESULT.OK) { path = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getEventCount(out int count) { return FMOD_Studio_Bank_GetEventCount(this.handle, out count); } public RESULT getEventList(out EventDescription[]? array) { array = null; RESULT result; result = FMOD_Studio_Bank_GetEventCount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new EventDescription[0]; return result; } var rawArray = new IntPtr[capacity]; result = FMOD_Studio_Bank_GetEventList(this.handle, rawArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount > capacity) // More items added since we queried just now? { actualCount = capacity; } array = new EventDescription[actualCount]; for (var i = 0; i < actualCount; ++i) { array[i].handle = rawArray[i]; } return RESULT.OK; } public RESULT getBusCount(out int count) { return FMOD_Studio_Bank_GetBusCount(this.handle, out count); } public RESULT getBusList(out Bus[]? array) { array = null; RESULT result; result = FMOD_Studio_Bank_GetBusCount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new Bus[0]; return result; } var rawArray = new IntPtr[capacity]; result = FMOD_Studio_Bank_GetBusList(this.handle, rawArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount > capacity) // More items added since we queried just now? { actualCount = capacity; } array = new Bus[actualCount]; for (var i = 0; i < actualCount; ++i) { array[i].handle = rawArray[i]; } return RESULT.OK; } public RESULT getVCACount(out int count) { return FMOD_Studio_Bank_GetVCACount(this.handle, out count); } public RESULT getVCAList(out VCA[]? array) { array = null; RESULT result; result = FMOD_Studio_Bank_GetVCACount(this.handle, out var capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new VCA[0]; return result; } var rawArray = new IntPtr[capacity]; result = FMOD_Studio_Bank_GetVCAList(this.handle, rawArray, capacity, out var actualCount); if (result != RESULT.OK) { return result; } if (actualCount > capacity) // More items added since we queried just now? { actualCount = capacity; } array = new VCA[actualCount]; for (var i = 0; i < actualCount; ++i) { array[i].handle = rawArray[i]; } return RESULT.OK; } public RESULT getUserData(out IntPtr userdata) { return FMOD_Studio_Bank_GetUserData(this.handle, out userdata); } public RESULT setUserData(IntPtr userdata) { return FMOD_Studio_Bank_SetUserData(this.handle, userdata); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_Bank_IsValid(IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetID(IntPtr bank, out GUID id); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetPath(IntPtr bank, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_Unload(IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_LoadSampleData(IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_UnloadSampleData(IntPtr bank); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetLoadingState(IntPtr bank, out LOADING_STATE state); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetSampleLoadingState(IntPtr bank, out LOADING_STATE state); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetStringCount(IntPtr bank, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetStringInfo(IntPtr bank, int index, out GUID id, IntPtr path, int size, out int retrieved); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetEventCount(IntPtr bank, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetEventList(IntPtr bank, IntPtr[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetBusCount(IntPtr bank, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetBusList(IntPtr bank, IntPtr[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetVCACount(IntPtr bank, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetVCAList(IntPtr bank, IntPtr[] array, int capacity, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_GetUserData(IntPtr bank, out IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_Bank_SetUserData(IntPtr bank, IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public Bank(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_Bank_IsValid(this.handle); } #endregion } public struct CommandReplay { // Information query public RESULT getSystem(out System system) { return FMOD_Studio_CommandReplay_GetSystem(this.handle, out system.handle); } public RESULT getLength(out float length) { return FMOD_Studio_CommandReplay_GetLength(this.handle, out length); } public RESULT getCommandCount(out int count) { return FMOD_Studio_CommandReplay_GetCommandCount(this.handle, out count); } public RESULT getCommandInfo(int commandIndex, out COMMAND_INFO info) { return FMOD_Studio_CommandReplay_GetCommandInfo(this.handle, commandIndex, out info); } public RESULT getCommandString(int commandIndex, out string? buffer) { buffer = null; using var encoder = StringHelper.GetFreeHelper(); var stringLength = 256; var stringMem = Marshal.AllocHGlobal(256); var result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); while (result == RESULT.ERR_TRUNCATED) { Marshal.FreeHGlobal(stringMem); stringLength *= 2; stringMem = Marshal.AllocHGlobal(stringLength); result = FMOD_Studio_CommandReplay_GetCommandString(this.handle, commandIndex, stringMem, stringLength); } if (result == RESULT.OK) { buffer = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getCommandAtTime(float time, out int commandIndex) { return FMOD_Studio_CommandReplay_GetCommandAtTime(this.handle, time, out commandIndex); } // Playback public RESULT setBankPath(string bankPath) { using var encoder = StringHelper.GetFreeHelper(); return FMOD_Studio_CommandReplay_SetBankPath(this.handle, encoder.byteFromStringUTF8(bankPath)); } public RESULT start() { return FMOD_Studio_CommandReplay_Start(this.handle); } public RESULT stop() { return FMOD_Studio_CommandReplay_Stop(this.handle); } public RESULT seekToTime(float time) { return FMOD_Studio_CommandReplay_SeekToTime(this.handle, time); } public RESULT seekToCommand(int commandIndex) { return FMOD_Studio_CommandReplay_SeekToCommand(this.handle, commandIndex); } public RESULT getPaused(out bool paused) { return FMOD_Studio_CommandReplay_GetPaused(this.handle, out paused); } public RESULT setPaused(bool paused) { return FMOD_Studio_CommandReplay_SetPaused(this.handle, paused); } public RESULT getPlaybackState(out PLAYBACK_STATE state) { return FMOD_Studio_CommandReplay_GetPlaybackState(this.handle, out state); } public RESULT getCurrentCommand(out int commandIndex, out float currentTime) { return FMOD_Studio_CommandReplay_GetCurrentCommand(this.handle, out commandIndex, out currentTime); } // Release public RESULT release() { return FMOD_Studio_CommandReplay_Release(this.handle); } // Callbacks public RESULT setFrameCallback(COMMANDREPLAY_FRAME_CALLBACK callback) { return FMOD_Studio_CommandReplay_SetFrameCallback(this.handle, callback); } public RESULT setLoadBankCallback(COMMANDREPLAY_LOAD_BANK_CALLBACK callback) { return FMOD_Studio_CommandReplay_SetLoadBankCallback(this.handle, callback); } public RESULT setCreateInstanceCallback(COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback) { return FMOD_Studio_CommandReplay_SetCreateInstanceCallback(this.handle, callback); } public RESULT getUserData(out IntPtr userdata) { return FMOD_Studio_CommandReplay_GetUserData(this.handle, out userdata); } public RESULT setUserData(IntPtr userdata) { return FMOD_Studio_CommandReplay_SetUserData(this.handle, userdata); } #region importfunctions [DllImport(STUDIO_VERSION.DLL)] private static extern bool FMOD_Studio_CommandReplay_IsValid(IntPtr replay); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetSystem(IntPtr replay, out IntPtr system); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetLength(IntPtr replay, out float length); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetCommandCount(IntPtr replay, out int count); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetCommandInfo(IntPtr replay, int commandindex, out COMMAND_INFO info); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetCommandString(IntPtr replay, int commandIndex, IntPtr buffer, int length); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetCommandAtTime(IntPtr replay, float time, out int commandIndex); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetBankPath(IntPtr replay, byte[] bankPath); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_Start(IntPtr replay); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_Stop(IntPtr replay); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SeekToTime(IntPtr replay, float time); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SeekToCommand(IntPtr replay, int commandIndex); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetPaused(IntPtr replay, out bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetPaused(IntPtr replay, bool paused); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetPlaybackState(IntPtr replay, out PLAYBACK_STATE state); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetCurrentCommand(IntPtr replay, out int commandIndex, out float currentTime); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_Release(IntPtr replay); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetFrameCallback(IntPtr replay, COMMANDREPLAY_FRAME_CALLBACK callback); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetLoadBankCallback(IntPtr replay, COMMANDREPLAY_LOAD_BANK_CALLBACK callback); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetCreateInstanceCallback(IntPtr replay, COMMANDREPLAY_CREATE_INSTANCE_CALLBACK callback); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_GetUserData(IntPtr replay, out IntPtr userdata); [DllImport(STUDIO_VERSION.DLL)] private static extern RESULT FMOD_Studio_CommandReplay_SetUserData(IntPtr replay, IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public CommandReplay(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } public bool isValid() { return hasHandle() && FMOD_Studio_CommandReplay_IsValid(this.handle); } #endregion } } // FMOD