/* ======================================================================================== */ /* FMOD Core API - C# wrapper. */ /* Copyright (c), Firelight Technologies Pty, Ltd. 2004-2024. */ /* */ /* For more detail visit: */ /* https://fmod.com/docs/2.03/api/core-api.html */ /* ======================================================================================== */ using System; using System.Text; using System.Runtime.InteropServices; using System.Collections.Generic; namespace FMOD { /* FMOD version number. Check this against FMOD::System::getVersion / System_GetVersion 0xaaaabbcc -> aaaa = major version number. bb = minor version number. cc = development version number. */ public partial class VERSION { public const int number = 0x00020302; #if !UNITY_2021_3_OR_NEWER public const string dll = "fmod"; #endif } public class CONSTANTS { public const int MAX_CHANNEL_WIDTH = 32; public const int MAX_LISTENERS = 8; public const int REVERB_MAXINSTANCES = 4; public const int MAX_SYSTEMS = 8; } /* FMOD core types */ public enum RESULT : int { OK, ERR_BADCOMMAND, ERR_CHANNEL_ALLOC, ERR_CHANNEL_STOLEN, ERR_DMA, ERR_DSP_CONNECTION, ERR_DSP_DONTPROCESS, ERR_DSP_FORMAT, ERR_DSP_INUSE, ERR_DSP_NOTFOUND, ERR_DSP_RESERVED, ERR_DSP_SILENCE, ERR_DSP_TYPE, ERR_FILE_BAD, ERR_FILE_COULDNOTSEEK, ERR_FILE_DISKEJECTED, ERR_FILE_EOF, ERR_FILE_ENDOFDATA, ERR_FILE_NOTFOUND, ERR_FORMAT, ERR_HEADER_MISMATCH, ERR_HTTP, ERR_HTTP_ACCESS, ERR_HTTP_PROXY_AUTH, ERR_HTTP_SERVER_ERROR, ERR_HTTP_TIMEOUT, ERR_INITIALIZATION, ERR_INITIALIZED, ERR_INTERNAL, ERR_INVALID_FLOAT, ERR_INVALID_HANDLE, ERR_INVALID_PARAM, ERR_INVALID_POSITION, ERR_INVALID_SPEAKER, ERR_INVALID_SYNCPOINT, ERR_INVALID_THREAD, ERR_INVALID_VECTOR, ERR_MAXAUDIBLE, ERR_MEMORY, ERR_MEMORY_CANTPOINT, ERR_NEEDS3D, ERR_NEEDSHARDWARE, ERR_NET_CONNECT, ERR_NET_SOCKET_ERROR, ERR_NET_URL, ERR_NET_WOULD_BLOCK, ERR_NOTREADY, ERR_OUTPUT_ALLOCATED, ERR_OUTPUT_CREATEBUFFER, ERR_OUTPUT_DRIVERCALL, ERR_OUTPUT_FORMAT, ERR_OUTPUT_INIT, ERR_OUTPUT_NODRIVERS, ERR_PLUGIN, ERR_PLUGIN_MISSING, ERR_PLUGIN_RESOURCE, ERR_PLUGIN_VERSION, ERR_RECORD, ERR_REVERB_CHANNELGROUP, ERR_REVERB_INSTANCE, ERR_SUBSOUNDS, ERR_SUBSOUND_ALLOCATED, ERR_SUBSOUND_CANTMOVE, ERR_TAGNOTFOUND, ERR_TOOMANYCHANNELS, ERR_TRUNCATED, ERR_UNIMPLEMENTED, ERR_UNINITIALIZED, ERR_UNSUPPORTED, ERR_VERSION, ERR_EVENT_ALREADY_LOADED, ERR_EVENT_LIVEUPDATE_BUSY, ERR_EVENT_LIVEUPDATE_MISMATCH, ERR_EVENT_LIVEUPDATE_TIMEOUT, ERR_EVENT_NOTFOUND, ERR_STUDIO_UNINITIALIZED, ERR_STUDIO_NOT_LOADED, ERR_INVALID_STRING, ERR_ALREADY_LOCKED, ERR_NOT_LOCKED, ERR_RECORD_DISCONNECTED, ERR_TOOMANYSAMPLES, } public enum CHANNELCONTROL_TYPE : int { CHANNEL, CHANNELGROUP, MAX } [StructLayout(LayoutKind.Sequential)] public struct VECTOR { public float x; public float y; public float z; } [StructLayout(LayoutKind.Sequential)] public struct ATTRIBUTES_3D { public VECTOR position; public VECTOR velocity; public VECTOR forward; public VECTOR up; } [StructLayout(LayoutKind.Sequential)] public partial struct GUID { public int Data1; public int Data2; public int Data3; public int Data4; } [StructLayout(LayoutKind.Sequential)] public struct ASYNCREADINFO { public IntPtr handle; public uint offset; public uint sizebytes; public int priority; public IntPtr userdata; public IntPtr buffer; public uint bytesread; public FILE_ASYNCDONE_FUNC done; } public enum OUTPUTTYPE : int { AUTODETECT, UNKNOWN, NOSOUND, WAVWRITER, NOSOUND_NRT, WAVWRITER_NRT, WASAPI, ASIO, PULSEAUDIO, ALSA, COREAUDIO, AUDIOTRACK, OPENSL, AUDIOOUT, AUDIO3D, WEBAUDIO, NNAUDIO, WINSONIC, AAUDIO, AUDIOWORKLET, PHASE, OHAUDIO, MAX, } public enum PORT_TYPE : int { MUSIC, COPYRIGHT_MUSIC, VOICE, CONTROLLER, PERSONAL, VIBRATION, AUX, PASSTHROUGH, VR_VIBRATION, MAX } public enum DEBUG_MODE : int { TTY, FILE, CALLBACK, } [Flags] public enum DEBUG_FLAGS : uint { NONE = 0x00000000, ERROR = 0x00000001, WARNING = 0x00000002, LOG = 0x00000004, TYPE_MEMORY = 0x00000100, TYPE_FILE = 0x00000200, TYPE_CODEC = 0x00000400, TYPE_TRACE = 0x00000800, DISPLAY_TIMESTAMPS = 0x00010000, DISPLAY_LINENUMBERS = 0x00020000, DISPLAY_THREAD = 0x00040000, } [Flags] public enum MEMORY_TYPE : uint { NORMAL = 0x00000000, STREAM_FILE = 0x00000001, STREAM_DECODE = 0x00000002, SAMPLEDATA = 0x00000004, DSP_BUFFER = 0x00000008, PLUGIN = 0x00000010, PERSISTENT = 0x00200000, ALL = 0xFFFFFFFF } public enum SPEAKERMODE : int { DEFAULT, RAW, MONO, STEREO, QUAD, SURROUND, _5POINT1, _7POINT1, _7POINT1POINT4, MAX, } public enum SPEAKER : int { NONE = -1, FRONT_LEFT, FRONT_RIGHT, FRONT_CENTER, LOW_FREQUENCY, SURROUND_LEFT, SURROUND_RIGHT, BACK_LEFT, BACK_RIGHT, TOP_FRONT_LEFT, TOP_FRONT_RIGHT, TOP_BACK_LEFT, TOP_BACK_RIGHT, MAX, } [Flags] public enum CHANNELMASK : uint { FRONT_LEFT = 0x00000001, FRONT_RIGHT = 0x00000002, FRONT_CENTER = 0x00000004, LOW_FREQUENCY = 0x00000008, SURROUND_LEFT = 0x00000010, SURROUND_RIGHT = 0x00000020, BACK_LEFT = 0x00000040, BACK_RIGHT = 0x00000080, BACK_CENTER = 0x00000100, MONO = (FRONT_LEFT), STEREO = (FRONT_LEFT | FRONT_RIGHT), LRC = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER), QUAD = (FRONT_LEFT | FRONT_RIGHT | SURROUND_LEFT | SURROUND_RIGHT), SURROUND = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT), _5POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT), _5POINT1_REARS = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | BACK_LEFT | BACK_RIGHT), _7POINT0 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT), _7POINT1 = (FRONT_LEFT | FRONT_RIGHT | FRONT_CENTER | LOW_FREQUENCY | SURROUND_LEFT | SURROUND_RIGHT | BACK_LEFT | BACK_RIGHT) } public enum CHANNELORDER : int { DEFAULT, WAVEFORMAT, PROTOOLS, ALLMONO, ALLSTEREO, ALSA, MAX, } public enum PLUGINTYPE : int { OUTPUT, CODEC, DSP, MAX, } [StructLayout(LayoutKind.Sequential)] public struct PLUGINLIST { PLUGINTYPE type; IntPtr description; } [Flags] public enum INITFLAGS : uint { NORMAL = 0x00000000, STREAM_FROM_UPDATE = 0x00000001, MIX_FROM_UPDATE = 0x00000002, _3D_RIGHTHANDED = 0x00000004, CLIP_OUTPUT = 0x00000008, CHANNEL_LOWPASS = 0x00000100, CHANNEL_DISTANCEFILTER = 0x00000200, PROFILE_ENABLE = 0x00010000, VOL0_BECOMES_VIRTUAL = 0x00020000, GEOMETRY_USECLOSEST = 0x00040000, PREFER_DOLBY_DOWNMIX = 0x00080000, THREAD_UNSAFE = 0x00100000, PROFILE_METER_ALL = 0x00200000, MEMORY_TRACKING = 0x00400000, } public enum SOUND_TYPE : int { UNKNOWN, AIFF, ASF, DLS, FLAC, FSB, IT, MIDI, MOD, MPEG, OGGVORBIS, PLAYLIST, RAW, S3M, USER, WAV, XM, XMA, AUDIOQUEUE, AT9, VORBIS, MEDIA_FOUNDATION, MEDIACODEC, FADPCM, OPUS, MAX, } public enum SOUND_FORMAT : int { NONE, PCM8, PCM16, PCM24, PCM32, PCMFLOAT, BITSTREAM, MAX } [Flags] public enum MODE : uint { DEFAULT = 0x00000000, LOOP_OFF = 0x00000001, LOOP_NORMAL = 0x00000002, LOOP_BIDI = 0x00000004, _2D = 0x00000008, _3D = 0x00000010, CREATESTREAM = 0x00000080, CREATESAMPLE = 0x00000100, CREATECOMPRESSEDSAMPLE = 0x00000200, OPENUSER = 0x00000400, OPENMEMORY = 0x00000800, OPENMEMORY_POINT = 0x10000000, OPENRAW = 0x00001000, OPENONLY = 0x00002000, ACCURATETIME = 0x00004000, MPEGSEARCH = 0x00008000, NONBLOCKING = 0x00010000, UNIQUE = 0x00020000, _3D_HEADRELATIVE = 0x00040000, _3D_WORLDRELATIVE = 0x00080000, _3D_INVERSEROLLOFF = 0x00100000, _3D_LINEARROLLOFF = 0x00200000, _3D_LINEARSQUAREROLLOFF = 0x00400000, _3D_INVERSETAPEREDROLLOFF = 0x00800000, _3D_CUSTOMROLLOFF = 0x04000000, _3D_IGNOREGEOMETRY = 0x40000000, IGNORETAGS = 0x02000000, LOWMEM = 0x08000000, VIRTUAL_PLAYFROMSTART = 0x80000000 } public enum OPENSTATE : int { READY = 0, LOADING, ERROR, CONNECTING, BUFFERING, SEEKING, PLAYING, SETPOSITION, MAX, } public enum SOUNDGROUP_BEHAVIOR : int { BEHAVIOR_FAIL, BEHAVIOR_MUTE, BEHAVIOR_STEALLOWEST, MAX, } public enum CHANNELCONTROL_CALLBACK_TYPE : int { END, VIRTUALVOICE, SYNCPOINT, OCCLUSION, MAX, } public struct CHANNELCONTROL_DSP_INDEX { public const int HEAD = -1; public const int FADER = -2; public const int TAIL = -3; } public enum ERRORCALLBACK_INSTANCETYPE : int { NONE, SYSTEM, CHANNEL, CHANNELGROUP, CHANNELCONTROL, SOUND, SOUNDGROUP, DSP, DSPCONNECTION, GEOMETRY, REVERB3D, STUDIO_SYSTEM, STUDIO_EVENTDESCRIPTION, STUDIO_EVENTINSTANCE, STUDIO_PARAMETERINSTANCE, STUDIO_BUS, STUDIO_VCA, STUDIO_BANK, STUDIO_COMMANDREPLAY } [StructLayout(LayoutKind.Sequential)] public struct ERRORCALLBACK_INFO { public RESULT result; public ERRORCALLBACK_INSTANCETYPE instancetype; public IntPtr instance; public StringWrapper functionname; public StringWrapper functionparams; } [StructLayout(LayoutKind.Sequential)] public struct CPU_USAGE { public float dsp; /* DSP mixing CPU usage. */ public float stream; /* Streaming engine CPU usage. */ public float geometry; /* Geometry engine CPU usage. */ public float update; /* System::update CPU usage. */ public float convolution1; /* Convolution reverb processing thread #1 CPU usage */ public float convolution2; /* Convolution reverb processing thread #2 CPU usage */ } [StructLayout(LayoutKind.Sequential)] public struct DSP_DATA_PARAMETER_INFO { public IntPtr data; public uint length; public int index; } [Flags] public enum SYSTEM_CALLBACK_TYPE : uint { DEVICELISTCHANGED = 0x00000001, DEVICELOST = 0x00000002, MEMORYALLOCATIONFAILED = 0x00000004, THREADCREATED = 0x00000008, BADDSPCONNECTION = 0x00000010, PREMIX = 0x00000020, POSTMIX = 0x00000040, ERROR = 0x00000080, THREADDESTROYED = 0x00000100, PREUPDATE = 0x00000200, POSTUPDATE = 0x00000400, RECORDLISTCHANGED = 0x00000800, BUFFEREDNOMIX = 0x00001000, DEVICEREINITIALIZE = 0x00002000, OUTPUTUNDERRUN = 0x00004000, RECORDPOSITIONCHANGED = 0x00008000, ALL = 0xFFFFFFFF, } /* FMOD Callbacks */ public delegate RESULT DEBUG_CALLBACK (DEBUG_FLAGS flags, IntPtr file, int line, IntPtr func, IntPtr message); public delegate RESULT SYSTEM_CALLBACK (IntPtr system, SYSTEM_CALLBACK_TYPE type, IntPtr commanddata1, IntPtr commanddata2, IntPtr userdata); public delegate RESULT CHANNELCONTROL_CALLBACK (IntPtr channelcontrol, CHANNELCONTROL_TYPE controltype, CHANNELCONTROL_CALLBACK_TYPE callbacktype, IntPtr commanddata1, IntPtr commanddata2); public delegate RESULT DSP_CALLBACK (IntPtr dsp, DSP_CALLBACK_TYPE type, IntPtr data); public delegate RESULT SOUND_NONBLOCK_CALLBACK (IntPtr sound, RESULT result); public delegate RESULT SOUND_PCMREAD_CALLBACK (IntPtr sound, IntPtr data, uint datalen); public delegate RESULT SOUND_PCMSETPOS_CALLBACK (IntPtr sound, int subsound, uint position, TIMEUNIT postype); public delegate RESULT FILE_OPEN_CALLBACK (IntPtr name, ref uint filesize, ref IntPtr handle, IntPtr userdata); public delegate RESULT FILE_CLOSE_CALLBACK (IntPtr handle, IntPtr userdata); public delegate RESULT FILE_READ_CALLBACK (IntPtr handle, IntPtr buffer, uint sizebytes, ref uint bytesread, IntPtr userdata); public delegate RESULT FILE_SEEK_CALLBACK (IntPtr handle, uint pos, IntPtr userdata); public delegate RESULT FILE_ASYNCREAD_CALLBACK (IntPtr info, IntPtr userdata); public delegate RESULT FILE_ASYNCCANCEL_CALLBACK(IntPtr info, IntPtr userdata); public delegate void FILE_ASYNCDONE_FUNC (IntPtr info, RESULT result); public delegate IntPtr MEMORY_ALLOC_CALLBACK (uint size, MEMORY_TYPE type, IntPtr sourcestr); public delegate IntPtr MEMORY_REALLOC_CALLBACK (IntPtr ptr, uint size, MEMORY_TYPE type, IntPtr sourcestr); public delegate void MEMORY_FREE_CALLBACK (IntPtr ptr, MEMORY_TYPE type, IntPtr sourcestr); public delegate float CB_3D_ROLLOFF_CALLBACK (IntPtr channelcontrol, float distance); public enum DSP_RESAMPLER : int { DEFAULT, NOINTERP, LINEAR, CUBIC, SPLINE, MAX, } public enum DSP_CALLBACK_TYPE : int { DATAPARAMETERRELEASE, MAX, } public enum DSPCONNECTION_TYPE : int { STANDARD, SIDECHAIN, SEND, SEND_SIDECHAIN, MAX, } public enum TAGTYPE : int { UNKNOWN = 0, ID3V1, ID3V2, VORBISCOMMENT, SHOUTCAST, ICECAST, ASF, MIDI, PLAYLIST, FMOD, USER, MAX } public enum TAGDATATYPE : int { BINARY = 0, INT, FLOAT, STRING, STRING_UTF16, STRING_UTF16BE, STRING_UTF8, MAX } [StructLayout(LayoutKind.Sequential)] public struct TAG { public TAGTYPE type; public TAGDATATYPE datatype; public StringWrapper name; public IntPtr data; public uint datalen; public bool updated; } [Flags] public enum TIMEUNIT : uint { MS = 0x00000001, PCM = 0x00000002, PCMBYTES = 0x00000004, RAWBYTES = 0x00000008, PCMFRACTION = 0x00000010, MODORDER = 0x00000100, MODROW = 0x00000200, MODPATTERN = 0x00000400, } public struct PORT_INDEX { public const ulong NONE = 0xFFFFFFFFFFFFFFFF; } [StructLayout(LayoutKind.Sequential)] public struct CREATESOUNDEXINFO { public int cbsize; public uint length; public uint fileoffset; public int numchannels; public int defaultfrequency; public SOUND_FORMAT format; public uint decodebuffersize; public int initialsubsound; public int numsubsounds; public IntPtr inclusionlist; public int inclusionlistnum; public IntPtr pcmreadcallback_internal; public IntPtr pcmsetposcallback_internal; public IntPtr nonblockcallback_internal; public IntPtr dlsname; public IntPtr encryptionkey; public int maxpolyphony; public IntPtr userdata; public SOUND_TYPE suggestedsoundtype; public IntPtr fileuseropen_internal; public IntPtr fileuserclose_internal; public IntPtr fileuserread_internal; public IntPtr fileuserseek_internal; public IntPtr fileuserasyncread_internal; public IntPtr fileuserasynccancel_internal; public IntPtr fileuserdata; public int filebuffersize; public CHANNELORDER channelorder; public IntPtr initialsoundgroup; public uint initialseekposition; public TIMEUNIT initialseekpostype; public int ignoresetfilesystem; public uint audioqueuepolicy; public uint minmidigranularity; public int nonblockthreadid; public IntPtr fsbguid; public SOUND_PCMREAD_CALLBACK pcmreadcallback { set { pcmreadcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return pcmreadcallback_internal == IntPtr.Zero ? null : (SOUND_PCMREAD_CALLBACK)Marshal.GetDelegateForFunctionPointer(pcmreadcallback_internal, typeof(SOUND_PCMREAD_CALLBACK)); } } public SOUND_PCMSETPOS_CALLBACK pcmsetposcallback { set { pcmsetposcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return pcmsetposcallback_internal == IntPtr.Zero ? null : (SOUND_PCMSETPOS_CALLBACK)Marshal.GetDelegateForFunctionPointer(pcmsetposcallback_internal, typeof(SOUND_PCMSETPOS_CALLBACK)); } } public SOUND_NONBLOCK_CALLBACK nonblockcallback { set { nonblockcallback_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return nonblockcallback_internal == IntPtr.Zero ? null : (SOUND_NONBLOCK_CALLBACK)Marshal.GetDelegateForFunctionPointer(nonblockcallback_internal, typeof(SOUND_NONBLOCK_CALLBACK)); } } public FILE_OPEN_CALLBACK fileuseropen { set { fileuseropen_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuseropen_internal == IntPtr.Zero ? null : (FILE_OPEN_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuseropen_internal, typeof(FILE_OPEN_CALLBACK)); } } public FILE_CLOSE_CALLBACK fileuserclose { set { fileuserclose_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuserclose_internal == IntPtr.Zero ? null : (FILE_CLOSE_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserclose_internal, typeof(FILE_CLOSE_CALLBACK)); } } public FILE_READ_CALLBACK fileuserread { set { fileuserread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuserread_internal == IntPtr.Zero ? null : (FILE_READ_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserread_internal, typeof(FILE_READ_CALLBACK)); } } public FILE_SEEK_CALLBACK fileuserseek { set { fileuserseek_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuserseek_internal == IntPtr.Zero ? null : (FILE_SEEK_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserseek_internal, typeof(FILE_SEEK_CALLBACK)); } } public FILE_ASYNCREAD_CALLBACK fileuserasyncread { set { fileuserasyncread_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuserasyncread_internal == IntPtr.Zero ? null : (FILE_ASYNCREAD_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserasyncread_internal, typeof(FILE_ASYNCREAD_CALLBACK)); } } public FILE_ASYNCCANCEL_CALLBACK fileuserasynccancel { set { fileuserasynccancel_internal = (value == null ? IntPtr.Zero : Marshal.GetFunctionPointerForDelegate(value)); } get { return fileuserasynccancel_internal == IntPtr.Zero ? null : (FILE_ASYNCCANCEL_CALLBACK)Marshal.GetDelegateForFunctionPointer(fileuserasynccancel_internal, typeof(FILE_ASYNCCANCEL_CALLBACK)); } } } #pragma warning disable 414 [StructLayout(LayoutKind.Sequential)] public struct REVERB_PROPERTIES { public float DecayTime; public float EarlyDelay; public float LateDelay; public float HFReference; public float HFDecayRatio; public float Diffusion; public float Density; public float LowShelfFrequency; public float LowShelfGain; public float HighCut; public float EarlyLateMix; public float WetLevel; #region wrapperinternal public REVERB_PROPERTIES(float decayTime, float earlyDelay, float lateDelay, float hfReference, float hfDecayRatio, float diffusion, float density, float lowShelfFrequency, float lowShelfGain, float highCut, float earlyLateMix, float wetLevel) { DecayTime = decayTime; EarlyDelay = earlyDelay; LateDelay = lateDelay; HFReference = hfReference; HFDecayRatio = hfDecayRatio; Diffusion = diffusion; Density = density; LowShelfFrequency = lowShelfFrequency; LowShelfGain = lowShelfGain; HighCut = highCut; EarlyLateMix = earlyLateMix; WetLevel = wetLevel; } #endregion } #pragma warning restore 414 public class PRESET { public static REVERB_PROPERTIES OFF() { return new REVERB_PROPERTIES( 1000, 7, 11, 5000, 100, 100, 100, 250, 0, 20, 96, -80.0f );} public static REVERB_PROPERTIES GENERIC() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 83, 100, 100, 250, 0, 14500, 96, -8.0f );} public static REVERB_PROPERTIES PADDEDCELL() { return new REVERB_PROPERTIES( 170, 1, 2, 5000, 10, 100, 100, 250, 0, 160, 84, -7.8f );} public static REVERB_PROPERTIES ROOM() { return new REVERB_PROPERTIES( 400, 2, 3, 5000, 83, 100, 100, 250, 0, 6050, 88, -9.4f );} public static REVERB_PROPERTIES BATHROOM() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 54, 100, 60, 250, 0, 2900, 83, 0.5f );} public static REVERB_PROPERTIES LIVINGROOM() { return new REVERB_PROPERTIES( 500, 3, 4, 5000, 10, 100, 100, 250, 0, 160, 58, -19.0f );} public static REVERB_PROPERTIES STONEROOM() { return new REVERB_PROPERTIES( 2300, 12, 17, 5000, 64, 100, 100, 250, 0, 7800, 71, -8.5f );} public static REVERB_PROPERTIES AUDITORIUM() { return new REVERB_PROPERTIES( 4300, 20, 30, 5000, 59, 100, 100, 250, 0, 5850, 64, -11.7f );} public static REVERB_PROPERTIES CONCERTHALL() { return new REVERB_PROPERTIES( 3900, 20, 29, 5000, 70, 100, 100, 250, 0, 5650, 80, -9.8f );} public static REVERB_PROPERTIES CAVE() { return new REVERB_PROPERTIES( 2900, 15, 22, 5000, 100, 100, 100, 250, 0, 20000, 59, -11.3f );} public static REVERB_PROPERTIES ARENA() { return new REVERB_PROPERTIES( 7200, 20, 30, 5000, 33, 100, 100, 250, 0, 4500, 80, -9.6f );} public static REVERB_PROPERTIES HANGAR() { return new REVERB_PROPERTIES( 10000, 20, 30, 5000, 23, 100, 100, 250, 0, 3400, 72, -7.4f );} public static REVERB_PROPERTIES CARPETTEDHALLWAY() { return new REVERB_PROPERTIES( 300, 2, 30, 5000, 10, 100, 100, 250, 0, 500, 56, -24.0f );} public static REVERB_PROPERTIES HALLWAY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 59, 100, 100, 250, 0, 7800, 87, -5.5f );} public static REVERB_PROPERTIES STONECORRIDOR() { return new REVERB_PROPERTIES( 270, 13, 20, 5000, 79, 100, 100, 250, 0, 9000, 86, -6.0f );} public static REVERB_PROPERTIES ALLEY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 86, 100, 100, 250, 0, 8300, 80, -9.8f );} public static REVERB_PROPERTIES FOREST() { return new REVERB_PROPERTIES( 1500, 162, 88, 5000, 54, 79, 100, 250, 0, 760, 94, -12.3f );} public static REVERB_PROPERTIES CITY() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 67, 50, 100, 250, 0, 4050, 66, -26.0f );} public static REVERB_PROPERTIES MOUNTAINS() { return new REVERB_PROPERTIES( 1500, 300, 100, 5000, 21, 27, 100, 250, 0, 1220, 82, -24.0f );} public static REVERB_PROPERTIES QUARRY() { return new REVERB_PROPERTIES( 1500, 61, 25, 5000, 83, 100, 100, 250, 0, 3400, 100, -5.0f );} public static REVERB_PROPERTIES PLAIN() { return new REVERB_PROPERTIES( 1500, 179, 100, 5000, 50, 21, 100, 250, 0, 1670, 65, -28.0f );} public static REVERB_PROPERTIES PARKINGLOT() { return new REVERB_PROPERTIES( 1700, 8, 12, 5000, 100, 100, 100, 250, 0, 20000, 56, -19.5f );} public static REVERB_PROPERTIES SEWERPIPE() { return new REVERB_PROPERTIES( 2800, 14, 21, 5000, 14, 80, 60, 250, 0, 3400, 66, 1.2f );} public static REVERB_PROPERTIES UNDERWATER() { return new REVERB_PROPERTIES( 1500, 7, 11, 5000, 10, 100, 100, 250, 0, 500, 92, 7.0f );} } [StructLayout(LayoutKind.Sequential)] public struct ADVANCEDSETTINGS { public int cbSize; public int maxMPEGCodecs; public int maxADPCMCodecs; public int maxXMACodecs; public int maxVorbisCodecs; public int maxAT9Codecs; public int maxFADPCMCodecs; public int maxOpusCodecs; public int ASIONumChannels; public IntPtr ASIOChannelList; public IntPtr ASIOSpeakerList; public float vol0virtualvol; public uint defaultDecodeBufferSize; public ushort profilePort; public uint geometryMaxFadeTime; public float distanceFilterCenterFreq; public int reverb3Dinstance; public int DSPBufferPoolSize; public DSP_RESAMPLER resamplerMethod; public uint randomSeed; public int maxConvolutionThreads; public int maxSpatialObjects; } [Flags] public enum DRIVER_STATE : uint { CONNECTED = 0x00000001, DEFAULT = 0x00000002, } public enum THREAD_PRIORITY : int { /* Platform specific priority range */ PLATFORM_MIN = -32 * 1024, PLATFORM_MAX = 32 * 1024, /* Platform agnostic priorities, maps internally to platform specific value */ DEFAULT = PLATFORM_MIN - 1, LOW = PLATFORM_MIN - 2, MEDIUM = PLATFORM_MIN - 3, HIGH = PLATFORM_MIN - 4, VERY_HIGH = PLATFORM_MIN - 5, EXTREME = PLATFORM_MIN - 6, CRITICAL = PLATFORM_MIN - 7, /* Thread defaults */ MIXER = EXTREME, FEEDER = CRITICAL, STREAM = VERY_HIGH, FILE = HIGH, NONBLOCKING = HIGH, RECORD = HIGH, GEOMETRY = LOW, PROFILER = MEDIUM, STUDIO_UPDATE = MEDIUM, STUDIO_LOAD_BANK = MEDIUM, STUDIO_LOAD_SAMPLE = MEDIUM, CONVOLUTION1 = VERY_HIGH, CONVOLUTION2 = VERY_HIGH } public enum THREAD_STACK_SIZE : uint { DEFAULT = 0, MIXER = 80 * 1024, FEEDER = 16 * 1024, STREAM = 96 * 1024, FILE = 64 * 1024, NONBLOCKING = 112 * 1024, RECORD = 16 * 1024, GEOMETRY = 48 * 1024, PROFILER = 128 * 1024, STUDIO_UPDATE = 96 * 1024, STUDIO_LOAD_BANK = 96 * 1024, STUDIO_LOAD_SAMPLE = 96 * 1024, CONVOLUTION1 = 16 * 1024, CONVOLUTION2 = 16 * 1024 } [Flags] public enum THREAD_AFFINITY : long { /* Platform agnostic thread groupings */ GROUP_DEFAULT = 0x4000000000000000, GROUP_A = 0x4000000000000001, GROUP_B = 0x4000000000000002, GROUP_C = 0x4000000000000003, /* Thread defaults */ MIXER = GROUP_A, FEEDER = GROUP_C, STREAM = GROUP_C, FILE = GROUP_C, NONBLOCKING = GROUP_C, RECORD = GROUP_C, GEOMETRY = GROUP_C, PROFILER = GROUP_C, STUDIO_UPDATE = GROUP_B, STUDIO_LOAD_BANK = GROUP_C, STUDIO_LOAD_SAMPLE = GROUP_C, CONVOLUTION1 = GROUP_C, CONVOLUTION2 = GROUP_C, /* Core mask, valid up to 1 << 61 */ CORE_ALL = 0, CORE_0 = 1 << 0, CORE_1 = 1 << 1, CORE_2 = 1 << 2, CORE_3 = 1 << 3, CORE_4 = 1 << 4, CORE_5 = 1 << 5, CORE_6 = 1 << 6, CORE_7 = 1 << 7, CORE_8 = 1 << 8, CORE_9 = 1 << 9, CORE_10 = 1 << 10, CORE_11 = 1 << 11, CORE_12 = 1 << 12, CORE_13 = 1 << 13, CORE_14 = 1 << 14, CORE_15 = 1 << 15 } public enum THREAD_TYPE : int { MIXER, FEEDER, STREAM, FILE, NONBLOCKING, RECORD, GEOMETRY, PROFILER, STUDIO_UPDATE, STUDIO_LOAD_BANK, STUDIO_LOAD_SAMPLE, CONVOLUTION1, CONVOLUTION2, MAX } /* FMOD System factory functions. Use this to create an FMOD System Instance. below you will see System init/close to get started. */ public struct Factory { public static RESULT System_Create(out System system) { return FMOD5_System_Create(out system.handle, VERSION.number); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Create(out IntPtr system, uint headerversion); #endregion } /* FMOD global system functions (optional). */ public struct Memory { public static RESULT Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags = MEMORY_TYPE.ALL) { return FMOD5_Memory_Initialize(poolmem, poollen, useralloc, userrealloc, userfree, memtypeflags); } public static RESULT GetStats(out int currentalloced, out int maxalloced, bool blocking = true) { return FMOD5_Memory_GetStats(out currentalloced, out maxalloced, blocking); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Memory_Initialize(IntPtr poolmem, int poollen, MEMORY_ALLOC_CALLBACK useralloc, MEMORY_REALLOC_CALLBACK userrealloc, MEMORY_FREE_CALLBACK userfree, MEMORY_TYPE memtypeflags); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Memory_GetStats (out int currentalloced, out int maxalloced, bool blocking); #endregion } public struct Debug { public static RESULT Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode = DEBUG_MODE.TTY, DEBUG_CALLBACK callback = null, string filename = null) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_Debug_Initialize(flags, mode, callback, encoder.byteFromStringUTF8(filename)); } } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Debug_Initialize(DEBUG_FLAGS flags, DEBUG_MODE mode, DEBUG_CALLBACK callback, byte[] filename); #endregion } public struct Thread { public static RESULT SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity = THREAD_AFFINITY.GROUP_DEFAULT, THREAD_PRIORITY priority = THREAD_PRIORITY.DEFAULT, THREAD_STACK_SIZE stacksize = THREAD_STACK_SIZE.DEFAULT) { return FMOD5_Thread_SetAttributes(type, affinity, priority, stacksize); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Thread_SetAttributes(THREAD_TYPE type, THREAD_AFFINITY affinity, THREAD_PRIORITY priority, THREAD_STACK_SIZE stacksize); #endregion } /* 'System' API. */ public struct System { public RESULT release() { return FMOD5_System_Release(this.handle); } // Setup functions. public RESULT setOutput(OUTPUTTYPE output) { return FMOD5_System_SetOutput(this.handle, output); } public RESULT getOutput(out OUTPUTTYPE output) { return FMOD5_System_GetOutput(this.handle, out output); } public RESULT getNumDrivers(out int numdrivers) { return FMOD5_System_GetNumDrivers(this.handle, out numdrivers); } public RESULT getDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_System_GetDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels); using (StringHelper.ThreadSafeEncoding encoding = StringHelper.GetFreeHelper()) { name = encoding.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels) { return FMOD5_System_GetDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels); } public RESULT setDriver(int driver) { return FMOD5_System_SetDriver(this.handle, driver); } public RESULT getDriver(out int driver) { return FMOD5_System_GetDriver(this.handle, out driver); } public RESULT setSoftwareChannels(int numsoftwarechannels) { return FMOD5_System_SetSoftwareChannels(this.handle, numsoftwarechannels); } public RESULT getSoftwareChannels(out int numsoftwarechannels) { return FMOD5_System_GetSoftwareChannels(this.handle, out numsoftwarechannels); } public RESULT setSoftwareFormat(int samplerate, SPEAKERMODE speakermode, int numrawspeakers) { return FMOD5_System_SetSoftwareFormat(this.handle, samplerate, speakermode, numrawspeakers); } public RESULT getSoftwareFormat(out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers) { return FMOD5_System_GetSoftwareFormat(this.handle, out samplerate, out speakermode, out numrawspeakers); } public RESULT setDSPBufferSize(uint bufferlength, int numbuffers) { return FMOD5_System_SetDSPBufferSize(this.handle, bufferlength, numbuffers); } public RESULT getDSPBufferSize(out uint bufferlength, out int numbuffers) { return FMOD5_System_GetDSPBufferSize(this.handle, out bufferlength, out numbuffers); } public RESULT setFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign) { return FMOD5_System_SetFileSystem(this.handle, useropen, userclose, userread, userseek, userasyncread, userasynccancel, blockalign); } public RESULT attachFileSystem(FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek) { return FMOD5_System_AttachFileSystem(this.handle, useropen, userclose, userread, userseek); } public RESULT setAdvancedSettings(ref ADVANCEDSETTINGS settings) { settings.cbSize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); return FMOD5_System_SetAdvancedSettings(this.handle, ref settings); } public RESULT getAdvancedSettings(ref ADVANCEDSETTINGS settings) { settings.cbSize = MarshalHelper.SizeOf(typeof(ADVANCEDSETTINGS)); return FMOD5_System_GetAdvancedSettings(this.handle, ref settings); } public RESULT setCallback(SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask = SYSTEM_CALLBACK_TYPE.ALL) { return FMOD5_System_SetCallback(this.handle, callback, callbackmask); } // Plug-in support. public RESULT setPluginPath(string path) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_SetPluginPath(this.handle, encoder.byteFromStringUTF8(path)); } } public RESULT loadPlugin(string filename, out uint handle, uint priority = 0) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_LoadPlugin(this.handle, encoder.byteFromStringUTF8(filename), out handle, priority); } } public RESULT unloadPlugin(uint handle) { return FMOD5_System_UnloadPlugin(this.handle, handle); } public RESULT getNumNestedPlugins(uint handle, out int count) { return FMOD5_System_GetNumNestedPlugins(this.handle, handle, out count); } public RESULT getNestedPlugin(uint handle, int index, out uint nestedhandle) { return FMOD5_System_GetNestedPlugin(this.handle, handle, index, out nestedhandle); } public RESULT getNumPlugins(PLUGINTYPE plugintype, out int numplugins) { return FMOD5_System_GetNumPlugins(this.handle, plugintype, out numplugins); } public RESULT getPluginHandle(PLUGINTYPE plugintype, int index, out uint handle) { return FMOD5_System_GetPluginHandle(this.handle, plugintype, index, out handle); } public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out string name, int namelen, out uint version) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, stringMem, namelen, out version); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getPluginInfo(uint handle, out PLUGINTYPE plugintype, out uint version) { return FMOD5_System_GetPluginInfo(this.handle, handle, out plugintype, IntPtr.Zero, 0, out version); } public RESULT setOutputByPlugin(uint handle) { return FMOD5_System_SetOutputByPlugin(this.handle, handle); } public RESULT getOutputByPlugin(out uint handle) { return FMOD5_System_GetOutputByPlugin(this.handle, out handle); } public RESULT createDSPByPlugin(uint handle, out DSP dsp) { return FMOD5_System_CreateDSPByPlugin(this.handle, handle, out dsp.handle); } public RESULT getDSPInfoByPlugin(uint handle, out IntPtr description) { return FMOD5_System_GetDSPInfoByPlugin(this.handle, handle, out description); } public RESULT registerDSP(ref DSP_DESCRIPTION description, out uint handle) { return FMOD5_System_RegisterDSP(this.handle, ref description, out handle); } // Init/Close. public RESULT init(int maxchannels, INITFLAGS flags, IntPtr extradriverdata) { return FMOD5_System_Init(this.handle, maxchannels, flags, extradriverdata); } public RESULT close() { return FMOD5_System_Close(this.handle); } // General post-init system functions. public RESULT update() { return FMOD5_System_Update(this.handle); } public RESULT setSpeakerPosition(SPEAKER speaker, float x, float y, bool active) { return FMOD5_System_SetSpeakerPosition(this.handle, speaker, x, y, active); } public RESULT getSpeakerPosition(SPEAKER speaker, out float x, out float y, out bool active) { return FMOD5_System_GetSpeakerPosition(this.handle, speaker, out x, out y, out active); } public RESULT setStreamBufferSize(uint filebuffersize, TIMEUNIT filebuffersizetype) { return FMOD5_System_SetStreamBufferSize(this.handle, filebuffersize, filebuffersizetype); } public RESULT getStreamBufferSize(out uint filebuffersize, out TIMEUNIT filebuffersizetype) { return FMOD5_System_GetStreamBufferSize(this.handle, out filebuffersize, out filebuffersizetype); } public RESULT set3DSettings(float dopplerscale, float distancefactor, float rolloffscale) { return FMOD5_System_Set3DSettings(this.handle, dopplerscale, distancefactor, rolloffscale); } public RESULT get3DSettings(out float dopplerscale, out float distancefactor, out float rolloffscale) { return FMOD5_System_Get3DSettings(this.handle, out dopplerscale, out distancefactor, out rolloffscale); } public RESULT set3DNumListeners(int numlisteners) { return FMOD5_System_Set3DNumListeners(this.handle, numlisteners); } public RESULT get3DNumListeners(out int numlisteners) { return FMOD5_System_Get3DNumListeners(this.handle, out numlisteners); } public RESULT set3DListenerAttributes(int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up) { return FMOD5_System_Set3DListenerAttributes(this.handle, listener, ref pos, ref vel, ref forward, ref up); } public RESULT get3DListenerAttributes(int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up) { return FMOD5_System_Get3DListenerAttributes(this.handle, listener, out pos, out vel, out forward, out up); } public RESULT set3DRolloffCallback(CB_3D_ROLLOFF_CALLBACK callback) { return FMOD5_System_Set3DRolloffCallback(this.handle, callback); } public RESULT mixerSuspend() { return FMOD5_System_MixerSuspend(this.handle); } public RESULT mixerResume() { return FMOD5_System_MixerResume(this.handle); } public RESULT getDefaultMixMatrix(SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop) { return FMOD5_System_GetDefaultMixMatrix(this.handle, sourcespeakermode, targetspeakermode, matrix, matrixhop); } public RESULT getSpeakerModeChannels(SPEAKERMODE mode, out int channels) { return FMOD5_System_GetSpeakerModeChannels(this.handle, mode, out channels); } // System information functions. public RESULT getVersion(out uint version) { uint buildnumber; return getVersion(out version, out buildnumber); } public RESULT getVersion(out uint version, out uint buildnumber) { return FMOD5_System_GetVersion(this.handle, out version, out buildnumber); } public RESULT getOutputHandle(out IntPtr handle) { return FMOD5_System_GetOutputHandle(this.handle, out handle); } public RESULT getChannelsPlaying(out int channels) { return FMOD5_System_GetChannelsPlaying(this.handle, out channels, IntPtr.Zero); } public RESULT getChannelsPlaying(out int channels, out int realchannels) { return FMOD5_System_GetChannelsPlaying(this.handle, out channels, out realchannels); } public RESULT getCPUUsage(out CPU_USAGE usage) { return FMOD5_System_GetCPUUsage(this.handle, out usage); } public RESULT getFileUsage(out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead) { return FMOD5_System_GetFileUsage(this.handle, out sampleBytesRead, out streamBytesRead, out otherBytesRead); } // Sound/DSP/Channel/FX creation and retrieval. public RESULT createSound(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_CreateSound(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); } } public RESULT createSound(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { return FMOD5_System_CreateSound(this.handle, data, mode, ref exinfo, out sound.handle); } public RESULT createSound(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { return FMOD5_System_CreateSound(this.handle, name_or_data, mode, ref exinfo, out sound.handle); } public RESULT createSound(string name, MODE mode, out Sound sound) { CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); exinfo.cbsize = MarshalHelper.SizeOf(typeof(CREATESOUNDEXINFO)); return createSound(name, mode, ref exinfo, out sound); } public RESULT createStream(string name, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_CreateStream(this.handle, encoder.byteFromStringUTF8(name), mode, ref exinfo, out sound.handle); } } public RESULT createStream(byte[] data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { return FMOD5_System_CreateStream(this.handle, data, mode, ref exinfo, out sound.handle); } public RESULT createStream(IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out Sound sound) { return FMOD5_System_CreateStream(this.handle, name_or_data, mode, ref exinfo, out sound.handle); } public RESULT createStream(string name, MODE mode, out Sound sound) { CREATESOUNDEXINFO exinfo = new CREATESOUNDEXINFO(); exinfo.cbsize = MarshalHelper.SizeOf(typeof(CREATESOUNDEXINFO)); return createStream(name, mode, ref exinfo, out sound); } public RESULT createDSP(ref DSP_DESCRIPTION description, out DSP dsp) { return FMOD5_System_CreateDSP(this.handle, ref description, out dsp.handle); } public RESULT createDSPByType(DSP_TYPE type, out DSP dsp) { return FMOD5_System_CreateDSPByType(this.handle, type, out dsp.handle); } public RESULT createChannelGroup(string name, out ChannelGroup channelgroup) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_CreateChannelGroup(this.handle, encoder.byteFromStringUTF8(name), out channelgroup.handle); } } public RESULT createSoundGroup(string name, out SoundGroup soundgroup) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_CreateSoundGroup(this.handle, encoder.byteFromStringUTF8(name), out soundgroup.handle); } } public RESULT createReverb3D(out Reverb3D reverb) { return FMOD5_System_CreateReverb3D(this.handle, out reverb.handle); } public RESULT playSound(Sound sound, ChannelGroup channelgroup, bool paused, out Channel channel) { return FMOD5_System_PlaySound(this.handle, sound.handle, channelgroup.handle, paused, out channel.handle); } public RESULT playDSP(DSP dsp, ChannelGroup channelgroup, bool paused, out Channel channel) { return FMOD5_System_PlayDSP(this.handle, dsp.handle, channelgroup.handle, paused, out channel.handle); } public RESULT getChannel(int channelid, out Channel channel) { return FMOD5_System_GetChannel(this.handle, channelid, out channel.handle); } public RESULT getDSPInfoByType(DSP_TYPE type, out IntPtr description) { return FMOD5_System_GetDSPInfoByType(this.handle, type, out description); } public RESULT getMasterChannelGroup(out ChannelGroup channelgroup) { return FMOD5_System_GetMasterChannelGroup(this.handle, out channelgroup.handle); } public RESULT getMasterSoundGroup(out SoundGroup soundgroup) { return FMOD5_System_GetMasterSoundGroup(this.handle, out soundgroup.handle); } // Routing to ports. public RESULT attachChannelGroupToPort(PORT_TYPE portType, ulong portIndex, ChannelGroup channelgroup, bool passThru = false) { return FMOD5_System_AttachChannelGroupToPort(this.handle, portType, portIndex, channelgroup.handle, passThru); } public RESULT detachChannelGroupFromPort(ChannelGroup channelgroup) { return FMOD5_System_DetachChannelGroupFromPort(this.handle, channelgroup.handle); } // Reverb api. public RESULT setReverbProperties(int instance, ref REVERB_PROPERTIES prop) { return FMOD5_System_SetReverbProperties(this.handle, instance, ref prop); } public RESULT getReverbProperties(int instance, out REVERB_PROPERTIES prop) { return FMOD5_System_GetReverbProperties(this.handle, instance, out prop); } // System level DSP functionality. public RESULT lockDSP() { return FMOD5_System_LockDSP(this.handle); } public RESULT unlockDSP() { return FMOD5_System_UnlockDSP(this.handle); } // Recording api public RESULT getRecordNumDrivers(out int numdrivers, out int numconnected) { return FMOD5_System_GetRecordNumDrivers(this.handle, out numdrivers, out numconnected); } public RESULT getRecordDriverInfo(int id, out string name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_System_GetRecordDriverInfo(this.handle, id, stringMem, namelen, out guid, out systemrate, out speakermode, out speakermodechannels, out state); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getRecordDriverInfo(int id, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state) { return FMOD5_System_GetRecordDriverInfo(this.handle, id, IntPtr.Zero, 0, out guid, out systemrate, out speakermode, out speakermodechannels, out state); } public RESULT getRecordPosition(int id, out uint position) { return FMOD5_System_GetRecordPosition(this.handle, id, out position); } public RESULT recordStart(int id, Sound sound, bool loop) { return FMOD5_System_RecordStart(this.handle, id, sound.handle, loop); } public RESULT recordStop(int id) { return FMOD5_System_RecordStop(this.handle, id); } public RESULT isRecording(int id, out bool recording) { return FMOD5_System_IsRecording(this.handle, id, out recording); } // Geometry api public RESULT createGeometry(int maxpolygons, int maxvertices, out Geometry geometry) { return FMOD5_System_CreateGeometry(this.handle, maxpolygons, maxvertices, out geometry.handle); } public RESULT setGeometrySettings(float maxworldsize) { return FMOD5_System_SetGeometrySettings(this.handle, maxworldsize); } public RESULT getGeometrySettings(out float maxworldsize) { return FMOD5_System_GetGeometrySettings(this.handle, out maxworldsize); } public RESULT loadGeometry(IntPtr data, int datasize, out Geometry geometry) { return FMOD5_System_LoadGeometry(this.handle, data, datasize, out geometry.handle); } public RESULT getGeometryOcclusion(ref VECTOR listener, ref VECTOR source, out float direct, out float reverb) { return FMOD5_System_GetGeometryOcclusion(this.handle, ref listener, ref source, out direct, out reverb); } // Network functions public RESULT setNetworkProxy(string proxy) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_System_SetNetworkProxy(this.handle, encoder.byteFromStringUTF8(proxy)); } } public RESULT getNetworkProxy(out string proxy, int proxylen) { IntPtr stringMem = Marshal.AllocHGlobal(proxylen); RESULT result = FMOD5_System_GetNetworkProxy(this.handle, stringMem, proxylen); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { proxy = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT setNetworkTimeout(int timeout) { return FMOD5_System_SetNetworkTimeout(this.handle, timeout); } public RESULT getNetworkTimeout(out int timeout) { return FMOD5_System_GetNetworkTimeout(this.handle, out timeout); } // Userdata set/get public RESULT setUserData(IntPtr userdata) { return FMOD5_System_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_System_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Release (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetOutput (IntPtr system, OUTPUTTYPE output); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetOutput (IntPtr system, out OUTPUTTYPE output); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNumDrivers (IntPtr system, out int numdrivers); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetDriver (IntPtr system, int driver); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDriver (IntPtr system, out int driver); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetSoftwareChannels (IntPtr system, int numsoftwarechannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetSoftwareChannels (IntPtr system, out int numsoftwarechannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetSoftwareFormat (IntPtr system, int samplerate, SPEAKERMODE speakermode, int numrawspeakers); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetSoftwareFormat (IntPtr system, out int samplerate, out SPEAKERMODE speakermode, out int numrawspeakers); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetDSPBufferSize (IntPtr system, uint bufferlength, int numbuffers); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDSPBufferSize (IntPtr system, out uint bufferlength, out int numbuffers); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek, FILE_ASYNCREAD_CALLBACK userasyncread, FILE_ASYNCCANCEL_CALLBACK userasynccancel, int blockalign); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_AttachFileSystem (IntPtr system, FILE_OPEN_CALLBACK useropen, FILE_CLOSE_CALLBACK userclose, FILE_READ_CALLBACK userread, FILE_SEEK_CALLBACK userseek); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetAdvancedSettings (IntPtr system, ref ADVANCEDSETTINGS settings); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetCallback (IntPtr system, SYSTEM_CALLBACK callback, SYSTEM_CALLBACK_TYPE callbackmask); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetPluginPath (IntPtr system, byte[] path); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_LoadPlugin (IntPtr system, byte[] filename, out uint handle, uint priority); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_UnloadPlugin (IntPtr system, uint handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNumNestedPlugins (IntPtr system, uint handle, out int count); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNestedPlugin (IntPtr system, uint handle, int index, out uint nestedhandle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNumPlugins (IntPtr system, PLUGINTYPE plugintype, out int numplugins); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetPluginHandle (IntPtr system, PLUGINTYPE plugintype, int index, out uint handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetPluginInfo (IntPtr system, uint handle, out PLUGINTYPE plugintype, IntPtr name, int namelen, out uint version); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetOutputByPlugin (IntPtr system, uint handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetOutputByPlugin (IntPtr system, out uint handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateDSPByPlugin (IntPtr system, uint handle, out IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDSPInfoByPlugin (IntPtr system, uint handle, out IntPtr description); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_RegisterDSP (IntPtr system, ref DSP_DESCRIPTION description, out uint handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Init (IntPtr system, int maxchannels, INITFLAGS flags, IntPtr extradriverdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Close (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Update (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetSpeakerPosition (IntPtr system, SPEAKER speaker, float x, float y, bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetSpeakerPosition (IntPtr system, SPEAKER speaker, out float x, out float y, out bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetStreamBufferSize (IntPtr system, uint filebuffersize, TIMEUNIT filebuffersizetype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetStreamBufferSize (IntPtr system, out uint filebuffersize, out TIMEUNIT filebuffersizetype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Set3DSettings (IntPtr system, float dopplerscale, float distancefactor, float rolloffscale); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Get3DSettings (IntPtr system, out float dopplerscale, out float distancefactor, out float rolloffscale); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Set3DNumListeners (IntPtr system, int numlisteners); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Get3DNumListeners (IntPtr system, out int numlisteners); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Set3DListenerAttributes (IntPtr system, int listener, ref VECTOR pos, ref VECTOR vel, ref VECTOR forward, ref VECTOR up); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Get3DListenerAttributes (IntPtr system, int listener, out VECTOR pos, out VECTOR vel, out VECTOR forward, out VECTOR up); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_Set3DRolloffCallback (IntPtr system, CB_3D_ROLLOFF_CALLBACK callback); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_MixerSuspend (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_MixerResume (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDefaultMixMatrix (IntPtr system, SPEAKERMODE sourcespeakermode, SPEAKERMODE targetspeakermode, float[] matrix, int matrixhop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetSpeakerModeChannels (IntPtr system, SPEAKERMODE mode, out int channels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetVersion (IntPtr system, out uint version, out uint buildnumber); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetOutputHandle (IntPtr system, out IntPtr handle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, IntPtr zero); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetChannelsPlaying (IntPtr system, out int channels, out int realchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetCPUUsage (IntPtr system, out CPU_USAGE usage); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetFileUsage (IntPtr system, out Int64 sampleBytesRead, out Int64 streamBytesRead, out Int64 otherBytesRead); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateSound (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateSound (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateStream (IntPtr system, byte[] name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateStream (IntPtr system, IntPtr name_or_data, MODE mode, ref CREATESOUNDEXINFO exinfo, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateDSP (IntPtr system, ref DSP_DESCRIPTION description, out IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateDSPByType (IntPtr system, DSP_TYPE type, out IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateChannelGroup (IntPtr system, byte[] name, out IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateSoundGroup (IntPtr system, byte[] name, out IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateReverb3D (IntPtr system, out IntPtr reverb); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_PlaySound (IntPtr system, IntPtr sound, IntPtr channelgroup, bool paused, out IntPtr channel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_PlayDSP (IntPtr system, IntPtr dsp, IntPtr channelgroup, bool paused, out IntPtr channel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetChannel (IntPtr system, int channelid, out IntPtr channel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetDSPInfoByType (IntPtr system, DSP_TYPE type, out IntPtr description); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetMasterChannelGroup (IntPtr system, out IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetMasterSoundGroup (IntPtr system, out IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_AttachChannelGroupToPort (IntPtr system, PORT_TYPE portType, ulong portIndex, IntPtr channelgroup, bool passThru); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_DetachChannelGroupFromPort(IntPtr system, IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetReverbProperties (IntPtr system, int instance, ref REVERB_PROPERTIES prop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetReverbProperties (IntPtr system, int instance, out REVERB_PROPERTIES prop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_LockDSP (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_UnlockDSP (IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetRecordNumDrivers (IntPtr system, out int numdrivers, out int numconnected); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetRecordDriverInfo (IntPtr system, int id, IntPtr name, int namelen, out Guid guid, out int systemrate, out SPEAKERMODE speakermode, out int speakermodechannels, out DRIVER_STATE state); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetRecordPosition (IntPtr system, int id, out uint position); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_RecordStart (IntPtr system, int id, IntPtr sound, bool loop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_RecordStop (IntPtr system, int id); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_IsRecording (IntPtr system, int id, out bool recording); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_CreateGeometry (IntPtr system, int maxpolygons, int maxvertices, out IntPtr geometry); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetGeometrySettings (IntPtr system, float maxworldsize); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetGeometrySettings (IntPtr system, out float maxworldsize); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_LoadGeometry (IntPtr system, IntPtr data, int datasize, out IntPtr geometry); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetGeometryOcclusion (IntPtr system, ref VECTOR listener, ref VECTOR source, out float direct, out float reverb); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetNetworkProxy (IntPtr system, byte[] proxy); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNetworkProxy (IntPtr system, IntPtr proxy, int proxylen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetNetworkTimeout (IntPtr system, int timeout); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetNetworkTimeout (IntPtr system, out int timeout); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_SetUserData (IntPtr system, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_System_GetUserData (IntPtr system, out IntPtr userdata); #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; } #endregion } /* 'Sound' API. */ public struct Sound { public RESULT release() { return FMOD5_Sound_Release(this.handle); } public RESULT getSystemObject(out System system) { return FMOD5_Sound_GetSystemObject(this.handle, out system.handle); } // Standard sound manipulation functions. public RESULT @lock(uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2) { return FMOD5_Sound_Lock(this.handle, offset, length, out ptr1, out ptr2, out len1, out len2); } public RESULT unlock(IntPtr ptr1, IntPtr ptr2, uint len1, uint len2) { return FMOD5_Sound_Unlock(this.handle, ptr1, ptr2, len1, len2); } public RESULT setDefaults(float frequency, int priority) { return FMOD5_Sound_SetDefaults(this.handle, frequency, priority); } public RESULT getDefaults(out float frequency, out int priority) { return FMOD5_Sound_GetDefaults(this.handle, out frequency, out priority); } public RESULT set3DMinMaxDistance(float min, float max) { return FMOD5_Sound_Set3DMinMaxDistance(this.handle, min, max); } public RESULT get3DMinMaxDistance(out float min, out float max) { return FMOD5_Sound_Get3DMinMaxDistance(this.handle, out min, out max); } public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) { return FMOD5_Sound_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); } public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) { return FMOD5_Sound_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); } public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) { return FMOD5_Sound_Set3DCustomRolloff(this.handle, ref points, numpoints); } public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) { return FMOD5_Sound_Get3DCustomRolloff(this.handle, out points, out numpoints); } public RESULT getSubSound(int index, out Sound subsound) { return FMOD5_Sound_GetSubSound(this.handle, index, out subsound.handle); } public RESULT getSubSoundParent(out Sound parentsound) { return FMOD5_Sound_GetSubSoundParent(this.handle, out parentsound.handle); } public RESULT getName(out string name, int namelen) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_Sound_GetName(this.handle, stringMem, namelen); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getLength(out uint length, TIMEUNIT lengthtype) { return FMOD5_Sound_GetLength(this.handle, out length, lengthtype); } public RESULT getFormat(out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits) { return FMOD5_Sound_GetFormat(this.handle, out type, out format, out channels, out bits); } public RESULT getNumSubSounds(out int numsubsounds) { return FMOD5_Sound_GetNumSubSounds(this.handle, out numsubsounds); } public RESULT getNumTags(out int numtags, out int numtagsupdated) { return FMOD5_Sound_GetNumTags(this.handle, out numtags, out numtagsupdated); } public RESULT getTag(string name, int index, out TAG tag) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_Sound_GetTag(this.handle, encoder.byteFromStringUTF8(name), index, out tag); } } public RESULT getOpenState(out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy) { return FMOD5_Sound_GetOpenState(this.handle, out openstate, out percentbuffered, out starving, out diskbusy); } public RESULT readData(byte[] buffer) { return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, IntPtr.Zero); } public RESULT readData(byte[] buffer, out uint read) { return FMOD5_Sound_ReadData(this.handle, buffer, (uint)buffer.Length, out read); } public RESULT seekData(uint pcm) { return FMOD5_Sound_SeekData(this.handle, pcm); } public RESULT setSoundGroup(SoundGroup soundgroup) { return FMOD5_Sound_SetSoundGroup(this.handle, soundgroup.handle); } public RESULT getSoundGroup(out SoundGroup soundgroup) { return FMOD5_Sound_GetSoundGroup(this.handle, out soundgroup.handle); } // Synchronization point API. These points can come from markers embedded in wav files, and can also generate channel callbacks. public RESULT getNumSyncPoints(out int numsyncpoints) { return FMOD5_Sound_GetNumSyncPoints(this.handle, out numsyncpoints); } public RESULT getSyncPoint(int index, out IntPtr point) { return FMOD5_Sound_GetSyncPoint(this.handle, index, out point); } public RESULT getSyncPointInfo(IntPtr point, out string name, int namelen, out uint offset, TIMEUNIT offsettype) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_Sound_GetSyncPointInfo(this.handle, point, stringMem, namelen, out offset, offsettype); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getSyncPointInfo(IntPtr point, out uint offset, TIMEUNIT offsettype) { return FMOD5_Sound_GetSyncPointInfo(this.handle, point, IntPtr.Zero, 0, out offset, offsettype); } public RESULT addSyncPoint(uint offset, TIMEUNIT offsettype, string name, out IntPtr point) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return FMOD5_Sound_AddSyncPoint(this.handle, offset, offsettype, encoder.byteFromStringUTF8(name), out point); } } public RESULT deleteSyncPoint(IntPtr point) { return FMOD5_Sound_DeleteSyncPoint(this.handle, point); } // Functions also in Channel class but here they are the 'default' to save having to change it in Channel all the time. public RESULT setMode(MODE mode) { return FMOD5_Sound_SetMode(this.handle, mode); } public RESULT getMode(out MODE mode) { return FMOD5_Sound_GetMode(this.handle, out mode); } public RESULT setLoopCount(int loopcount) { return FMOD5_Sound_SetLoopCount(this.handle, loopcount); } public RESULT getLoopCount(out int loopcount) { return FMOD5_Sound_GetLoopCount(this.handle, out loopcount); } public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) { return FMOD5_Sound_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); } public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) { return FMOD5_Sound_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); } // For MOD/S3M/XM/IT/MID sequenced formats only. public RESULT getMusicNumChannels(out int numchannels) { return FMOD5_Sound_GetMusicNumChannels(this.handle, out numchannels); } public RESULT setMusicChannelVolume(int channel, float volume) { return FMOD5_Sound_SetMusicChannelVolume(this.handle, channel, volume); } public RESULT getMusicChannelVolume(int channel, out float volume) { return FMOD5_Sound_GetMusicChannelVolume(this.handle, channel, out volume); } public RESULT setMusicSpeed(float speed) { return FMOD5_Sound_SetMusicSpeed(this.handle, speed); } public RESULT getMusicSpeed(out float speed) { return FMOD5_Sound_GetMusicSpeed(this.handle, out speed); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_Sound_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_Sound_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Release (IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSystemObject (IntPtr sound, out IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Lock (IntPtr sound, uint offset, uint length, out IntPtr ptr1, out IntPtr ptr2, out uint len1, out uint len2); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Unlock (IntPtr sound, IntPtr ptr1, IntPtr ptr2, uint len1, uint len2); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetDefaults (IntPtr sound, float frequency, int priority); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetDefaults (IntPtr sound, out float frequency, out int priority); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Set3DMinMaxDistance (IntPtr sound, float min, float max); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Get3DMinMaxDistance (IntPtr sound, out float min, out float max); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Set3DConeSettings (IntPtr sound, float insideconeangle, float outsideconeangle, float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Get3DConeSettings (IntPtr sound, out float insideconeangle, out float outsideconeangle, out float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Set3DCustomRolloff (IntPtr sound, ref VECTOR points, int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_Get3DCustomRolloff (IntPtr sound, out IntPtr points, out int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSubSound (IntPtr sound, int index, out IntPtr subsound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSubSoundParent (IntPtr sound, out IntPtr parentsound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetName (IntPtr sound, IntPtr name, int namelen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetLength (IntPtr sound, out uint length, TIMEUNIT lengthtype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetFormat (IntPtr sound, out SOUND_TYPE type, out SOUND_FORMAT format, out int channels, out int bits); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetNumSubSounds (IntPtr sound, out int numsubsounds); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetNumTags (IntPtr sound, out int numtags, out int numtagsupdated); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetTag (IntPtr sound, byte[] name, int index, out TAG tag); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetOpenState (IntPtr sound, out OPENSTATE openstate, out uint percentbuffered, out bool starving, out bool diskbusy); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, IntPtr zero); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_ReadData (IntPtr sound, byte[] buffer, uint length, out uint read); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SeekData (IntPtr sound, uint pcm); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetSoundGroup (IntPtr sound, IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSoundGroup (IntPtr sound, out IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetNumSyncPoints (IntPtr sound, out int numsyncpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSyncPoint (IntPtr sound, int index, out IntPtr point); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetSyncPointInfo (IntPtr sound, IntPtr point, IntPtr name, int namelen, out uint offset, TIMEUNIT offsettype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_AddSyncPoint (IntPtr sound, uint offset, TIMEUNIT offsettype, byte[] name, out IntPtr point); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_DeleteSyncPoint (IntPtr sound, IntPtr point); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetMode (IntPtr sound, MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetMode (IntPtr sound, out MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetLoopCount (IntPtr sound, int loopcount); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetLoopCount (IntPtr sound, out int loopcount); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetLoopPoints (IntPtr sound, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetLoopPoints (IntPtr sound, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetMusicNumChannels (IntPtr sound, out int numchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetMusicChannelVolume (IntPtr sound, int channel, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetMusicChannelVolume (IntPtr sound, int channel, out float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetMusicSpeed (IntPtr sound, float speed); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetMusicSpeed (IntPtr sound, out float speed); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_SetUserData (IntPtr sound, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Sound_GetUserData (IntPtr sound, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public Sound(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'ChannelControl' API */ interface IChannelControl { RESULT getSystemObject (out System system); // General control functionality for Channels and ChannelGroups. RESULT stop (); RESULT setPaused (bool paused); RESULT getPaused (out bool paused); RESULT setVolume (float volume); RESULT getVolume (out float volume); RESULT setVolumeRamp (bool ramp); RESULT getVolumeRamp (out bool ramp); RESULT getAudibility (out float audibility); RESULT setPitch (float pitch); RESULT getPitch (out float pitch); RESULT setMute (bool mute); RESULT getMute (out bool mute); RESULT setReverbProperties (int instance, float wet); RESULT getReverbProperties (int instance, out float wet); RESULT setLowPassGain (float gain); RESULT getLowPassGain (out float gain); RESULT setMode (MODE mode); RESULT getMode (out MODE mode); RESULT setCallback (CHANNELCONTROL_CALLBACK callback); RESULT isPlaying (out bool isplaying); // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. RESULT setPan (float pan); RESULT setMixLevelsOutput (float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); RESULT setMixLevelsInput (float[] levels, int numlevels); RESULT setMixMatrix (float[] matrix, int outchannels, int inchannels, int inchannel_hop); RESULT getMixMatrix (float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); // Clock based functionality. RESULT getDSPClock (out ulong dspclock, out ulong parentclock); RESULT setDelay (ulong dspclock_start, ulong dspclock_end, bool stopchannels); RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end); RESULT getDelay (out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); RESULT addFadePoint (ulong dspclock, float volume); RESULT setFadePointRamp (ulong dspclock, float volume); RESULT removeFadePoints (ulong dspclock_start, ulong dspclock_end); RESULT getFadePoints (ref uint numpoints, ulong[] point_dspclock, float[] point_volume); // DSP effects. RESULT getDSP (int index, out DSP dsp); RESULT addDSP (int index, DSP dsp); RESULT removeDSP (DSP dsp); RESULT getNumDSPs (out int numdsps); RESULT setDSPIndex (DSP dsp, int index); RESULT getDSPIndex (DSP dsp, out int index); // 3D functionality. RESULT set3DAttributes (ref VECTOR pos, ref VECTOR vel); RESULT get3DAttributes (out VECTOR pos, out VECTOR vel); RESULT set3DMinMaxDistance (float mindistance, float maxdistance); RESULT get3DMinMaxDistance (out float mindistance, out float maxdistance); RESULT set3DConeSettings (float insideconeangle, float outsideconeangle, float outsidevolume); RESULT get3DConeSettings (out float insideconeangle, out float outsideconeangle, out float outsidevolume); RESULT set3DConeOrientation (ref VECTOR orientation); RESULT get3DConeOrientation (out VECTOR orientation); RESULT set3DCustomRolloff (ref VECTOR points, int numpoints); RESULT get3DCustomRolloff (out IntPtr points, out int numpoints); RESULT set3DOcclusion (float directocclusion, float reverbocclusion); RESULT get3DOcclusion (out float directocclusion, out float reverbocclusion); RESULT set3DSpread (float angle); RESULT get3DSpread (out float angle); RESULT set3DLevel (float level); RESULT get3DLevel (out float level); RESULT set3DDopplerLevel (float level); RESULT get3DDopplerLevel (out float level); RESULT set3DDistanceFilter (bool custom, float customLevel, float centerFreq); RESULT get3DDistanceFilter (out bool custom, out float customLevel, out float centerFreq); // Userdata set/get. RESULT setUserData (IntPtr userdata); RESULT getUserData (out IntPtr userdata); } /* 'Channel' API */ public struct Channel : IChannelControl { // Channel specific control functionality. public RESULT setFrequency(float frequency) { return FMOD5_Channel_SetFrequency(this.handle, frequency); } public RESULT getFrequency(out float frequency) { return FMOD5_Channel_GetFrequency(this.handle, out frequency); } public RESULT setPriority(int priority) { return FMOD5_Channel_SetPriority(this.handle, priority); } public RESULT getPriority(out int priority) { return FMOD5_Channel_GetPriority(this.handle, out priority); } public RESULT setPosition(uint position, TIMEUNIT postype) { return FMOD5_Channel_SetPosition(this.handle, position, postype); } public RESULT getPosition(out uint position, TIMEUNIT postype) { return FMOD5_Channel_GetPosition(this.handle, out position, postype); } public RESULT setChannelGroup(ChannelGroup channelgroup) { return FMOD5_Channel_SetChannelGroup(this.handle, channelgroup.handle); } public RESULT getChannelGroup(out ChannelGroup channelgroup) { return FMOD5_Channel_GetChannelGroup(this.handle, out channelgroup.handle); } public RESULT setLoopCount(int loopcount) { return FMOD5_Channel_SetLoopCount(this.handle, loopcount); } public RESULT getLoopCount(out int loopcount) { return FMOD5_Channel_GetLoopCount(this.handle, out loopcount); } public RESULT setLoopPoints(uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype) { return FMOD5_Channel_SetLoopPoints(this.handle, loopstart, loopstarttype, loopend, loopendtype); } public RESULT getLoopPoints(out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype) { return FMOD5_Channel_GetLoopPoints(this.handle, out loopstart, loopstarttype, out loopend, loopendtype); } // Information only functions. public RESULT isVirtual(out bool isvirtual) { return FMOD5_Channel_IsVirtual(this.handle, out isvirtual); } public RESULT getCurrentSound(out Sound sound) { return FMOD5_Channel_GetCurrentSound(this.handle, out sound.handle); } public RESULT getIndex(out int index) { return FMOD5_Channel_GetIndex(this.handle, out index); } public RESULT getSystemObject(out System system) { return FMOD5_Channel_GetSystemObject(this.handle, out system.handle); } // General control functionality for Channels and ChannelGroups. public RESULT stop() { return FMOD5_Channel_Stop(this.handle); } public RESULT setPaused(bool paused) { return FMOD5_Channel_SetPaused(this.handle, paused); } public RESULT getPaused(out bool paused) { return FMOD5_Channel_GetPaused(this.handle, out paused); } public RESULT setVolume(float volume) { return FMOD5_Channel_SetVolume(this.handle, volume); } public RESULT getVolume(out float volume) { return FMOD5_Channel_GetVolume(this.handle, out volume); } public RESULT setVolumeRamp(bool ramp) { return FMOD5_Channel_SetVolumeRamp(this.handle, ramp); } public RESULT getVolumeRamp(out bool ramp) { return FMOD5_Channel_GetVolumeRamp(this.handle, out ramp); } public RESULT getAudibility(out float audibility) { return FMOD5_Channel_GetAudibility(this.handle, out audibility); } public RESULT setPitch(float pitch) { return FMOD5_Channel_SetPitch(this.handle, pitch); } public RESULT getPitch(out float pitch) { return FMOD5_Channel_GetPitch(this.handle, out pitch); } public RESULT setMute(bool mute) { return FMOD5_Channel_SetMute(this.handle, mute); } public RESULT getMute(out bool mute) { return FMOD5_Channel_GetMute(this.handle, out mute); } public RESULT setReverbProperties(int instance, float wet) { return FMOD5_Channel_SetReverbProperties(this.handle, instance, wet); } public RESULT getReverbProperties(int instance, out float wet) { return FMOD5_Channel_GetReverbProperties(this.handle, instance, out wet); } public RESULT setLowPassGain(float gain) { return FMOD5_Channel_SetLowPassGain(this.handle, gain); } public RESULT getLowPassGain(out float gain) { return FMOD5_Channel_GetLowPassGain(this.handle, out gain); } public RESULT setMode(MODE mode) { return FMOD5_Channel_SetMode(this.handle, mode); } public RESULT getMode(out MODE mode) { return FMOD5_Channel_GetMode(this.handle, out mode); } public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) { return FMOD5_Channel_SetCallback(this.handle, callback); } public RESULT isPlaying(out bool isplaying) { return FMOD5_Channel_IsPlaying(this.handle, out isplaying); } // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. public RESULT setPan(float pan) { return FMOD5_Channel_SetPan(this.handle, pan); } public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) { return FMOD5_Channel_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); } public RESULT setMixLevelsInput(float[] levels, int numlevels) { return FMOD5_Channel_SetMixLevelsInput(this.handle, levels, numlevels); } public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) { return FMOD5_Channel_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); } public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) { return FMOD5_Channel_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); } // Clock based functionality. public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) { return FMOD5_Channel_GetDSPClock(this.handle, out dspclock, out parentclock); } public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels = true) { return FMOD5_Channel_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); } public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) { return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); } public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) { return FMOD5_Channel_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); } public RESULT addFadePoint(ulong dspclock, float volume) { return FMOD5_Channel_AddFadePoint(this.handle, dspclock, volume); } public RESULT setFadePointRamp(ulong dspclock, float volume) { return FMOD5_Channel_SetFadePointRamp(this.handle, dspclock, volume); } public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) { return FMOD5_Channel_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); } public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) { return FMOD5_Channel_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); } // DSP effects. public RESULT getDSP(int index, out DSP dsp) { return FMOD5_Channel_GetDSP(this.handle, index, out dsp.handle); } public RESULT addDSP(int index, DSP dsp) { return FMOD5_Channel_AddDSP(this.handle, index, dsp.handle); } public RESULT removeDSP(DSP dsp) { return FMOD5_Channel_RemoveDSP(this.handle, dsp.handle); } public RESULT getNumDSPs(out int numdsps) { return FMOD5_Channel_GetNumDSPs(this.handle, out numdsps); } public RESULT setDSPIndex(DSP dsp, int index) { return FMOD5_Channel_SetDSPIndex(this.handle, dsp.handle, index); } public RESULT getDSPIndex(DSP dsp, out int index) { return FMOD5_Channel_GetDSPIndex(this.handle, dsp.handle, out index); } // 3D functionality. public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) { return FMOD5_Channel_Set3DAttributes(this.handle, ref pos, ref vel); } public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) { return FMOD5_Channel_Get3DAttributes(this.handle, out pos, out vel); } public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) { return FMOD5_Channel_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); } public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) { return FMOD5_Channel_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); } public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) { return FMOD5_Channel_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); } public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) { return FMOD5_Channel_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); } public RESULT set3DConeOrientation(ref VECTOR orientation) { return FMOD5_Channel_Set3DConeOrientation(this.handle, ref orientation); } public RESULT get3DConeOrientation(out VECTOR orientation) { return FMOD5_Channel_Get3DConeOrientation(this.handle, out orientation); } public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) { return FMOD5_Channel_Set3DCustomRolloff(this.handle, ref points, numpoints); } public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) { return FMOD5_Channel_Get3DCustomRolloff(this.handle, out points, out numpoints); } public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) { return FMOD5_Channel_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); } public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) { return FMOD5_Channel_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); } public RESULT set3DSpread(float angle) { return FMOD5_Channel_Set3DSpread(this.handle, angle); } public RESULT get3DSpread(out float angle) { return FMOD5_Channel_Get3DSpread(this.handle, out angle); } public RESULT set3DLevel(float level) { return FMOD5_Channel_Set3DLevel(this.handle, level); } public RESULT get3DLevel(out float level) { return FMOD5_Channel_Get3DLevel(this.handle, out level); } public RESULT set3DDopplerLevel(float level) { return FMOD5_Channel_Set3DDopplerLevel(this.handle, level); } public RESULT get3DDopplerLevel(out float level) { return FMOD5_Channel_Get3DDopplerLevel(this.handle, out level); } public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) { return FMOD5_Channel_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); } public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) { return FMOD5_Channel_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_Channel_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_Channel_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetFrequency (IntPtr channel, float frequency); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetFrequency (IntPtr channel, out float frequency); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetPriority (IntPtr channel, int priority); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetPriority (IntPtr channel, out int priority); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetPosition (IntPtr channel, uint position, TIMEUNIT postype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetPosition (IntPtr channel, out uint position, TIMEUNIT postype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetChannelGroup (IntPtr channel, IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetChannelGroup (IntPtr channel, out IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetLoopCount (IntPtr channel, int loopcount); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetLoopCount (IntPtr channel, out int loopcount); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetLoopPoints (IntPtr channel, uint loopstart, TIMEUNIT loopstarttype, uint loopend, TIMEUNIT loopendtype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetLoopPoints (IntPtr channel, out uint loopstart, TIMEUNIT loopstarttype, out uint loopend, TIMEUNIT loopendtype); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_IsVirtual (IntPtr channel, out bool isvirtual); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetCurrentSound (IntPtr channel, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetIndex (IntPtr channel, out int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetSystemObject (IntPtr channel, out IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Stop (IntPtr channel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetPaused (IntPtr channel, bool paused); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetPaused (IntPtr channel, out bool paused); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetVolume (IntPtr channel, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetVolume (IntPtr channel, out float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetVolumeRamp (IntPtr channel, bool ramp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetVolumeRamp (IntPtr channel, out bool ramp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetAudibility (IntPtr channel, out float audibility); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetPitch (IntPtr channel, float pitch); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetPitch (IntPtr channel, out float pitch); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetMute (IntPtr channel, bool mute); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetMute (IntPtr channel, out bool mute); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetReverbProperties (IntPtr channel, int instance, float wet); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetReverbProperties (IntPtr channel, int instance, out float wet); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetLowPassGain (IntPtr channel, float gain); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetLowPassGain (IntPtr channel, out float gain); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetMode (IntPtr channel, MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetMode (IntPtr channel, out MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetCallback (IntPtr channel, CHANNELCONTROL_CALLBACK callback); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_IsPlaying (IntPtr channel, out bool isplaying); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetPan (IntPtr channel, float pan); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetMixLevelsOutput (IntPtr channel, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetMixLevelsInput (IntPtr channel, float[] levels, int numlevels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetMixMatrix (IntPtr channel, float[] matrix, int outchannels, int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetMixMatrix (IntPtr channel, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetDSPClock (IntPtr channel, out ulong dspclock, out ulong parentclock); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetDelay (IntPtr channel, ulong dspclock_start, ulong dspclock_end, bool stopchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetDelay (IntPtr channel, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_AddFadePoint (IntPtr channel, ulong dspclock, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetFadePointRamp (IntPtr channel, ulong dspclock, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_RemoveFadePoints (IntPtr channel, ulong dspclock_start, ulong dspclock_end); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetFadePoints (IntPtr channel, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetDSP (IntPtr channel, int index, out IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_AddDSP (IntPtr channel, int index, IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_RemoveDSP (IntPtr channel, IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetNumDSPs (IntPtr channel, out int numdsps); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetDSPIndex (IntPtr channel, IntPtr dsp, int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetDSPIndex (IntPtr channel, IntPtr dsp, out int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DAttributes (IntPtr channel, ref VECTOR pos, ref VECTOR vel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DAttributes (IntPtr channel, out VECTOR pos, out VECTOR vel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DMinMaxDistance (IntPtr channel, float mindistance, float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DMinMaxDistance (IntPtr channel, out float mindistance, out float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DConeSettings (IntPtr channel, float insideconeangle, float outsideconeangle, float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DConeSettings (IntPtr channel, out float insideconeangle, out float outsideconeangle, out float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DConeOrientation (IntPtr channel, ref VECTOR orientation); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DConeOrientation (IntPtr channel, out VECTOR orientation); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DCustomRolloff (IntPtr channel, ref VECTOR points, int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DCustomRolloff (IntPtr channel, out IntPtr points, out int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DOcclusion (IntPtr channel, float directocclusion, float reverbocclusion); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DOcclusion (IntPtr channel, out float directocclusion, out float reverbocclusion); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DSpread (IntPtr channel, float angle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DSpread (IntPtr channel, out float angle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DLevel (IntPtr channel, float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DLevel (IntPtr channel, out float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DDopplerLevel (IntPtr channel, float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DDopplerLevel (IntPtr channel, out float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Set3DDistanceFilter (IntPtr channel, bool custom, float customLevel, float centerFreq); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_Get3DDistanceFilter (IntPtr channel, out bool custom, out float customLevel, out float centerFreq); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_SetUserData (IntPtr channel, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Channel_GetUserData (IntPtr channel, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public Channel(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'ChannelGroup' API */ public struct ChannelGroup : IChannelControl { public RESULT release() { return FMOD5_ChannelGroup_Release(this.handle); } // Nested channel groups. public RESULT addGroup(ChannelGroup group, bool propagatedspclock = true) { return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, IntPtr.Zero); } public RESULT addGroup(ChannelGroup group, bool propagatedspclock, out DSPConnection connection) { return FMOD5_ChannelGroup_AddGroup(this.handle, group.handle, propagatedspclock, out connection.handle); } public RESULT getNumGroups(out int numgroups) { return FMOD5_ChannelGroup_GetNumGroups(this.handle, out numgroups); } public RESULT getGroup(int index, out ChannelGroup group) { return FMOD5_ChannelGroup_GetGroup(this.handle, index, out group.handle); } public RESULT getParentGroup(out ChannelGroup group) { return FMOD5_ChannelGroup_GetParentGroup(this.handle, out group.handle); } // Information only functions. public RESULT getName(out string name, int namelen) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_ChannelGroup_GetName(this.handle, stringMem, namelen); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getNumChannels(out int numchannels) { return FMOD5_ChannelGroup_GetNumChannels(this.handle, out numchannels); } public RESULT getChannel(int index, out Channel channel) { return FMOD5_ChannelGroup_GetChannel(this.handle, index, out channel.handle); } public RESULT getSystemObject(out System system) { return FMOD5_ChannelGroup_GetSystemObject(this.handle, out system.handle); } // General control functionality for Channels and ChannelGroups. public RESULT stop() { return FMOD5_ChannelGroup_Stop(this.handle); } public RESULT setPaused(bool paused) { return FMOD5_ChannelGroup_SetPaused(this.handle, paused); } public RESULT getPaused(out bool paused) { return FMOD5_ChannelGroup_GetPaused(this.handle, out paused); } public RESULT setVolume(float volume) { return FMOD5_ChannelGroup_SetVolume(this.handle, volume); } public RESULT getVolume(out float volume) { return FMOD5_ChannelGroup_GetVolume(this.handle, out volume); } public RESULT setVolumeRamp(bool ramp) { return FMOD5_ChannelGroup_SetVolumeRamp(this.handle, ramp); } public RESULT getVolumeRamp(out bool ramp) { return FMOD5_ChannelGroup_GetVolumeRamp(this.handle, out ramp); } public RESULT getAudibility(out float audibility) { return FMOD5_ChannelGroup_GetAudibility(this.handle, out audibility); } public RESULT setPitch(float pitch) { return FMOD5_ChannelGroup_SetPitch(this.handle, pitch); } public RESULT getPitch(out float pitch) { return FMOD5_ChannelGroup_GetPitch(this.handle, out pitch); } public RESULT setMute(bool mute) { return FMOD5_ChannelGroup_SetMute(this.handle, mute); } public RESULT getMute(out bool mute) { return FMOD5_ChannelGroup_GetMute(this.handle, out mute); } public RESULT setReverbProperties(int instance, float wet) { return FMOD5_ChannelGroup_SetReverbProperties(this.handle, instance, wet); } public RESULT getReverbProperties(int instance, out float wet) { return FMOD5_ChannelGroup_GetReverbProperties(this.handle, instance, out wet); } public RESULT setLowPassGain(float gain) { return FMOD5_ChannelGroup_SetLowPassGain(this.handle, gain); } public RESULT getLowPassGain(out float gain) { return FMOD5_ChannelGroup_GetLowPassGain(this.handle, out gain); } public RESULT setMode(MODE mode) { return FMOD5_ChannelGroup_SetMode(this.handle, mode); } public RESULT getMode(out MODE mode) { return FMOD5_ChannelGroup_GetMode(this.handle, out mode); } public RESULT setCallback(CHANNELCONTROL_CALLBACK callback) { return FMOD5_ChannelGroup_SetCallback(this.handle, callback); } public RESULT isPlaying(out bool isplaying) { return FMOD5_ChannelGroup_IsPlaying(this.handle, out isplaying); } // Note all 'set' functions alter a final matrix, this is why the only get function is getMixMatrix, to avoid other get functions returning incorrect/obsolete values. public RESULT setPan(float pan) { return FMOD5_ChannelGroup_SetPan(this.handle, pan); } public RESULT setMixLevelsOutput(float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright) { return FMOD5_ChannelGroup_SetMixLevelsOutput(this.handle, frontleft, frontright, center, lfe, surroundleft, surroundright, backleft, backright); } public RESULT setMixLevelsInput(float[] levels, int numlevels) { return FMOD5_ChannelGroup_SetMixLevelsInput(this.handle, levels, numlevels); } public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop) { return FMOD5_ChannelGroup_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); } public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop) { return FMOD5_ChannelGroup_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); } // Clock based functionality. public RESULT getDSPClock(out ulong dspclock, out ulong parentclock) { return FMOD5_ChannelGroup_GetDSPClock(this.handle, out dspclock, out parentclock); } public RESULT setDelay(ulong dspclock_start, ulong dspclock_end, bool stopchannels) { return FMOD5_ChannelGroup_SetDelay(this.handle, dspclock_start, dspclock_end, stopchannels); } public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end) { return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, IntPtr.Zero); } public RESULT getDelay(out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels) { return FMOD5_ChannelGroup_GetDelay(this.handle, out dspclock_start, out dspclock_end, out stopchannels); } public RESULT addFadePoint(ulong dspclock, float volume) { return FMOD5_ChannelGroup_AddFadePoint(this.handle, dspclock, volume); } public RESULT setFadePointRamp(ulong dspclock, float volume) { return FMOD5_ChannelGroup_SetFadePointRamp(this.handle, dspclock, volume); } public RESULT removeFadePoints(ulong dspclock_start, ulong dspclock_end) { return FMOD5_ChannelGroup_RemoveFadePoints(this.handle, dspclock_start, dspclock_end); } public RESULT getFadePoints(ref uint numpoints, ulong[] point_dspclock, float[] point_volume) { return FMOD5_ChannelGroup_GetFadePoints(this.handle, ref numpoints, point_dspclock, point_volume); } // DSP effects. public RESULT getDSP(int index, out DSP dsp) { return FMOD5_ChannelGroup_GetDSP(this.handle, index, out dsp.handle); } public RESULT addDSP(int index, DSP dsp) { return FMOD5_ChannelGroup_AddDSP(this.handle, index, dsp.handle); } public RESULT removeDSP(DSP dsp) { return FMOD5_ChannelGroup_RemoveDSP(this.handle, dsp.handle); } public RESULT getNumDSPs(out int numdsps) { return FMOD5_ChannelGroup_GetNumDSPs(this.handle, out numdsps); } public RESULT setDSPIndex(DSP dsp, int index) { return FMOD5_ChannelGroup_SetDSPIndex(this.handle, dsp.handle, index); } public RESULT getDSPIndex(DSP dsp, out int index) { return FMOD5_ChannelGroup_GetDSPIndex(this.handle, dsp.handle, out index); } // 3D functionality. public RESULT set3DAttributes(ref VECTOR pos, ref VECTOR vel) { return FMOD5_ChannelGroup_Set3DAttributes(this.handle, ref pos, ref vel); } public RESULT get3DAttributes(out VECTOR pos, out VECTOR vel) { return FMOD5_ChannelGroup_Get3DAttributes(this.handle, out pos, out vel); } public RESULT set3DMinMaxDistance(float mindistance, float maxdistance) { return FMOD5_ChannelGroup_Set3DMinMaxDistance(this.handle, mindistance, maxdistance); } public RESULT get3DMinMaxDistance(out float mindistance, out float maxdistance) { return FMOD5_ChannelGroup_Get3DMinMaxDistance(this.handle, out mindistance, out maxdistance); } public RESULT set3DConeSettings(float insideconeangle, float outsideconeangle, float outsidevolume) { return FMOD5_ChannelGroup_Set3DConeSettings(this.handle, insideconeangle, outsideconeangle, outsidevolume); } public RESULT get3DConeSettings(out float insideconeangle, out float outsideconeangle, out float outsidevolume) { return FMOD5_ChannelGroup_Get3DConeSettings(this.handle, out insideconeangle, out outsideconeangle, out outsidevolume); } public RESULT set3DConeOrientation(ref VECTOR orientation) { return FMOD5_ChannelGroup_Set3DConeOrientation(this.handle, ref orientation); } public RESULT get3DConeOrientation(out VECTOR orientation) { return FMOD5_ChannelGroup_Get3DConeOrientation(this.handle, out orientation); } public RESULT set3DCustomRolloff(ref VECTOR points, int numpoints) { return FMOD5_ChannelGroup_Set3DCustomRolloff(this.handle, ref points, numpoints); } public RESULT get3DCustomRolloff(out IntPtr points, out int numpoints) { return FMOD5_ChannelGroup_Get3DCustomRolloff(this.handle, out points, out numpoints); } public RESULT set3DOcclusion(float directocclusion, float reverbocclusion) { return FMOD5_ChannelGroup_Set3DOcclusion(this.handle, directocclusion, reverbocclusion); } public RESULT get3DOcclusion(out float directocclusion, out float reverbocclusion) { return FMOD5_ChannelGroup_Get3DOcclusion(this.handle, out directocclusion, out reverbocclusion); } public RESULT set3DSpread(float angle) { return FMOD5_ChannelGroup_Set3DSpread(this.handle, angle); } public RESULT get3DSpread(out float angle) { return FMOD5_ChannelGroup_Get3DSpread(this.handle, out angle); } public RESULT set3DLevel(float level) { return FMOD5_ChannelGroup_Set3DLevel(this.handle, level); } public RESULT get3DLevel(out float level) { return FMOD5_ChannelGroup_Get3DLevel(this.handle, out level); } public RESULT set3DDopplerLevel(float level) { return FMOD5_ChannelGroup_Set3DDopplerLevel(this.handle, level); } public RESULT get3DDopplerLevel(out float level) { return FMOD5_ChannelGroup_Get3DDopplerLevel(this.handle, out level); } public RESULT set3DDistanceFilter(bool custom, float customLevel, float centerFreq) { return FMOD5_ChannelGroup_Set3DDistanceFilter(this.handle, custom, customLevel, centerFreq); } public RESULT get3DDistanceFilter(out bool custom, out float customLevel, out float centerFreq) { return FMOD5_ChannelGroup_Get3DDistanceFilter(this.handle, out custom, out customLevel, out centerFreq); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_ChannelGroup_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_ChannelGroup_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Release (IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, IntPtr zero); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_AddGroup (IntPtr channelgroup, IntPtr group, bool propagatedspclock, out IntPtr connection); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetNumGroups (IntPtr channelgroup, out int numgroups); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetGroup (IntPtr channelgroup, int index, out IntPtr group); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetParentGroup (IntPtr channelgroup, out IntPtr group); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetName (IntPtr channelgroup, IntPtr name, int namelen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetNumChannels (IntPtr channelgroup, out int numchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetChannel (IntPtr channelgroup, int index, out IntPtr channel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetSystemObject (IntPtr channelgroup, out IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Stop (IntPtr channelgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetPaused (IntPtr channelgroup, bool paused); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetPaused (IntPtr channelgroup, out bool paused); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetVolume (IntPtr channelgroup, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetVolume (IntPtr channelgroup, out float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetVolumeRamp (IntPtr channelgroup, bool ramp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetVolumeRamp (IntPtr channelgroup, out bool ramp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetAudibility (IntPtr channelgroup, out float audibility); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetPitch (IntPtr channelgroup, float pitch); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetPitch (IntPtr channelgroup, out float pitch); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetMute (IntPtr channelgroup, bool mute); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetMute (IntPtr channelgroup, out bool mute); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetReverbProperties (IntPtr channelgroup, int instance, float wet); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetReverbProperties (IntPtr channelgroup, int instance, out float wet); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetLowPassGain (IntPtr channelgroup, float gain); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetLowPassGain (IntPtr channelgroup, out float gain); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetMode (IntPtr channelgroup, MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetMode (IntPtr channelgroup, out MODE mode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetCallback (IntPtr channelgroup, CHANNELCONTROL_CALLBACK callback); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_IsPlaying (IntPtr channelgroup, out bool isplaying); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetPan (IntPtr channelgroup, float pan); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsOutput (IntPtr channelgroup, float frontleft, float frontright, float center, float lfe, float surroundleft, float surroundright, float backleft, float backright); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetMixLevelsInput (IntPtr channelgroup, float[] levels, int numlevels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetMixMatrix (IntPtr channelgroup, float[] matrix, int outchannels, int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetMixMatrix (IntPtr channelgroup, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetDSPClock (IntPtr channelgroup, out ulong dspclock, out ulong parentclock); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetDelay (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end, bool stopchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, IntPtr zero); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetDelay (IntPtr channelgroup, out ulong dspclock_start, out ulong dspclock_end, out bool stopchannels); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_AddFadePoint (IntPtr channelgroup, ulong dspclock, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetFadePointRamp (IntPtr channelgroup, ulong dspclock, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_RemoveFadePoints (IntPtr channelgroup, ulong dspclock_start, ulong dspclock_end); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetFadePoints (IntPtr channelgroup, ref uint numpoints, ulong[] point_dspclock, float[] point_volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetDSP (IntPtr channelgroup, int index, out IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_AddDSP (IntPtr channelgroup, int index, IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_RemoveDSP (IntPtr channelgroup, IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetNumDSPs (IntPtr channelgroup, out int numdsps); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetDSPIndex (IntPtr channelgroup, IntPtr dsp, int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetDSPIndex (IntPtr channelgroup, IntPtr dsp, out int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DAttributes (IntPtr channelgroup, ref VECTOR pos, ref VECTOR vel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DAttributes (IntPtr channelgroup, out VECTOR pos, out VECTOR vel); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DMinMaxDistance (IntPtr channelgroup, float mindistance, float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DMinMaxDistance (IntPtr channelgroup, out float mindistance, out float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DConeSettings (IntPtr channelgroup, float insideconeangle, float outsideconeangle, float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DConeSettings (IntPtr channelgroup, out float insideconeangle, out float outsideconeangle, out float outsidevolume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DConeOrientation(IntPtr channelgroup, ref VECTOR orientation); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DConeOrientation(IntPtr channelgroup, out VECTOR orientation); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DCustomRolloff (IntPtr channelgroup, ref VECTOR points, int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DCustomRolloff (IntPtr channelgroup, out IntPtr points, out int numpoints); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DOcclusion (IntPtr channelgroup, float directocclusion, float reverbocclusion); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DOcclusion (IntPtr channelgroup, out float directocclusion, out float reverbocclusion); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DSpread (IntPtr channelgroup, float angle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DSpread (IntPtr channelgroup, out float angle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DLevel (IntPtr channelgroup, float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DLevel (IntPtr channelgroup, out float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DDopplerLevel (IntPtr channelgroup, float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DDopplerLevel (IntPtr channelgroup, out float level); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Set3DDistanceFilter (IntPtr channelgroup, bool custom, float customLevel, float centerFreq); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_Get3DDistanceFilter (IntPtr channelgroup, out bool custom, out float customLevel, out float centerFreq); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_SetUserData (IntPtr channelgroup, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_ChannelGroup_GetUserData (IntPtr channelgroup, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public ChannelGroup(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'SoundGroup' API */ public struct SoundGroup { public RESULT release() { return FMOD5_SoundGroup_Release(this.handle); } public RESULT getSystemObject(out System system) { return FMOD5_SoundGroup_GetSystemObject(this.handle, out system.handle); } // SoundGroup control functions. public RESULT setMaxAudible(int maxaudible) { return FMOD5_SoundGroup_SetMaxAudible(this.handle, maxaudible); } public RESULT getMaxAudible(out int maxaudible) { return FMOD5_SoundGroup_GetMaxAudible(this.handle, out maxaudible); } public RESULT setMaxAudibleBehavior(SOUNDGROUP_BEHAVIOR behavior) { return FMOD5_SoundGroup_SetMaxAudibleBehavior(this.handle, behavior); } public RESULT getMaxAudibleBehavior(out SOUNDGROUP_BEHAVIOR behavior) { return FMOD5_SoundGroup_GetMaxAudibleBehavior(this.handle, out behavior); } public RESULT setMuteFadeSpeed(float speed) { return FMOD5_SoundGroup_SetMuteFadeSpeed(this.handle, speed); } public RESULT getMuteFadeSpeed(out float speed) { return FMOD5_SoundGroup_GetMuteFadeSpeed(this.handle, out speed); } public RESULT setVolume(float volume) { return FMOD5_SoundGroup_SetVolume(this.handle, volume); } public RESULT getVolume(out float volume) { return FMOD5_SoundGroup_GetVolume(this.handle, out volume); } public RESULT stop() { return FMOD5_SoundGroup_Stop(this.handle); } // Information only functions. public RESULT getName(out string name, int namelen) { IntPtr stringMem = Marshal.AllocHGlobal(namelen); RESULT result = FMOD5_SoundGroup_GetName(this.handle, stringMem, namelen); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(stringMem); } Marshal.FreeHGlobal(stringMem); return result; } public RESULT getNumSounds(out int numsounds) { return FMOD5_SoundGroup_GetNumSounds(this.handle, out numsounds); } public RESULT getSound(int index, out Sound sound) { return FMOD5_SoundGroup_GetSound(this.handle, index, out sound.handle); } public RESULT getNumPlaying(out int numplaying) { return FMOD5_SoundGroup_GetNumPlaying(this.handle, out numplaying); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_SoundGroup_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_SoundGroup_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_Release (IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetSystemObject (IntPtr soundgroup, out IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_SetMaxAudible (IntPtr soundgroup, int maxaudible); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetMaxAudible (IntPtr soundgroup, out int maxaudible); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_SetMaxAudibleBehavior (IntPtr soundgroup, SOUNDGROUP_BEHAVIOR behavior); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetMaxAudibleBehavior (IntPtr soundgroup, out SOUNDGROUP_BEHAVIOR behavior); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_SetMuteFadeSpeed (IntPtr soundgroup, float speed); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetMuteFadeSpeed (IntPtr soundgroup, out float speed); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_SetVolume (IntPtr soundgroup, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetVolume (IntPtr soundgroup, out float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_Stop (IntPtr soundgroup); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetName (IntPtr soundgroup, IntPtr name, int namelen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetNumSounds (IntPtr soundgroup, out int numsounds); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetSound (IntPtr soundgroup, int index, out IntPtr sound); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetNumPlaying (IntPtr soundgroup, out int numplaying); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_SetUserData (IntPtr soundgroup, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_SoundGroup_GetUserData (IntPtr soundgroup, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public SoundGroup(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'DSP' API */ public struct DSP { public RESULT release() { return FMOD5_DSP_Release(this.handle); } public RESULT getSystemObject(out System system) { return FMOD5_DSP_GetSystemObject(this.handle, out system.handle); } // Connection / disconnection / input and output enumeration. public RESULT addInput(DSP input) { return FMOD5_DSP_AddInput(this.handle, input.handle, IntPtr.Zero, DSPCONNECTION_TYPE.STANDARD); } public RESULT addInput(DSP input, out DSPConnection connection, DSPCONNECTION_TYPE type = DSPCONNECTION_TYPE.STANDARD) { return FMOD5_DSP_AddInput(this.handle, input.handle, out connection.handle, type); } public RESULT disconnectFrom(DSP target, DSPConnection connection) { return FMOD5_DSP_DisconnectFrom(this.handle, target.handle, connection.handle); } public RESULT disconnectAll(bool inputs, bool outputs) { return FMOD5_DSP_DisconnectAll(this.handle, inputs, outputs); } public RESULT getNumInputs(out int numinputs) { return FMOD5_DSP_GetNumInputs(this.handle, out numinputs); } public RESULT getNumOutputs(out int numoutputs) { return FMOD5_DSP_GetNumOutputs(this.handle, out numoutputs); } public RESULT getInput(int index, out DSP input, out DSPConnection inputconnection) { return FMOD5_DSP_GetInput(this.handle, index, out input.handle, out inputconnection.handle); } public RESULT getOutput(int index, out DSP output, out DSPConnection outputconnection) { return FMOD5_DSP_GetOutput(this.handle, index, out output.handle, out outputconnection.handle); } // DSP unit control. public RESULT setActive(bool active) { return FMOD5_DSP_SetActive(this.handle, active); } public RESULT getActive(out bool active) { return FMOD5_DSP_GetActive(this.handle, out active); } public RESULT setBypass(bool bypass) { return FMOD5_DSP_SetBypass(this.handle, bypass); } public RESULT getBypass(out bool bypass) { return FMOD5_DSP_GetBypass(this.handle, out bypass); } public RESULT setWetDryMix(float prewet, float postwet, float dry) { return FMOD5_DSP_SetWetDryMix(this.handle, prewet, postwet, dry); } public RESULT getWetDryMix(out float prewet, out float postwet, out float dry) { return FMOD5_DSP_GetWetDryMix(this.handle, out prewet, out postwet, out dry); } public RESULT setChannelFormat(CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode) { return FMOD5_DSP_SetChannelFormat(this.handle, channelmask, numchannels, source_speakermode); } public RESULT getChannelFormat(out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode) { return FMOD5_DSP_GetChannelFormat(this.handle, out channelmask, out numchannels, out source_speakermode); } public RESULT getOutputChannelFormat(CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode) { return FMOD5_DSP_GetOutputChannelFormat(this.handle, inmask, inchannels, inspeakermode, out outmask, out outchannels, out outspeakermode); } public RESULT reset() { return FMOD5_DSP_Reset(this.handle); } public RESULT setCallback(DSP_CALLBACK callback) { return FMOD5_DSP_SetCallback(this.handle, callback); } // DSP parameter control. public RESULT setParameterFloat(int index, float value) { return FMOD5_DSP_SetParameterFloat(this.handle, index, value); } public RESULT setParameterInt(int index, int value) { return FMOD5_DSP_SetParameterInt(this.handle, index, value); } public RESULT setParameterBool(int index, bool value) { return FMOD5_DSP_SetParameterBool(this.handle, index, value); } public RESULT setParameterData(int index, byte[] data) { return FMOD5_DSP_SetParameterData(this.handle, index, Marshal.UnsafeAddrOfPinnedArrayElement(data, 0), (uint)data.Length); } public RESULT getParameterFloat(int index, out float value) { return FMOD5_DSP_GetParameterFloat(this.handle, index, out value, IntPtr.Zero, 0); } public RESULT getParameterInt(int index, out int value) { return FMOD5_DSP_GetParameterInt(this.handle, index, out value, IntPtr.Zero, 0); } public RESULT getParameterBool(int index, out bool value) { return FMOD5_DSP_GetParameterBool(this.handle, index, out value, IntPtr.Zero, 0); } public RESULT getParameterData(int index, out IntPtr data, out uint length) { return FMOD5_DSP_GetParameterData(this.handle, index, out data, out length, IntPtr.Zero, 0); } public RESULT getNumParameters(out int numparams) { return FMOD5_DSP_GetNumParameters(this.handle, out numparams); } public RESULT getParameterInfo(int index, out DSP_PARAMETER_DESC desc) { IntPtr descPtr; RESULT result = FMOD5_DSP_GetParameterInfo(this.handle, index, out descPtr); desc = (DSP_PARAMETER_DESC)MarshalHelper.PtrToStructure(descPtr, typeof(DSP_PARAMETER_DESC)); return result; } public RESULT getDataParameterIndex(int datatype, out int index) { return FMOD5_DSP_GetDataParameterIndex(this.handle, datatype, out index); } public RESULT showConfigDialog(IntPtr hwnd, bool show) { return FMOD5_DSP_ShowConfigDialog(this.handle, hwnd, show); } // DSP attributes. public RESULT getInfo(out string name, out uint version, out int channels, out int configwidth, out int configheight) { IntPtr nameMem = Marshal.AllocHGlobal(32); RESULT result = FMOD5_DSP_GetInfo(this.handle, nameMem, out version, out channels, out configwidth, out configheight); using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { name = encoder.stringFromNative(nameMem); } Marshal.FreeHGlobal(nameMem); return result; } public RESULT getInfo(out uint version, out int channels, out int configwidth, out int configheight) { return FMOD5_DSP_GetInfo(this.handle, IntPtr.Zero, out version, out channels, out configwidth, out configheight); ; } public RESULT getType(out DSP_TYPE type) { return FMOD5_DSP_GetType(this.handle, out type); } public RESULT getIdle(out bool idle) { return FMOD5_DSP_GetIdle(this.handle, out idle); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_DSP_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_DSP_GetUserData(this.handle, out userdata); } // Metering. public RESULT setMeteringEnabled(bool inputEnabled, bool outputEnabled) { return FMOD5_DSP_SetMeteringEnabled(this.handle, inputEnabled, outputEnabled); } public RESULT getMeteringEnabled(out bool inputEnabled, out bool outputEnabled) { return FMOD5_DSP_GetMeteringEnabled(this.handle, out inputEnabled, out outputEnabled); } public RESULT getMeteringInfo(IntPtr zero, out DSP_METERING_INFO outputInfo) { return FMOD5_DSP_GetMeteringInfo(this.handle, zero, out outputInfo); } public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, IntPtr zero) { return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, zero); } public RESULT getMeteringInfo(out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo) { return FMOD5_DSP_GetMeteringInfo(this.handle, out inputInfo, out outputInfo); } public RESULT getCPUUsage(out uint exclusive, out uint inclusive) { return FMOD5_DSP_GetCPUUsage(this.handle, out exclusive, out inclusive); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_Release (IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetSystemObject (IntPtr dsp, out IntPtr system); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, IntPtr zero, DSPCONNECTION_TYPE type); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_AddInput (IntPtr dsp, IntPtr input, out IntPtr connection, DSPCONNECTION_TYPE type); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_DisconnectFrom (IntPtr dsp, IntPtr target, IntPtr connection); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_DisconnectAll (IntPtr dsp, bool inputs, bool outputs); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetNumInputs (IntPtr dsp, out int numinputs); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetNumOutputs (IntPtr dsp, out int numoutputs); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetInput (IntPtr dsp, int index, out IntPtr input, out IntPtr inputconnection); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetOutput (IntPtr dsp, int index, out IntPtr output, out IntPtr outputconnection); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetActive (IntPtr dsp, bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetActive (IntPtr dsp, out bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetBypass (IntPtr dsp, bool bypass); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetBypass (IntPtr dsp, out bool bypass); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetWetDryMix (IntPtr dsp, float prewet, float postwet, float dry); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetWetDryMix (IntPtr dsp, out float prewet, out float postwet, out float dry); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetChannelFormat (IntPtr dsp, CHANNELMASK channelmask, int numchannels, SPEAKERMODE source_speakermode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetChannelFormat (IntPtr dsp, out CHANNELMASK channelmask, out int numchannels, out SPEAKERMODE source_speakermode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetOutputChannelFormat (IntPtr dsp, CHANNELMASK inmask, int inchannels, SPEAKERMODE inspeakermode, out CHANNELMASK outmask, out int outchannels, out SPEAKERMODE outspeakermode); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_Reset (IntPtr dsp); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetCallback (IntPtr dsp, DSP_CALLBACK callback); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetParameterFloat (IntPtr dsp, int index, float value); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetParameterInt (IntPtr dsp, int index, int value); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetParameterBool (IntPtr dsp, int index, bool value); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetParameterData (IntPtr dsp, int index, IntPtr data, uint length); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetParameterFloat (IntPtr dsp, int index, out float value, IntPtr valuestr, int valuestrlen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetParameterInt (IntPtr dsp, int index, out int value, IntPtr valuestr, int valuestrlen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetParameterBool (IntPtr dsp, int index, out bool value, IntPtr valuestr, int valuestrlen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetParameterData (IntPtr dsp, int index, out IntPtr data, out uint length, IntPtr valuestr, int valuestrlen); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetNumParameters (IntPtr dsp, out int numparams); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetParameterInfo (IntPtr dsp, int index, out IntPtr desc); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetDataParameterIndex (IntPtr dsp, int datatype, out int index); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_ShowConfigDialog (IntPtr dsp, IntPtr hwnd, bool show); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetInfo (IntPtr dsp, IntPtr name, out uint version, out int channels, out int configwidth, out int configheight); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetType (IntPtr dsp, out DSP_TYPE type); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetIdle (IntPtr dsp, out bool idle); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_SetUserData (IntPtr dsp, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSP_GetUserData (IntPtr dsp, out IntPtr userdata); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_SetMeteringEnabled (IntPtr dsp, bool inputEnabled, bool outputEnabled); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_GetMeteringEnabled (IntPtr dsp, out bool inputEnabled, out bool outputEnabled); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, IntPtr zero, out DSP_METERING_INFO outputInfo); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, IntPtr zero); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_GetMeteringInfo (IntPtr dsp, out DSP_METERING_INFO inputInfo, out DSP_METERING_INFO outputInfo); [DllImport(VERSION.dll)] public static extern RESULT FMOD5_DSP_GetCPUUsage (IntPtr dsp, out uint exclusive, out uint inclusive); #endregion #region wrapperinternal public IntPtr handle; public DSP(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'DSPConnection' API */ public struct DSPConnection { public RESULT getInput(out DSP input) { return FMOD5_DSPConnection_GetInput(this.handle, out input.handle); } public RESULT getOutput(out DSP output) { return FMOD5_DSPConnection_GetOutput(this.handle, out output.handle); } public RESULT setMix(float volume) { return FMOD5_DSPConnection_SetMix(this.handle, volume); } public RESULT getMix(out float volume) { return FMOD5_DSPConnection_GetMix(this.handle, out volume); } public RESULT setMixMatrix(float[] matrix, int outchannels, int inchannels, int inchannel_hop = 0) { return FMOD5_DSPConnection_SetMixMatrix(this.handle, matrix, outchannels, inchannels, inchannel_hop); } public RESULT getMixMatrix(float[] matrix, out int outchannels, out int inchannels, int inchannel_hop = 0) { return FMOD5_DSPConnection_GetMixMatrix(this.handle, matrix, out outchannels, out inchannels, inchannel_hop); } public RESULT getType(out DSPCONNECTION_TYPE type) { return FMOD5_DSPConnection_GetType(this.handle, out type); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_DSPConnection_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_DSPConnection_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetInput (IntPtr dspconnection, out IntPtr input); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetOutput (IntPtr dspconnection, out IntPtr output); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_SetMix (IntPtr dspconnection, float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetMix (IntPtr dspconnection, out float volume); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_SetMixMatrix (IntPtr dspconnection, float[] matrix, int outchannels, int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetMixMatrix (IntPtr dspconnection, float[] matrix, out int outchannels, out int inchannels, int inchannel_hop); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetType (IntPtr dspconnection, out DSPCONNECTION_TYPE type); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_SetUserData (IntPtr dspconnection, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_DSPConnection_GetUserData (IntPtr dspconnection, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public DSPConnection(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'Geometry' API */ public struct Geometry { public RESULT release() { return FMOD5_Geometry_Release(this.handle); } // Polygon manipulation. public RESULT addPolygon(float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex) { return FMOD5_Geometry_AddPolygon(this.handle, directocclusion, reverbocclusion, doublesided, numvertices, vertices, out polygonindex); } public RESULT getNumPolygons(out int numpolygons) { return FMOD5_Geometry_GetNumPolygons(this.handle, out numpolygons); } public RESULT getMaxPolygons(out int maxpolygons, out int maxvertices) { return FMOD5_Geometry_GetMaxPolygons(this.handle, out maxpolygons, out maxvertices); } public RESULT getPolygonNumVertices(int index, out int numvertices) { return FMOD5_Geometry_GetPolygonNumVertices(this.handle, index, out numvertices); } public RESULT setPolygonVertex(int index, int vertexindex, ref VECTOR vertex) { return FMOD5_Geometry_SetPolygonVertex(this.handle, index, vertexindex, ref vertex); } public RESULT getPolygonVertex(int index, int vertexindex, out VECTOR vertex) { return FMOD5_Geometry_GetPolygonVertex(this.handle, index, vertexindex, out vertex); } public RESULT setPolygonAttributes(int index, float directocclusion, float reverbocclusion, bool doublesided) { return FMOD5_Geometry_SetPolygonAttributes(this.handle, index, directocclusion, reverbocclusion, doublesided); } public RESULT getPolygonAttributes(int index, out float directocclusion, out float reverbocclusion, out bool doublesided) { return FMOD5_Geometry_GetPolygonAttributes(this.handle, index, out directocclusion, out reverbocclusion, out doublesided); } // Object manipulation. public RESULT setActive(bool active) { return FMOD5_Geometry_SetActive(this.handle, active); } public RESULT getActive(out bool active) { return FMOD5_Geometry_GetActive(this.handle, out active); } public RESULT setRotation(ref VECTOR forward, ref VECTOR up) { return FMOD5_Geometry_SetRotation(this.handle, ref forward, ref up); } public RESULT getRotation(out VECTOR forward, out VECTOR up) { return FMOD5_Geometry_GetRotation(this.handle, out forward, out up); } public RESULT setPosition(ref VECTOR position) { return FMOD5_Geometry_SetPosition(this.handle, ref position); } public RESULT getPosition(out VECTOR position) { return FMOD5_Geometry_GetPosition(this.handle, out position); } public RESULT setScale(ref VECTOR scale) { return FMOD5_Geometry_SetScale(this.handle, ref scale); } public RESULT getScale(out VECTOR scale) { return FMOD5_Geometry_GetScale(this.handle, out scale); } public RESULT save(IntPtr data, out int datasize) { return FMOD5_Geometry_Save(this.handle, data, out datasize); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_Geometry_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_Geometry_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_Release (IntPtr geometry); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_AddPolygon (IntPtr geometry, float directocclusion, float reverbocclusion, bool doublesided, int numvertices, VECTOR[] vertices, out int polygonindex); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetNumPolygons (IntPtr geometry, out int numpolygons); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetMaxPolygons (IntPtr geometry, out int maxpolygons, out int maxvertices); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetPolygonNumVertices(IntPtr geometry, int index, out int numvertices); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetPolygonVertex (IntPtr geometry, int index, int vertexindex, ref VECTOR vertex); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetPolygonVertex (IntPtr geometry, int index, int vertexindex, out VECTOR vertex); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetPolygonAttributes (IntPtr geometry, int index, float directocclusion, float reverbocclusion, bool doublesided); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetPolygonAttributes (IntPtr geometry, int index, out float directocclusion, out float reverbocclusion, out bool doublesided); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetActive (IntPtr geometry, bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetActive (IntPtr geometry, out bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetRotation (IntPtr geometry, ref VECTOR forward, ref VECTOR up); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetRotation (IntPtr geometry, out VECTOR forward, out VECTOR up); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetPosition (IntPtr geometry, ref VECTOR position); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetPosition (IntPtr geometry, out VECTOR position); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetScale (IntPtr geometry, ref VECTOR scale); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetScale (IntPtr geometry, out VECTOR scale); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_Save (IntPtr geometry, IntPtr data, out int datasize); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_SetUserData (IntPtr geometry, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Geometry_GetUserData (IntPtr geometry, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public Geometry(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } /* 'Reverb3D' API */ public struct Reverb3D { public RESULT release() { return FMOD5_Reverb3D_Release(this.handle); } // Reverb manipulation. public RESULT set3DAttributes(ref VECTOR position, float mindistance, float maxdistance) { return FMOD5_Reverb3D_Set3DAttributes(this.handle, ref position, mindistance, maxdistance); } public RESULT get3DAttributes(ref VECTOR position, ref float mindistance, ref float maxdistance) { return FMOD5_Reverb3D_Get3DAttributes(this.handle, ref position, ref mindistance, ref maxdistance); } public RESULT setProperties(ref REVERB_PROPERTIES properties) { return FMOD5_Reverb3D_SetProperties(this.handle, ref properties); } public RESULT getProperties(ref REVERB_PROPERTIES properties) { return FMOD5_Reverb3D_GetProperties(this.handle, ref properties); } public RESULT setActive(bool active) { return FMOD5_Reverb3D_SetActive(this.handle, active); } public RESULT getActive(out bool active) { return FMOD5_Reverb3D_GetActive(this.handle, out active); } // Userdata set/get. public RESULT setUserData(IntPtr userdata) { return FMOD5_Reverb3D_SetUserData(this.handle, userdata); } public RESULT getUserData(out IntPtr userdata) { return FMOD5_Reverb3D_GetUserData(this.handle, out userdata); } #region importfunctions [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_Release (IntPtr reverb3d); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_Set3DAttributes (IntPtr reverb3d, ref VECTOR position, float mindistance, float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_Get3DAttributes (IntPtr reverb3d, ref VECTOR position, ref float mindistance, ref float maxdistance); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_SetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_GetProperties (IntPtr reverb3d, ref REVERB_PROPERTIES properties); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_SetActive (IntPtr reverb3d, bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_GetActive (IntPtr reverb3d, out bool active); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_SetUserData (IntPtr reverb3d, IntPtr userdata); [DllImport(VERSION.dll)] private static extern RESULT FMOD5_Reverb3D_GetUserData (IntPtr reverb3d, out IntPtr userdata); #endregion #region wrapperinternal public IntPtr handle; public Reverb3D(IntPtr ptr) { this.handle = ptr; } public bool hasHandle() { return this.handle != IntPtr.Zero; } public void clearHandle() { this.handle = IntPtr.Zero; } #endregion } #region Helper Functions [StructLayout(LayoutKind.Sequential)] public struct StringWrapper { IntPtr nativeUtf8Ptr; public StringWrapper(IntPtr ptr) { nativeUtf8Ptr = ptr; } public static implicit operator string(StringWrapper fstring) { using (StringHelper.ThreadSafeEncoding encoder = StringHelper.GetFreeHelper()) { return encoder.stringFromNative(fstring.nativeUtf8Ptr); } } public bool StartsWith(byte[] prefix) { if (nativeUtf8Ptr == IntPtr.Zero) { return false; } for (int i = 0; i < prefix.Length; i++) { if (Marshal.ReadByte(nativeUtf8Ptr, i) != prefix[i]) { return false; } } return true; } public bool Equals(byte[] comparison) { if (nativeUtf8Ptr == IntPtr.Zero) { return false; } for (int i = 0; i < comparison.Length; i++) { if (Marshal.ReadByte(nativeUtf8Ptr, i) != comparison[i]) { return false; } } if (Marshal.ReadByte(nativeUtf8Ptr, comparison.Length) != 0) { return false; } return true; } } static class StringHelper { public class ThreadSafeEncoding : IDisposable { UTF8Encoding encoding = new UTF8Encoding(); byte[] encodedBuffer = new byte[128]; char[] decodedBuffer = new char[128]; bool inUse; GCHandle gcHandle; public bool InUse() { return inUse; } public void SetInUse() { inUse = true; } private int roundUpPowerTwo(int number) { int newNumber = 1; while (newNumber <= number) { newNumber *= 2; } return newNumber; } public byte[] byteFromStringUTF8(string s) { if (s == null) { return null; } int maximumLength = encoding.GetMaxByteCount(s.Length) + 1; // +1 for null terminator if (maximumLength > encodedBuffer.Length) { int encodedLength = encoding.GetByteCount(s) + 1; // +1 for null terminator if (encodedLength > encodedBuffer.Length) { encodedBuffer = new byte[roundUpPowerTwo(encodedLength)]; } } int byteCount = encoding.GetBytes(s, 0, s.Length, encodedBuffer, 0); encodedBuffer[byteCount] = 0; // Apply null terminator return encodedBuffer; } public IntPtr intptrFromStringUTF8(string s) { if (s == null) { return IntPtr.Zero; } gcHandle = GCHandle.Alloc(byteFromStringUTF8(s), GCHandleType.Pinned); return gcHandle.AddrOfPinnedObject(); } public string stringFromNative(IntPtr nativePtr) { if (nativePtr == IntPtr.Zero) { return ""; } int nativeLen = 0; while (Marshal.ReadByte(nativePtr, nativeLen) != 0) { nativeLen++; } if (nativeLen == 0) { return ""; } if (nativeLen > encodedBuffer.Length) { encodedBuffer = new byte[roundUpPowerTwo(nativeLen)]; } Marshal.Copy(nativePtr, encodedBuffer, 0, nativeLen); int maximumLength = encoding.GetMaxCharCount(nativeLen); if (maximumLength > decodedBuffer.Length) { int decodedLength = encoding.GetCharCount(encodedBuffer, 0, nativeLen); if (decodedLength > decodedBuffer.Length) { decodedBuffer = new char[roundUpPowerTwo(decodedLength)]; } } int charCount = encoding.GetChars(encodedBuffer, 0, nativeLen, decodedBuffer, 0); return new String(decodedBuffer, 0, charCount); } public void Dispose() { if (gcHandle.IsAllocated) { gcHandle.Free(); } lock (encoders) { inUse = false; } } } static List encoders = new List(1); public static ThreadSafeEncoding GetFreeHelper() { lock (encoders) { ThreadSafeEncoding helper = null; // Search for not in use helper for (int i = 0; i < encoders.Count; i++) { if (!encoders[i].InUse()) { helper = encoders[i]; break; } } // Otherwise create another helper if (helper == null) { helper = new ThreadSafeEncoding(); encoders.Add(helper); } helper.SetInUse(); return helper; } } } // Some of the Marshal functions were marked as deprecated / obsolete, however that decision was reversed: https://github.com/dotnet/corefx/pull/10541 // Use the old syntax (non-generic) to ensure maximum compatibility (especially with Unity) ignoring the warnings public static class MarshalHelper { #pragma warning disable 618 public static int SizeOf(Type t) { return Marshal.SizeOf(t); // Always use Type version, never Object version as it boxes causes GC allocations } public static object PtrToStructure(IntPtr ptr, Type structureType) { return Marshal.PtrToStructure(ptr, structureType); } #pragma warning restore 618 } #endregion }