/* ======================================================================================== */ /* FMOD Studio API - C# wrapper. */ /* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2021. */ /* */ /* For more detail visit: */ /* https://fmod.com/resources/documentation-api?version=2.0&page=page=studio-api.html */ /* ======================================================================================== */ using System; using System.Text; using System.Runtime.InteropServices; using System.Collections; namespace FMOD.Studio { public partial class STUDIO_VERSION { #if !UNITY_2019_4_OR_NEWER public const string dll = "fmodstudio"; #endif } 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); return FMOD_Studio_System_SetAdvancedSettings(this.handle, ref settings); } public RESULT setAdvancedSettings(ADVANCEDSETTINGS settings, string encryptionKey) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr userKey = settings.encryptionkey; settings.encryptionkey = encoder.intptrFromStringUTF8(encryptionKey); FMOD.RESULT result = setAdvancedSettings(settings); settings.encryptionkey = userKey; return result; } } public RESULT getAdvancedSettings(out ADVANCEDSETTINGS settings) { settings.cbsize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); return FMOD_Studio_System_GetAdvancedSettings(this.handle, out settings); } public RESULT initialize(int maxchannels, INITFLAGS studioflags, FMOD.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 FMOD.System coresystem) { return FMOD_Studio_System_GetCoreSystem(this.handle, out coresystem.handle); } public RESULT getEvent(string path, out EventDescription _event) { using (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; byte[] nameBytes = encoder.byteFromStringUTF8(name); RESULT result = FMOD_Studio_System_GetParameterLabelByName(this.handle, nameBytes, labelindex, stringMem, 256, out 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding 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. GCHandle pinnedArray = GCHandle.Alloc(buffer, GCHandleType.Pinned); IntPtr pointer = pinnedArray.AddrOfPinnedObject(); RESULT 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 = MarshalHelper.SizeOf(typeof(BANK_INFO)); 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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; int capacity; result = FMOD_Studio_System_GetBankCount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new Bank[0]; return result; } IntPtr[] rawArray = new IntPtr[capacity]; int actualCount; result = FMOD_Studio_System_GetBankList(this.handle, rawArray, capacity, out 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 (int 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; int capacity; RESULT result = FMOD_Studio_System_GetParameterDescriptionCount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new PARAMETER_DESCRIPTION[0]; return RESULT.OK; } PARAMETER_DESCRIPTION[] tempArray = new PARAMETER_DESCRIPTION[capacity]; int actualCount; result = FMOD_Studio_System_GetParameterDescriptionList(this.handle, tempArray, capacity, out 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 FMOD.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, FMOD.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 FMOD.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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT result = FMOD_Studio_EventDescription_GetPath(this.handle, stringMem, 256, out 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; byte[] nameBytes = encoder.byteFromStringUTF8(name); RESULT 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding 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; int capacity; result = FMOD_Studio_EventDescription_GetInstanceCount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new EventInstance[0]; return result; } IntPtr[] rawArray = new IntPtr[capacity]; int actualCount; result = FMOD_Studio_EventDescription_GetInstanceList(this.handle, rawArray, capacity, out 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 (int 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 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 FMOD.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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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 (StringHelper.ThreadSafeEncoding 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_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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 FMOD.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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { IntPtr stringMem = Marshal.AllocHGlobal(256); int retrieved = 0; RESULT 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; int capacity; result = FMOD_Studio_Bank_GetEventCount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new EventDescription[0]; return result; } IntPtr[] rawArray = new IntPtr[capacity]; int actualCount; result = FMOD_Studio_Bank_GetEventList(this.handle, rawArray, capacity, out 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 (int 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; int capacity; result = FMOD_Studio_Bank_GetBusCount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new Bus[0]; return result; } IntPtr[] rawArray = new IntPtr[capacity]; int actualCount; result = FMOD_Studio_Bank_GetBusList(this.handle, rawArray, capacity, out 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 (int 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; int capacity; result = FMOD_Studio_Bank_GetVCACount(this.handle, out capacity); if (result != RESULT.OK) { return result; } if (capacity == 0) { array = new VCA[0]; return result; } IntPtr[] rawArray = new IntPtr[capacity]; int actualCount; result = FMOD_Studio_Bank_GetVCAList(this.handle, rawArray, capacity, out 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 (int 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 (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { int stringLength = 256; IntPtr stringMem = Marshal.AllocHGlobal(256); RESULT 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 (StringHelper.ThreadSafeEncoding 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