aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Durango/Miles
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Durango/Miles
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/Durango/Miles')
-rw-r--r--Minecraft.Client/Durango/Miles/include/mss.h8429
-rw-r--r--Minecraft.Client/Durango/Miles/include/rrCore.h2322
-rw-r--r--Minecraft.Client/Durango/Miles/lib/auddurango.LTCG.libbin0 -> 505764 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/auddurango.libbin0 -> 140914 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/binkadurango.LTCG.libbin0 -> 248300 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/binkadurango.libbin0 -> 91330 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/fltdurango.LTCG.libbin0 -> 1405336 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/fltdurango.libbin0 -> 249466 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/mssdurango.LTCG.libbin0 -> 3451006 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/mssdurango.libbin0 -> 1279616 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/mssdurangomidi.LTCG.libbin0 -> 946906 bytes
-rw-r--r--Minecraft.Client/Durango/Miles/lib/mssdurangomidi.libbin0 -> 375172 bytes
12 files changed, 10751 insertions, 0 deletions
diff --git a/Minecraft.Client/Durango/Miles/include/mss.h b/Minecraft.Client/Durango/Miles/include/mss.h
new file mode 100644
index 00000000..531dcbc9
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/include/mss.h
@@ -0,0 +1,8429 @@
+//############################################################################
+//## ##
+//## Miles Sound System ##
+//## ##
+//############################################################################
+//## ##
+//## Contact RAD Game Tools at 425-893-4300 for technical support. ##
+//## ##
+//############################################################################
+
+#ifndef MSS_VERSION
+
+// also update versions below for the docs
+
+// for cdep and installs
+#define MILESVERSION "9.3m"
+// see below in docs section
+#define MILESMAJORVERSION 9
+#define MILESMINORVERSION 3
+#define MILESSUBVERSION 11
+#define MILESBUILDVERSION 0
+#define MILESVERSIONDATE "20-Jun-14"
+#define MILESCOPYRIGHT "Copyright (C) 1991-2014, RAD Game Tools, Inc."
+
+// source files use these defines
+#define MSS_VERSION MILESVERSION
+#define MSS_MAJOR_VERSION MILESMAJORVERSION
+#define MSS_MINOR_VERSION MILESMINORVERSION
+#define MSS_SUB_VERSION MILESSUBVERSION
+#define MSS_BUILD_VERSION MILESBUILDVERSION
+
+#define MSS_VERSION_DATE MILESVERSIONDATE
+#define MSS_COPYRIGHT MILESCOPYRIGHT
+
+#endif
+
+#if !defined(MSS_H) && !defined(__RADRES__)
+#define MSS_H
+
+// doc system stuff
+#ifndef EXPAPI
+#define EXPAPI
+#endif
+#ifndef EXPTYPE
+#define EXPTYPE
+#endif
+#ifndef EXPMACRO
+#define EXPMACRO
+#endif
+#ifndef EXPCONST
+#define EXPCONST
+#endif
+#ifndef EXPOUT
+#define EXPOUT
+#endif
+#ifndef EXPTYPEBEGIN
+#define EXPTYPEBEGIN
+#endif
+#ifndef EXPTYPEEND
+#define EXPTYPEEND
+#endif
+#ifndef EXPGROUP
+#define EXPGROUP(GroupName)
+#endif
+#ifndef DEFGROUP
+#define DEFGROUP(GroupName, Info)
+#endif
+
+// For docs
+EXPGROUP(_NullGroup)
+#define MilesVersion "9.3m" EXPMACRO
+#define MilesMajorVersion 9 EXPMACRO
+#define MilesMinorVersion 3 EXPMACRO
+#define MilesBuildNumber 11 EXPMACRO
+#define MilesCustomization 0 EXPMACRO
+EXPGROUP(_RootGroup)
+
+
+// IS_WINDOWS for Windows or Win32
+// IS_WIN64 for Win64
+// IS_WIN32 for Win32
+// IS_WIN32API for Windows, Xbox and Xenon
+// IS_64REGS when CPU registers are 64-bit - Xenon, PS3, Win64 and PS2
+// IS_32 for at least 32-bit pointers
+// IS_LE for little endian (PCs)
+// IS_BE for big endian (Macs, x360, ps3)
+// IS_X86 for Intel
+// IS_MAC for Mac
+// IS_MACHO for Macho Mac
+// IS_PPC for PPC Mac
+// IS_68K for 68K Mac
+// IS_LINUX for Linux
+// IS_XBOX for Xbox
+// IS_XENON for Xbox 360
+// IS_PS2 for PS/2
+// IS_PS3 for PS/3
+// IS_SPU for PS3 SPU
+// IS_WII for Wii
+
+#include "rrCore.h"
+
+//#define MILES_CHECK_OFFSETS
+#ifdef MILES_CHECK_OFFSETS
+ #include <stddef.h>
+#endif
+
+#ifdef __RADNT__
+#define IS_WIN32
+#if defined(__RAD64__)
+#define IS_WIN64
+#endif
+#endif
+
+#if defined(__RADWIN__) && !defined(__RADXENON__) && !defined(__RADXBOX__) && !defined(__RADWINRTAPI__)
+#define IS_WINDOWS
+#endif
+
+#if defined(__RADWIN__)
+#define IS_WIN32API
+#endif
+
+#if defined(__RAD64__) && defined(__RADWIN__)
+#define IS_WIN64
+#endif
+
+// 16-bit not supported anymore
+#define IS_32
+
+#ifdef __RADLITTLEENDIAN__
+#define IS_LE
+#endif
+
+#ifdef __RADBIGENDIAN__
+#define IS_BE
+#endif
+
+#ifdef __RADX86__
+#define IS_X86
+#endif
+
+#ifdef __RADMAC__
+#define IS_MAC
+#endif
+
+#ifdef __RADPPC__
+#define IS_PPC
+#endif
+
+#ifdef __RAD68K__
+#define IS_68K
+#endif
+
+#ifdef __RADLINUX__
+#define IS_LINUX
+#endif
+
+//
+// MSS_STATIC_RIB is used to determine whether anything loaded
+// through the RIB interface is loaded via RIB_load_application_providers
+// or via a static declaration from the user (Register_RIB)
+// mirror this in rib.h
+//
+#if defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPSP2__) || \
+ defined(__RADWII__) || defined(__RADWIIU__) || defined(__RAD3DS__) || defined(__RADIPHONE__) || \
+ defined(__RADXENON__) || defined(__RADPS4__) || defined(__RADPS3__) || defined(__RADSPU__) || \
+ defined(__RADDURANGO__) || defined(__RADWINRTAPI__)
+ #define MSS_STATIC_RIB
+ // WinRT is weird in that we statically pull in the RIBs, but we dynamically link Midi
+ #ifndef __RADWINRTAPI__
+ #define MSS_STATIC_MIDI
+ #endif
+#elif defined(__RADWIN__) || defined(__RADLINUX__) || defined(__RADMAC__)
+ // not static.
+#else
+ #error "MSS needs to know whether it is being distributed as a static lib!"
+#endif
+
+// Retain the old IS_STATIC define for example code
+#ifdef MSS_STATIC_RIB
+ #define IS_STATIC
+#endif
+
+#ifdef __RADXBOX__
+#define IS_XBOX
+#endif
+
+#ifdef __RADXENON__
+#define IS_XENON
+#endif
+
+#ifdef __RADWII__
+#define IS_WII
+#endif
+
+#ifdef __RADWIIU__
+#define IS_WIIU
+#endif
+
+#ifdef __RADPS2__
+#define IS_PS2
+#endif
+
+#ifdef __RADPS3__
+#define IS_PS3
+#ifndef HOST_SPU_PROCESS
+ #define HOST_SPU_PROCESS
+#endif
+#endif
+
+#ifdef __RADSPU__
+#define IS_PS3
+#define IS_SPU
+#endif
+
+#ifdef __RADPSP__
+#define IS_PSP
+#endif
+
+#ifdef __RADPSP2__
+#define IS_PSP2
+#endif
+
+#ifdef __RADDOS__
+#define IS_DOS
+#endif
+
+#ifdef __RAD64REGS__
+#define IS_64REGS
+#endif
+
+#ifdef __RADMACH__
+#define IS_MACHO
+#endif
+
+#ifdef __RADIPHONE__
+#define IS_IPHONE
+#endif
+
+#ifdef __RADIPHONESIM__
+#define IS_IPHONESIM
+#endif
+
+#ifdef __RAD3DS__
+#define IS_3DS
+#endif
+
+#define MSSRESTRICT RADRESTRICT
+
+#define MSS_STRUCT RADSTRUCT
+
+#define C8 char
+typedef void VOIDFUNC(void);
+
+
+#if (!defined(IS_LE) && !defined(IS_BE))
+ #error MSS.H did not detect your platform. Define _WINDOWS, WIN32, WIN64, or macintosh.
+#endif
+
+//
+// Pipeline filters supported on following platforms
+//
+
+#define MSS_FLT_SUPPORTED 1
+#define EXTRA_BUILD_BUFFERS 1
+#define FLT_A (MAX_SPEAKERS)
+
+#if defined(IS_WIN32API)
+ #define MSS_VFLT_SUPPORTED 1
+#endif
+
+#define MSS_REVERB_SUPPORTED 1
+
+//================
+
+EXPGROUP(Basic Types)
+#define AILCALL EXPTAG(AILCALL)
+/*
+ Internal calling convention that all external Miles functions use.
+
+ Usually cdecl or stdcall on Windows.
+*/
+
+#define AILCALLBACK EXPTAG(AILCALLBACK docproto)
+/*
+ Calling convention that user supplied callbacks <b>from</b> Miles use.
+
+ Usually cdecl or stdcall on Windows.
+*/
+
+EXPGROUP(_RootGroup)
+#undef AILCALL
+#undef AILCALLBACK
+//================
+
+RADDEFSTART
+
+#define MSSFOURCC U32
+#ifdef IS_LE
+ #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \
+ ((U32)(U8)(ch0) | ((U32)(U8)(ch1) << 8) | \
+ ((U32)(U8)(ch2) << 16) | ((U32)(U8)(ch3) << 24 ))
+#else
+
+ #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \
+ (((U32)(U8)(ch0) << 24) | ((U32)(U8)(ch1) << 16) | \
+ ((U32)(U8)(ch2) << 8) | ((U32)(U8)(ch3) ))
+#endif
+
+#define MSSmmioFOURCC(w,x,y,z) MSSMAKEFOURCC(w,x,y,z)
+
+#if defined(__RADWINRTAPI__)
+
+ #define AILLIBCALLBACK RADLINK
+ #define AILCALL RADLINK
+ #define AILEXPORT RADEXPLINK
+ #define AILCALLBACK RADLINK
+ #define DXDEF RADEXPFUNC
+ #define DXDEC RADEXPFUNC
+
+#elif defined(IS_WINDOWS)
+
+ typedef char CHAR;
+ typedef short SHORT;
+ typedef int BOOL;
+ typedef long LONG;
+ typedef CHAR *LPSTR, *PSTR;
+
+ #ifdef IS_WIN64
+ typedef unsigned __int64 ULONG_PTR, *PULONG_PTR;
+ #else
+ #ifdef _Wp64
+ #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300
+ typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR;
+ #else
+ typedef unsigned long ULONG_PTR, *PULONG_PTR;
+ #endif
+ #else
+ typedef unsigned long ULONG_PTR, *PULONG_PTR;
+ #endif
+ #endif
+
+ typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
+ typedef unsigned long DWORD;
+ typedef unsigned short WORD;
+ typedef unsigned int UINT;
+ typedef struct HWAVE__ *HWAVE;
+ typedef struct HWAVEIN__ *HWAVEIN;
+ typedef struct HWAVEOUT__ *HWAVEOUT;
+ typedef HWAVEIN *LPHWAVEIN;
+ typedef HWAVEOUT *LPHWAVEOUT;
+
+ #ifndef WAVE_MAPPER
+ #define WAVE_MAPPER ((UINT)-1)
+ #endif
+
+ typedef struct waveformat_tag *LPWAVEFORMAT;
+
+ typedef struct HMIDIOUT__ *HMIDIOUT;
+ typedef HMIDIOUT *LPHMIDIOUT;
+ typedef struct HWND__ *HWND;
+ typedef struct HINSTANCE__ *HINSTANCE;
+ typedef HINSTANCE HMODULE;
+ typedef struct wavehdr_tag *LPWAVEHDR;
+
+ #define MSS_MAIN_DEF __cdecl
+
+ //
+ // If compiling MSS DLL, use __declspec(dllexport) for both
+ // declarations and definitions
+ //
+
+ #ifdef IS_WIN32
+
+ #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__)
+ #define AILLIBCALLBACK __stdcall
+ #define AILCALL __stdcall
+ #define AILCALLBACK __stdcall
+ #define AILEXPORT __stdcall
+ #else
+ #define AILLIBCALLBACK __cdecl
+ #define AILCALL __cdecl
+ #define AILCALLBACK __cdecl
+ #define AILEXPORT __cdecl
+ #endif
+
+ #ifdef __RADINDLL__
+ #define DXDEC __declspec(dllexport)
+ #define DXDEF __declspec(dllexport)
+ #else
+
+ #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS )
+ #define DXDEC extern
+ #else
+ #define DXDEC __declspec(dllimport)
+ #endif
+
+ #endif
+
+ #ifdef IS_WIN64
+ #define MSSDLLNAME "MSS64.DLL"
+ #define MSS_REDIST_DIR_NAME "redist64"
+ #else
+ #define MSSDLLNAME "MSS32.DLL"
+ #define MSS_REDIST_DIR_NAME "redist"
+ #endif
+
+ #define MSS_DIR_SEP "\\"
+ #define MSS_DIR_UP ".." MSS_DIR_SEP
+ #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP
+
+ #endif
+
+ typedef void * LPVOID;
+ typedef LPVOID AILLPDIRECTSOUND;
+ typedef LPVOID AILLPDIRECTSOUNDBUFFER;
+
+#elif defined( IS_MAC ) || defined(IS_IPHONE) || defined(IS_LINUX)
+
+ #if defined(__RADARM__) || defined(__RADX64__)
+ #define AILLIBCALLBACK
+ #define AILCALL
+ #define AILEXPORT
+ #define AILCALLBACK
+ #elif defined(__RADX86__)
+ #define AILLIBCALLBACK __attribute__((cdecl))
+ #define AILCALL __attribute__((cdecl))
+ #define AILCALLBACK __attribute__((cdecl))
+ #define AILEXPORT __attribute__((cdecl))
+ #else
+ #error "No fn call decorators specified"
+ #endif
+
+ #ifdef __RADINDLL__
+ #define DXDEC __attribute__((visibility("default")))
+ #define DXDEF __attribute__((visibility("default")))
+ #else
+ #define DXDEC extern
+ #define DXDEF
+ #endif
+
+ #ifdef __RADX64__
+ #define MSS_REDIST_DIR_NAME "redist/x64"
+ #elif defined(IS_X86)
+ #define MSS_REDIST_DIR_NAME "redist/x86"
+ #elif defined(__RADARM__)
+ #define MSS_REDIST_DIR_NAME ""
+ #else
+ #error "No Redist Dir Specified"
+ #endif
+
+ #define MSS_DIR_SEP "/"
+ #define MSS_DIR_UP ".." MSS_DIR_SEP
+ #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP
+
+ #define MSS_MAIN_DEF
+
+#elif defined(IS_XENON)
+
+ #define AILLIBCALLBACK __stdcall
+ #define AILCALL __stdcall
+ #define AILEXPORT __stdcall
+ #define AILCALLBACK __stdcall
+
+ #define DXDEC extern
+ #define DXDEF
+
+ typedef void * AILLPDIRECTSOUND;
+ typedef void * AILLPDIRECTSOUNDBUFFER;
+
+#else
+
+ #define AILLIBCALLBACK
+ #define AILCALL
+ #define AILEXPORT
+ #define AILCALLBACK
+
+ #define DXDEC extern
+ #define DXDEF
+
+#endif
+
+
+//
+// Misc. constant definitions
+//
+
+#define MAX_DRVRS 16 // Max. # of simultaneous drivers
+#define MAX_TIMERS 16 // Max. # of simultaneous timers
+#define MAX_NOTES 32 // Max # of notes "on"
+#define FOR_NEST 4 // # of nested XMIDI FOR loops
+#define NUM_CHANS 16 // # of possible MIDI channels
+#define MAX_W_VOICES 16 // Max virtual wave synth voice cnt
+#define MAX_W_ENTRIES 512 // 512 wave library entries max.
+#ifdef IS_WIN32
+#define MAX_SPEAKERS 9 // Up to 9 hardware output channels supported on Win32
+#elif defined(IS_PS3) || defined(IS_WII) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__)
+#define MAX_SPEAKERS 8 // Up to 8 hardware output channels on PS3, PS2, Wii, WiiU
+#elif defined(IS_PSP) || defined(IS_IPHONE) || defined(IS_3DS) || defined(IS_PSP2) || defined(__RADANDROID__)
+#define MAX_SPEAKERS 2 // Up to 2 hardware output channels on PSP
+#else
+#define MAX_SPEAKERS 6 // Up to 6 hardware output channels supported on other platforms
+#endif
+#define MAX_RECEIVER_SPECS 32 // Up to 32 receiver point specifications
+
+#define MAX_BUSSES 4 // # of busses that can be active.
+#define MILES_MAX_STATES 4 // # of state pushes allowed.
+
+
+#define MIN_CHAN ( 1-1) // Min channel recognized (0-based)
+#define MAX_CHAN (16-1) // Max channel recognized
+#define MIN_LOCK_CHAN ( 1-1) // Min channel available for locking
+#define MAX_LOCK_CHAN (16-1) // Max channel available for locking
+#define PERCUSS_CHAN (10-1) // Percussion channel (no locking)
+
+#define AIL_MAX_FILE_HEADER_SIZE 8192 // AIL_set_named_sample_file() requires at least 8K
+ // of data or the entire file image, whichever is less,
+ // to determine sample format
+#define DIG_F_16BITS_MASK 1
+#define DIG_F_STEREO_MASK 2
+#define DIG_F_ADPCM_MASK 4
+#define DIG_F_XBOX_ADPCM_MASK 8
+#define DIG_F_MULTICHANNEL_MASK 16
+#define DIG_F_OUTPUT_FILTER_IN_USE 32
+
+#define DIG_F_MONO_8 0 // PCM data formats
+#define DIG_F_MONO_16 (DIG_F_16BITS_MASK)
+#define DIG_F_STEREO_8 (DIG_F_STEREO_MASK)
+#define DIG_F_MULTICHANNEL_8 (DIG_F_MULTICHANNEL_MASK) // (not actually supported)
+#define DIG_F_STEREO_16 (DIG_F_STEREO_MASK|DIG_F_16BITS_MASK)
+#define DIG_F_MULTICHANNEL_16 (DIG_F_MULTICHANNEL_MASK|DIG_F_16BITS_MASK)
+#define DIG_F_ADPCM_MONO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK)
+#define DIG_F_ADPCM_STEREO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK)
+#define DIG_F_ADPCM_MULTICHANNEL_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK)
+#define DIG_F_XBOX_ADPCM_MONO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK)
+#define DIG_F_XBOX_ADPCM_STEREO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK)
+#define DIG_F_XBOX_ADPCM_MULTICHANNEL_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_MULTICHANNEL_MASK)
+
+#define DIG_F_NOT_8_BITS (DIG_F_16BITS_MASK | DIG_F_ADPCM_MASK | DIG_F_XBOX_ADPCM_MASK | DIG_F_MULTICHANNEL_MASK)
+
+#define DIG_F_USING_ASI 16
+
+#define DIG_PCM_POLARITY 0x0004 // PCM flags used by driver hardware
+#define DIG_PCM_SPLIT 0x0008
+#define DIG_BUFFER_SERVICE 0x0010
+#define DIG_DUAL_DMA 0x0020
+#define DIG_RECORDING_SUPPORTED 0x8000
+
+#ifndef WAVE_FORMAT_PCM
+ #define WAVE_FORMAT_PCM 1
+#endif
+#ifndef WAVE_FORMAT_IMA_ADPCM
+ #define WAVE_FORMAT_IMA_ADPCM 0x0011
+#endif
+#ifndef WAVE_FORMAT_XBOX_ADPCM
+ #define WAVE_FORMAT_XBOX_ADPCM 0x0069
+#endif
+#ifndef WAVE_FORMAT_EXTENSIBLE
+ #define WAVE_FORMAT_EXTENSIBLE 0xFFFE
+#endif
+
+typedef enum
+{
+ MSS_SPEAKER_MONO = 0,
+ MSS_SPEAKER_FRONT_LEFT = 0, // Speaker order indexes correspond to
+ MSS_SPEAKER_FRONT_RIGHT = 1, // bitmasks in PSDK's ksmedia.h
+ MSS_SPEAKER_FRONT_CENTER = 2, // Also see microsoft.com/whdc/device/audio/multichaud.mspx
+ MSS_SPEAKER_LOW_FREQUENCY = 3,
+ MSS_SPEAKER_BACK_LEFT = 4,
+ MSS_SPEAKER_BACK_RIGHT = 5,
+ MSS_SPEAKER_FRONT_LEFT_OF_CENTER = 6,
+ MSS_SPEAKER_FRONT_RIGHT_OF_CENTER = 7,
+ MSS_SPEAKER_BACK_CENTER = 8,
+ MSS_SPEAKER_SIDE_LEFT = 9,
+ MSS_SPEAKER_SIDE_RIGHT = 10,
+ MSS_SPEAKER_TOP_CENTER = 11,
+ MSS_SPEAKER_TOP_FRONT_LEFT = 12,
+ MSS_SPEAKER_TOP_FRONT_CENTER = 13,
+ MSS_SPEAKER_TOP_FRONT_RIGHT = 14,
+ MSS_SPEAKER_TOP_BACK_LEFT = 15,
+ MSS_SPEAKER_TOP_BACK_CENTER = 16,
+ MSS_SPEAKER_TOP_BACK_RIGHT = 17,
+ MSS_SPEAKER_MAX_INDEX = 17,
+ MSS_SPEAKER_FORCE_32 = 0x7fffffff
+} MSS_SPEAKER;
+
+//
+// Pass to AIL_midiOutOpen for NULL MIDI driver
+//
+
+#define MIDI_NULL_DRIVER ((U32)(S32)-2)
+
+
+//
+// Non-specific XMIDI/MIDI controllers and event types
+//
+
+#define SYSEX_BYTE 105
+#define PB_RANGE 106
+#define CHAN_MUTE 107
+#define CALLBACK_PFX 108
+#define SEQ_BRANCH 109
+#define CHAN_LOCK 110
+#define CHAN_PROTECT 111
+#define VOICE_PROTECT 112
+#define TIMBRE_PROTECT 113
+#define PATCH_BANK_SEL 114
+#define INDIRECT_C_PFX 115
+#define FOR_LOOP 116
+#define NEXT_LOOP 117
+#define CLEAR_BEAT_BAR 118
+#define CALLBACK_TRIG 119
+#define SEQ_INDEX 120
+
+#define GM_BANK_MSB 0
+#define MODULATION 1
+#define DATA_MSB 6
+#define PART_VOLUME 7
+#define PANPOT 10
+#define EXPRESSION 11
+#define GM_BANK_LSB 32
+#define DATA_LSB 38
+#define SUSTAIN 64
+#define REVERB 91
+#define CHORUS 93
+#define RPN_LSB 100
+#define RPN_MSB 101
+#define RESET_ALL_CTRLS 121
+#define ALL_NOTES_OFF 123
+
+#define EV_NOTE_OFF 0x80
+#define EV_NOTE_ON 0x90
+#define EV_POLY_PRESS 0xa0
+#define EV_CONTROL 0xb0
+#define EV_PROGRAM 0xc0
+#define EV_CHAN_PRESS 0xd0
+#define EV_PITCH 0xe0
+#define EV_SYSEX 0xf0
+#define EV_ESC 0xf7
+#define EV_META 0xff
+
+#define META_EOT 0x2f
+#define META_TEMPO 0x51
+#define META_TIME_SIG 0x58
+
+//
+// SAMPLE.system_data[] usage
+//
+
+#define VOC_BLK_PTR 1 // Pointer to current block
+#define VOC_REP_BLK 2 // Pointer to beginning of repeat loop block
+#define VOC_N_REPS 3 // # of iterations left in repeat loop
+#define VOC_MARKER 4 // Marker to search for, or -1 if all
+#define VOC_MARKER_FOUND 5 // Desired marker found if 1, else 0
+#define STR_HSTREAM 6 // Stream, if any, that owns the HSAMPLE
+#define SSD_TEMP 7 // Temporary storage location for general use
+#define EVT_HANDLE_MAGIC 1 // EventSystem handle.magic
+#define EVT_HANDLE_INDEX 2 // EventSystem handle.index
+
+//
+// Timer status values
+//
+
+#define AILT_FREE 0 // Timer handle is free for allocation
+#define AILT_STOPPED 1 // Timer is stopped
+#define AILT_RUNNING 2 // Timer is running
+
+//
+// SAMPLE.status flag values
+//
+
+#define SMP_FREE 0x0001 // Sample is available for allocation
+
+#define SMP_DONE 0x0002 // Sample has finished playing, or has
+ // never been started
+
+#define SMP_PLAYING 0x0004 // Sample is playing
+
+#define SMP_STOPPED 0x0008 // Sample has been stopped
+
+#define SMP_PLAYINGBUTRELEASED 0x0010 // Sample is playing, but digital handle
+ // has been temporarily released
+
+
+
+//
+// SEQUENCE.status flag values
+//
+
+#define SEQ_FREE 0x0001 // Sequence is available for allocation
+
+#define SEQ_DONE 0x0002 // Sequence has finished playing, or has
+ // never been started
+
+#define SEQ_PLAYING 0x0004 // Sequence is playing
+
+#define SEQ_STOPPED 0x0008 // Sequence has been stopped
+
+#define SEQ_PLAYINGBUTRELEASED 0x0010 // Sequence is playing, but MIDI handle
+ // has been temporarily released
+
+#ifdef IS_WINDOWS
+
+//
+// AIL_set_direct_buffer_control() command values
+//
+
+#define AILDS_RELINQUISH 0 // App returns control of secondary buffer
+#define AILDS_SEIZE 1 // App takes control of secondary buffer
+#define AILDS_SEIZE_LOOP 2 // App wishes to loop the secondary buffer
+
+#endif
+
+#ifndef MSS_BASIC
+
+#ifndef FILE_ERRS
+ #define FILE_ERRS
+
+ #define AIL_NO_ERROR 0
+ #define AIL_IO_ERROR 1
+ #define AIL_OUT_OF_MEMORY 2
+ #define AIL_FILE_NOT_FOUND 3
+ #define AIL_CANT_WRITE_FILE 4
+ #define AIL_CANT_READ_FILE 5
+ #define AIL_DISK_FULL 6
+ #define AIL_NO_AVAIL_ASYNC 7
+#endif
+
+#define MIN_VAL 0
+#define NOM_VAL 1
+#define MAX_VAL 2
+
+
+EXPGROUP(Basic Types)
+EXPTYPEBEGIN typedef SINTa HMSSENUM;
+#define MSS_FIRST ((HMSSENUM)-1)
+EXPTYPEEND
+/*
+ specifies a type used to enumerate through a list of properties.
+
+ $:MSS_FIRST use this value to start the enumeration process.
+
+The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call
+the enumeration function until it returns 0.
+
+*/
+
+
+
+
+//
+// Preference names and default values
+//
+
+#define AIL_MM_PERIOD 0
+#define DEFAULT_AMP 1 // Default MM timer period = 5 msec.
+
+#define AIL_TIMERS 1
+#define DEFAULT_AT 16 // 16 allocatable HTIMER handles
+
+#define AIL_ENABLE_MMX_SUPPORT 2 // Enable MMX support if present
+#define DEFAULT_AEMS YES // (may be changed at any time)
+
+
+#define DIG_MIXER_CHANNELS 3
+#define DEFAULT_DMC 64 // 64 allocatable SAMPLE structures
+
+#define DIG_ENABLE_RESAMPLE_FILTER 4 // Enable resampling filter by
+#define DEFAULT_DERF YES // default
+
+#define DIG_RESAMPLING_TOLERANCE 5
+#define DEFAULT_DRT 131 // Resampling triggered at +/- 0.2%
+
+// 1 ms per mix. The PS3 has frag count restrictions, so we use 5 ms.
+#define DIG_DS_FRAGMENT_SIZE 6
+#ifdef __RADPS3__
+# define DEFAULT_DDFS 5
+#else
+# define DEFAULT_DDFS 1
+#endif
+
+// We want ~256 ms of buffers. PS3 must be 8, 16, or 32.
+#define DIG_DS_FRAGMENT_CNT 7
+#ifdef __RADPS3__
+# define DEFAULT_DDFC 32
+#else
+# define DEFAULT_DDFC 256
+#endif
+
+// Mix ahead ~48 ms. PS3 is based off on 5 ms frag size above...
+#define DIG_DS_MIX_FRAGMENT_CNT 8
+#ifdef __RADPS3__
+# define DEFAULT_DDMFC 8
+#else
+# define DEFAULT_DDMFC 48
+#endif
+
+#define DIG_LEVEL_RAMP_SAMPLES 9
+#define DEFAULT_DLRS 32 // Ramp level changes over first 32 samples in each buffer to reduce zipper noise
+
+
+#define DIG_MAX_PREDELAY_MS 10
+#define DEFAULT_MPDMS 500 // Max predelay reverb time in ms
+
+#define DIG_3D_MUTE_AT_MAX 11
+#define DEFAULT_D3MAM YES // on by default
+
+#define DIG_DS_USE_PRIMARY 12
+#define DEFAULT_DDUP NO // Mix into secondary DirectSound buffer by default
+
+
+#define DIG_DS_DSBCAPS_CTRL3D 13
+#define DEFAULT_DDDC NO // Do not use DSBCAPS_CTRL3D by default
+
+#define DIG_DS_CREATION_HANDLER 14
+#define DEFAULT_DDCH 0 // Use DirectSoundCreate() by default
+
+
+#define DIG_MAX_CHAIN_ELEMENT_SIZE 15
+#define DEFAULT_MCES 8192 // max of 8192 bytes/waveOut buffer
+
+#define DIG_MIN_CHAIN_ELEMENT_TIME 16
+#define DEFAULT_MCET 100 // 100 milliseconds buffers
+
+
+#define DIG_USE_WAVEOUT 17
+#define DEFAULT_DUW NO // Use DirectSound by default
+
+#define DIG_OUTPUT_BUFFER_SIZE 18
+#define DEFAULT_DOBS 49152 // Windows: waveout 48K output buffer size
+
+
+#define DIG_PREFERRED_WO_DEVICE 19
+#define DEFAULT_DPWOD ((UINTa)-1) // Preferred WaveOut device == WAVE_MAPPER
+
+#define DIG_PREFERRED_DS_DEVICE 20
+#define DEFAULT_DPDSD 0 // Preferred DirectSound device == default NULL GUID
+
+
+#define MDI_SEQUENCES 21
+#define DEFAULT_MS 8 // 8 sequence handles/driver
+
+#define MDI_SERVICE_RATE 22
+#define DEFAULT_MSR 120 // XMIDI sequencer timing = 120 Hz
+
+#define MDI_DEFAULT_VOLUME 23
+#define DEFAULT_MDV 127 // Default sequence volume = 127 (0-127)
+
+#define MDI_QUANT_ADVANCE 24
+#define DEFAULT_MQA 1 // Beat/bar count +1 interval
+
+#define MDI_ALLOW_LOOP_BRANCHING 25
+#define DEFAULT_ALB NO // Branches cancel XMIDI FOR loops
+
+#define MDI_DEFAULT_BEND_RANGE 26
+#define DEFAULT_MDBR 2 // Default pitch-bend range = 2
+
+#define MDI_DOUBLE_NOTE_OFF 27
+#define DEFAULT_MDNO NO // For stuck notes on SB daughterboards
+
+#define MDI_SYSEX_BUFFER_SIZE 28
+#define DEFAULT_MSBS 1536 // Default sysex buffer = 1536 bytes
+
+
+#define DLS_VOICE_LIMIT 29
+#define DEFAULT_DVL 64 // 64 voices supported
+
+#define DLS_TIMEBASE 30
+#define DEFAULT_DTB 120 // 120 intervals/second by default
+
+#define DLS_BANK_SELECT_ALIAS 31
+#define DEFAULT_DBSA NO // Do not treat controller 114 as bank
+
+#define DLS_STREAM_BOOTSTRAP 32 // Don't submit first stream buffer
+#define DEFAULT_DSB YES // until at least 2 available
+
+#define DLS_VOLUME_BOOST 33
+#define DEFAULT_DVB 0 // Boost final volume by 0 dB
+
+#define DLS_ENABLE_FILTERING 34 // Filtering = on by default
+#define DEFAULT_DEF YES // (may be changed at any time)
+
+
+#define DLS_GM_PASSTHROUGH 35 // Pass unrecognized traffic on to
+#define DEFAULT_DGP YES // default GM driver layer
+ // (may be changed at any time)
+
+#define DLS_ADPCM_TO_ASI_THRESHOLD 36 // Size in samples to switch to ASI
+#define DEFAULT_DATAT 32768
+
+#ifdef __RAD3DS__
+# define AIL_3DS_USE_SYSTEM_CORE 32 // Defaults to 0
+#endif
+
+#define N_PREFS 40 // # of preference types
+
+#if defined(IS_WIN32API) || defined(IS_WII)
+ #pragma pack(push, 1)
+#endif
+
+typedef struct Mwavehdr_tag {
+ C8 * lpData;
+ U32 dwBufferLength;
+ U32 dwBytesRecorded;
+ UINTa dwUser;
+ U32 dwFlags;
+ U32 dwLoops;
+ struct Mwavehdr_tag *lpNext;
+ UINTa reserved;
+} MWAVEHDR;
+typedef MSS_STRUCT Mwaveformat_tag {
+ U16 wFormatTag;
+ U16 nChannels;
+ U32 nSamplesPerSec;
+ U32 nAvgBytesPerSec;
+ U16 nBlockAlign;
+} MWAVEFORMAT;
+typedef MSS_STRUCT Mpcmwaveformat_tag {
+ MWAVEFORMAT wf;
+ U16 wBitsPerSample;
+} MPCMWAVEFORMAT;
+typedef MSS_STRUCT Mwaveformatex_tag {
+ U16 wFormatTag;
+ U16 nChannels;
+ U32 nSamplesPerSec;
+ U32 nAvgBytesPerSec;
+ U16 nBlockAlign;
+ U16 wBitsPerSample;
+ U16 cbSize;
+} MWAVEFORMATEX;
+typedef MSS_STRUCT Mwaveformatextensible_tag {
+ MWAVEFORMATEX Format;
+ union {
+ U16 wValidBitsPerSample;
+ U16 wSamplesPerBlock;
+ U16 wReserved;
+ } Samples;
+ U32 dwChannelMask;
+ U8 SubFormat[16];
+} MWAVEFORMATEXTENSIBLE;
+
+#if defined(IS_WIN32API) || defined(IS_WII)
+ #pragma pack(pop)
+#endif
+
+// This will fail if structure packing isn't correct for the compiler we are running.
+RR_COMPILER_ASSERT(sizeof(MWAVEFORMATEXTENSIBLE) == 40);
+
+
+typedef struct _AILSOUNDINFO {
+ S32 format;
+ void const* data_ptr;
+ U32 data_len;
+ U32 rate;
+ S32 bits;
+ S32 channels;
+ U32 channel_mask;
+ U32 samples;
+ U32 block_size;
+ void const* initial_ptr;
+} AILSOUNDINFO;
+
+// asis use these callbacks
+typedef void * (AILCALL MSS_ALLOC_TYPE)( UINTa size, UINTa user, char const * filename, U32 line );
+typedef void (AILCALL MSS_FREE_TYPE)( void * ptr, UINTa user, char const * filename, U32 line );
+
+// helper functions that just turn around and call AIL_mem_alloc_lock
+DXDEC void * AILCALL MSS_alloc_info( UINTa size, UINTa user, char const * filename, U32 line );
+DXDEC void AILCALL MSS_free_info( void * ptr, UINTa user, char const * filename, U32 line );
+
+#if defined(STANDALONEMIXRIB) && !defined(FORNONWIN)
+#define MSS_CALLBACK_ALIGNED_NAME( name ) name##_fixup
+#define MSS_DEC_CB_STACK_ALIGN( name ) DXDEC void AILCALL MSS_CALLBACK_ALIGNED_NAME(name)(void);
+#else
+#define MSS_CALLBACK_ALIGNED_NAME( name ) name
+#define MSS_DEC_CB_STACK_ALIGN( name )
+#endif
+
+MSS_DEC_CB_STACK_ALIGN( MSS_alloc_info )
+MSS_DEC_CB_STACK_ALIGN( MSS_free_info)
+
+
+#ifndef RIB_H // RIB.H contents included if RIB.H not already included
+
+#define RIB_H
+#define ARY_CNT(x) (sizeof((x)) / sizeof((x)[0]))
+
+// ----------------------------------
+// RIB data types
+// ----------------------------------
+
+typedef S32 RIBRESULT;
+
+#define RIB_NOERR 0 // Success -- no error
+#define RIB_NOT_ALL_AVAILABLE 1 // Some requested functions/attribs not available
+#define RIB_NOT_FOUND 2 // Resource not found
+#define RIB_OUT_OF_MEM 3 // Out of system RAM
+
+//
+// Handle to interface provider
+//
+
+typedef UINTa HPROVIDER;
+
+//
+// Handle representing token used to obtain property data
+//
+// This needs to be large enough to store a function pointer
+//
+
+typedef UINTa HPROPERTY;
+
+//
+// Data types for RIB properties
+//
+
+typedef enum
+{
+ RIB_NONE = 0, // No type
+ RIB_CUSTOM, // Used for pointers to application-specific structures
+ RIB_DEC, // Used for 32-bit integer values to be reported in decimal
+ RIB_HEX, // Used for 32-bit integer values to be reported in hex
+ RIB_FLOAT, // Used for 32-bit single-precision FP values
+ RIB_PERCENT, // Used for 32-bit single-precision FP values to be reported as percentages
+ RIB_BOOL, // Used for Boolean-constrained integer values to be reported as TRUE or FALSE
+ RIB_STRING, // Used for pointers to null-terminated ASCII strings
+ RIB_READONLY = 0x80000000 // Property is read-only
+}
+RIB_DATA_SUBTYPE;
+
+//
+// RIB_ENTRY_TYPE structure, used to register an interface or request one
+//
+
+typedef enum
+{
+ RIB_FUNCTION = 0,
+ RIB_PROPERTY, // Property: read-only or read-write data type
+ RIB_ENTRY_FORCE_32 = 0x7fffffff
+}
+RIB_ENTRY_TYPE;
+
+//
+// RIB_INTERFACE_ENTRY, used to represent a function or data entry in an
+// interface
+//
+
+typedef struct
+{
+ RIB_ENTRY_TYPE type; // See list above
+ const C8 *entry_name; // Name of desired function or property
+ UINTa token; // Function pointer or property token
+ RIB_DATA_SUBTYPE subtype; // Property subtype
+}
+RIB_INTERFACE_ENTRY;
+
+//
+// Standard RAD Interface Broker provider identification properties
+//
+
+#define PROVIDER_NAME ((U32) (S32) (-100)) // RIB_STRING name of decoder
+#define PROVIDER_VERSION ((U32) (S32) (-101)) // RIB_HEX BCD version number
+
+//
+// Standard function to obtain provider properties (see PROVIDER_ defines
+// above)
+//
+// Each provider of a searchable interface must export this function
+//
+
+typedef S32 (AILCALL *PROVIDER_PROPERTY) (HPROPERTY index,
+ void * before_value,
+ void const * new_value,
+ void * after_value
+ );
+
+//
+// Macros to simplify interface registrations/requests for functions,
+// and properties
+//
+
+#define FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE }
+#define REG_FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE }
+
+#define PR(entry_name,ID) { RIB_PROPERTY, (entry_name), (UINTa) &(ID), RIB_NONE }
+#define REG_PR(entry_name,ID,subtype) { RIB_PROPERTY, (entry_name), (UINTa) (ID), subtype }
+
+#define RIB_register(x,y,z) RIB_register_interface ((HPROVIDER)(x), y, ARY_CNT(z), z)
+#define RIB_unregister(x,y,z) RIB_unregister_interface((HPROVIDER)(ssx), y, ARY_CNT(z), z)
+#define RIB_unregister_all(x) RIB_unregister_interface((HPROVIDER)(x), 0, 0, 0)
+#define RIB_free_libraries() RIB_free_provider_library((HPROVIDER)(0));
+#define RIB_request(x,y,z) RIB_request_interface (x, y, ARY_CNT(z), z)
+
+// passed to RIB DLLs in Miles 9 and up (so RIBS don't have to link to MSS32.dll)
+typedef HPROVIDER AILCALL RIB_ALLOC_PROVIDER_HANDLE_TYPE(long module);
+
+typedef RIBRESULT AILCALL RIB_REGISTER_INTERFACE_TYPE (HPROVIDER provider,
+ C8 const *interface_name,
+ S32 entry_count,
+ RIB_INTERFACE_ENTRY const *rlist);
+
+typedef RIBRESULT AILCALL RIB_UNREGISTER_INTERFACE_TYPE (HPROVIDER provider,
+ C8 const *interface_name,
+ S32 entry_count,
+ RIB_INTERFACE_ENTRY const *rlist);
+
+#define RIB_registerP(x,y,z) rib_reg ((HPROVIDER)(x), y, ARY_CNT(z), z)
+#define RIB_unregister_allP(x) rib_unreg ((HPROVIDER)(x), 0, 0, 0)
+
+
+// ----------------------------------
+// Standard RIB API prototypes
+// ----------------------------------
+
+DXDEC HPROVIDER AILCALL RIB_alloc_provider_handle (long module);
+DXDEC void AILCALL RIB_free_provider_handle (HPROVIDER provider);
+
+DXDEC HPROVIDER AILCALL RIB_load_provider_library (C8 const *filename);
+DXDEC void AILCALL RIB_free_provider_library (HPROVIDER provider);
+
+DXDEC RIBRESULT AILCALL RIB_register_interface (HPROVIDER provider,
+ C8 const *interface_name,
+ S32 entry_count,
+ RIB_INTERFACE_ENTRY const *rlist);
+
+DXDEC RIBRESULT AILCALL RIB_unregister_interface (HPROVIDER provider,
+ C8 const *interface_name,
+ S32 entry_count,
+ RIB_INTERFACE_ENTRY const *rlist);
+
+DXDEC RIBRESULT AILCALL RIB_request_interface (HPROVIDER provider,
+ C8 const *interface_name,
+ S32 entry_count,
+ RIB_INTERFACE_ENTRY *rlist);
+
+DXDEC RIBRESULT AILCALL RIB_request_interface_entry (HPROVIDER provider,
+ C8 const *interface_name,
+ RIB_ENTRY_TYPE entry_type,
+ C8 const *entry_name,
+ UINTa *token);
+
+DXDEC S32 AILCALL RIB_enumerate_interface (HPROVIDER provider,
+ C8 const *interface_name,
+ RIB_ENTRY_TYPE type,
+ HMSSENUM *next,
+ RIB_INTERFACE_ENTRY *dest);
+
+DXDEC S32 AILCALL RIB_enumerate_providers (C8 const *interface_name,
+ HMSSENUM *next,
+ HPROVIDER *dest);
+
+DXDEC C8 * AILCALL RIB_type_string (void const * data,
+ RIB_DATA_SUBTYPE subtype);
+
+DXDEC HPROVIDER AILCALL RIB_find_file_provider (C8 const *interface_name,
+ C8 const *property_name,
+ C8 const *file_suffix);
+
+DXDEC HPROVIDER AILCALL RIB_find_provider (C8 const *interface_name,
+ C8 const *property_name,
+ void const *property_value);
+
+//
+// Static library definitions
+//
+
+#ifdef MSS_STATIC_RIB
+ #define RIB_MAIN_NAME( name ) name##_RIB_Main
+
+ DXDEC S32 AILCALL RIB_MAIN_NAME(SRS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(DTS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(DolbySurround)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(MP3Dec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(OggDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(BinkADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(SpxDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(SpxEnc)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(Voice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(SpxVoice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+ DXDEC S32 AILCALL RIB_MAIN_NAME(DSP)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+
+#ifdef IS_XENON
+ DXDEC S32 AILCALL RIB_MAIN_NAME(XMADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+#endif
+
+ #define Register_RIB(name) RIB_load_static_provider_library(RIB_MAIN_NAME(name),#name)
+
+#else // MSS_STATIC_RIB
+ #define RIB_MAIN_NAME( name ) RIB_Main
+ DXDEC S32 AILCALL RIB_Main( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+#endif // MSS_STATIC_RIB
+
+typedef S32 ( AILCALL * RIB_MAIN_FUNC) ( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg );
+
+DXDEC HPROVIDER AILCALL RIB_load_static_provider_library (RIB_MAIN_FUNC main, const char* description);
+
+
+DXDEC HPROVIDER AILCALL RIB_find_files_provider (C8 const *interface_name,
+ C8 const *property_name_1,
+ C8 const *file_suffix_1,
+ C8 const *property_name_2,
+ C8 const *file_suffix_2);
+
+DXDEC HPROVIDER AILCALL RIB_find_file_dec_provider (C8 const *interface_name,
+ C8 const *property_name_1,
+ U32 decimal_property_value_1,
+ C8 const *property_name_2,
+ C8 const *file_suffix_2);
+
+DXDEC S32 AILCALL RIB_load_application_providers
+ (C8 const *filespec);
+
+DXDEC void AILCALL RIB_set_provider_user_data (HPROVIDER provider,
+ U32 index,
+ SINTa value);
+
+DXDEC SINTa AILCALL RIB_provider_user_data (HPROVIDER provider,
+ U32 index);
+
+DXDEC void AILCALL RIB_set_provider_system_data
+ (HPROVIDER provider,
+ U32 index,
+ SINTa value);
+
+DXDEC SINTa AILCALL RIB_provider_system_data (HPROVIDER provider,
+ U32 index);
+
+DXDEC C8 * AILCALL RIB_error (void);
+
+#endif // RIB_H
+
+
+#ifndef MSS_ASI_VERSION // MSSASI.H contents included if MSSASI.H not already included
+
+#define AIL_ASI_VERSION 1
+#define AIL_ASI_REVISION 0
+
+//
+// Handle to stream being managed by ASI codec
+//
+
+typedef SINTa HASISTREAM;
+
+//
+// ASI result codes
+//
+
+typedef S32 ASIRESULT;
+
+#define ASI_NOERR 0 // Success -- no error
+#define ASI_NOT_ENABLED 1 // ASI not enabled
+#define ASI_ALREADY_STARTED 2 // ASI already started
+#define ASI_INVALID_PARAM 3 // Invalid parameters used
+#define ASI_INTERNAL_ERR 4 // Internal error in ASI driver
+#define ASI_OUT_OF_MEM 5 // Out of system RAM
+#define ASI_ERR_NOT_IMPLEMENTED 6 // Feature not implemented
+#define ASI_NOT_FOUND 7 // ASI supported device not found
+#define ASI_NOT_INIT 8 // ASI not initialized
+#define ASI_CLOSE_ERR 9 // ASI not closed correctly
+
+// ----------------------------------
+// Application-provided ASI callbacks
+// ----------------------------------
+
+//
+// AILASIFETCHCB: Called by ASI to obtain data from stream source
+//
+// offset normally will be either 0 at the first call made by the codec
+// or -1 to specify a continuous stream, except when ASI_stream_seek()
+// is called to restart the stream codec at a new stream offset. In this
+// case, the application must execute the seek operation on the ASI codec's
+// behalf.
+//
+// In response to this callback, the application should read the requested
+// data and copy it to the specified destination buffer, returning the number
+// of bytes copied (which can be less than bytes_requested if the end of
+// the stream is reached).
+//
+
+
+typedef S32 (AILCALLBACK * AILASIFETCHCB) (UINTa user, // User value passed to ASI_open_stream()
+ void *dest, // Location to which stream data should be copied by app
+ S32 bytes_requested, // # of bytes requested by ASI codec
+ S32 offset); // If not -1, application should seek to this point in stream
+
+//############################################################################
+//## ##
+//## Interface "ASI codec" ##
+//## ##
+//############################################################################
+
+//
+// Initialize ASI stream codec
+//
+// No other ASI functions may be called outside an ASI_startup() /
+// ASI_shutdown() pair, except for the standard RIB function
+// PROVIDER_property() where appropriate.
+//
+
+typedef ASIRESULT (AILCALL *ASI_STARTUP)(void);
+
+//
+// Shut down ASI codec
+//
+
+typedef ASIRESULT (AILCALL * ASI_SHUTDOWN)(void);
+
+//
+// Return codec error message, or NULL if no errors have occurred since
+// last call
+//
+// The ASI error text state is global to all streams
+//
+
+typedef C8 * (AILCALL * ASI_ERROR)(void);
+
+//############################################################################
+//## ##
+//## Interface "ASI stream" ##
+//## ##
+//############################################################################
+
+//
+// Open a stream, returning handle to stream
+//
+
+typedef HASISTREAM (AILCALL *ASI_STREAM_OPEN) (MSS_ALLOC_TYPE * palloc,
+ MSS_FREE_TYPE * pfree,
+ UINTa user, // User value passed to fetch callback
+ AILASIFETCHCB fetch_CB, // Source data fetch handler
+ U32 total_size); // Total size for %-done calculations (0=unknown)
+
+//
+// Translate data in stream, returning # of bytes actually decoded or encoded
+//
+// Any number of bytes may be requested. Requesting more data than is
+// available in the codec's internal buffer will cause the AILASIFETCHCB
+// handler to be called to fetch more data from the stream.
+//
+
+typedef S32 (AILCALL *ASI_STREAM_PROCESS) (HASISTREAM stream, // Handle of stream
+ void *buffer, // Destination for processed data
+ S32 buffer_size); // # of bytes to return in buffer
+
+//
+// Restart stream decoding process at new offset
+//
+// Relevant for decoders only
+//
+// Seek destination is given as offset in bytes from beginning of stream
+//
+// At next ASI_stream_process() call, decoder will seek to the closest possible
+// point in the stream which occurs at or after the specified position
+//
+// This function has no effect for decoders which do not support random
+// seeks on a given stream type
+//
+// Warning: some decoders may need to implement seeking by reparsing
+// the entire stream up to the specified offset, through multiple calls
+// to the data-fetch callback. This operation may be extremely
+// time-consuming on large files or slow network connections.
+//
+// A stream_offset value of -1 may be used to inform the decoder that the
+// application has changed the input stream offset on its own, e.g. for a
+// double-buffering application where the ASI decoder is not accessing the
+// stream directly. ASI decoders should respond to this by flushing all
+// internal buffers and resynchronizing themselves to the data stream.
+//
+
+typedef ASIRESULT (AILCALL *ASI_STREAM_SEEK) (HASISTREAM stream,
+ S32 stream_offset);
+
+//
+// Retrieve or set a property value by index (returns 1 on success)
+//
+
+typedef S32 (AILCALL *ASI_STREAM_PROPERTY) (HASISTREAM stream,
+ HPROPERTY property,
+ void * before_value,
+ void const * new_value,
+ void * after_value
+ );
+
+//
+// Close stream, freeing handle and all internally-allocated resources
+//
+
+typedef ASIRESULT (AILCALL *ASI_STREAM_CLOSE) (HASISTREAM stream);
+
+#endif // MSS_ASI_VERSION
+
+//############################################################################
+//## ##
+//## Interface "MSS mixer services" ##
+//## ##
+//############################################################################
+
+//
+// Operation flags used by mixer and filter modules
+//
+
+#define M_DEST_STEREO 1 // Set to enable stereo mixer output
+#define M_SRC_16 2 // Set to enable mixing of 16-bit samples
+#define M_FILTER 4 // Set to enable filtering when resampling
+#define M_SRC_STEREO 8 // Set to enable mixing of stereo input samples
+#define M_RESAMPLE 16 // Set to enable playback ratios other than 65536
+#define M_VOL_SCALING 32 // Set to enable volume scalars other than 2048
+#define M_COPY16_NOVOL 64
+
+#ifdef IS_32
+
+//
+// Initialize mixer
+//
+// No other mixer functions may be called outside a MIXER_startup() /
+// MIXER_shutdown() pair, except for the standard RIB function
+// PROVIDER_property() as appropriate.
+//
+
+typedef void (AILCALL *MIXER_STARTUP)(void);
+
+//
+// Shut down mixer
+//
+
+typedef void (AILCALL *MIXER_SHUTDOWN)(void);
+
+//
+// Flush mixer buffer
+//
+
+typedef void (AILCALL *MIXER_FLUSH) (S32 *dest,
+ S32 len
+#ifdef IS_X86
+ ,U32 MMX_available
+#endif
+ );
+
+//
+// Perform audio mixing operation
+//
+
+typedef void (AILCALL *MIXER_MERGE) (void const * *src,
+ U32 *src_fract,
+ void const *src_end,
+ S32 * *dest,
+ void *dest_end,
+ S32 *left_val,
+ S32 *right_val,
+ S32 playback_ratio,
+ S32 scale_left,
+ S32 scale_right,
+ U32 operation
+#ifdef IS_X86
+ ,U32 MMX_available
+#endif
+ );
+
+//
+// Translate mixer buffer contents to final output format
+//
+// "option" parameter is big_endian_output on Mac, MMX on x86, overwrite flag on PS2
+//
+
+typedef void (AILCALL *MIXER_COPY) (void const *src,
+ S32 src_len,
+ void *dest,
+ U32 operation
+#if defined(IS_BE) || defined(IS_X86)
+ ,U32 option
+#endif
+ );
+
+#else
+
+//
+// Initialize mixer
+//
+// No other mixer functions may be called outside a MIXER_startup() /
+// MIXER_shutdown() pair, except for the standard RIB function
+// PROVIDER_property() as appropriate.
+//
+
+typedef void (AILCALL *MIXER_STARTUP)(void);
+
+//
+// Shut down mixer
+//
+
+typedef void (AILCALL *MIXER_SHUTDOWN)(void);
+
+//
+// Flush mixer buffer
+//
+
+typedef void (AILCALL *MIXER_FLUSH) (S32 *dest,
+ S32 len,
+ U32 MMX_available);
+
+//
+// Perform audio mixing operation
+//
+
+typedef void (AILCALL *MIXER_MERGE) (U32 src_sel,
+ U32 dest_sel,
+ U32 *src_fract,
+ U32 *src_offset,
+ U32 *dest_offset,
+ U32 src_end_offset,
+ U32 dest_end_offset,
+ S32 *left_val,
+ S32 *right_val,
+ S32 playback_ratio,
+ S32 scale_both,
+ U32 operation);
+
+//
+// Translate mixer buffer contents to final output format
+//
+
+typedef void (AILCALL *MIXER_COPY) (void const *src,
+ S32 src_len,
+ void *dest,
+ U32 operation,
+ U32 option);
+#endif
+
+
+typedef struct _MSS_BB // Used in both MC and conventional mono/stereo configurations
+{
+ S32 *buffer; // Build buffer
+ S32 bytes; // Size in bytes
+ S32 chans; // Always mono (1) or stereo (2)
+
+ S32 speaker_offset; // Destination offset in interleaved PCM block for left channel
+} MSS_BB;
+
+typedef struct _ADPCMDATATAG
+{
+ U32 blocksize;
+ U32 extrasamples;
+ U32 blockleft;
+ U32 step;
+ UINTa savesrc;
+ U32 sample;
+ UINTa destend;
+ UINTa srcend;
+ U32 samplesL;
+ U32 samplesR;
+ U16 moresamples[16];
+} ADPCMDATA;
+
+typedef void (AILCALL * MIXER_MC_COPY) ( MSS_BB * build,
+ S32 n_build_buffers,
+ void * lpWaveAddr,
+ S32 hw_format,
+#ifdef IS_X86
+ S32 use_MMX,
+#endif
+ S32 samples_per_buffer,
+ S32 physical_channels_per_sample );
+
+
+typedef void (AILCALL * MIXER_ADPCM_DECODE ) ( void * dest,
+ void const * in,
+ S32 out_len,
+ S32 in_len,
+ S32 input_format,
+ ADPCMDATA *adpcm_data);
+
+//
+// Type definitions
+//
+
+struct _DIG_DRIVER;
+
+struct _MDI_DRIVER;
+
+typedef struct _DIG_DRIVER * HDIGDRIVER; // Handle to digital driver
+
+typedef struct _MDI_DRIVER * HMDIDRIVER; // Handle to XMIDI driver
+
+typedef struct _SAMPLE * HSAMPLE; // Handle to sample
+
+typedef struct _SEQUENCE * HSEQUENCE; // Handle to sequence
+
+typedef S32 HTIMER; // Handle to timer
+
+
+//
+// Function pointer types
+//
+
+typedef void (AILCALLBACK* AILINCB) (void const *data, S32 len, UINTa user_data);
+
+typedef void (AILCALLBACK* AILTRACECB) (C8 *text, S32 nest_depth);
+
+typedef void (AILCALLBACK* AILTIMERCB) (UINTa user);
+
+typedef void (AILCALLBACK* AILSAMPLECB) (HSAMPLE sample);
+
+typedef void (AILCALLBACK* AILMIXERCB) (HDIGDRIVER dig);
+
+typedef F32 (AILCALLBACK* AILFALLOFFCB) (HSAMPLE sample, F32 distance, F32 rolloff_factor, F32 min_dist, F32 max_dist);
+
+typedef S32 (AILCALLBACK* AILEVENTCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 status,S32 data_1,S32 data_2);
+
+typedef S32 (AILCALLBACK* AILTIMBRECB) (HMDIDRIVER hmi,S32 bank,S32 patch);
+
+typedef S32 (AILCALLBACK* AILPREFIXCB) (HSEQUENCE seq,S32 log,S32 data);
+
+typedef void (AILCALLBACK* AILTRIGGERCB) (HSEQUENCE seq,S32 log,S32 data);
+
+typedef void (AILCALLBACK* AILBEATCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 beat,S32 measure);
+
+typedef void (AILCALLBACK* AILSEQUENCECB) (HSEQUENCE seq);
+
+typedef S32 (AILCALLBACK *SS_STREAM_CB) (HSAMPLE S, S16 *dest_mono_sample_buffer, S32 dest_buffer_size);
+
+//
+// Handle to sample and driver being managed by pipeline filter
+//
+
+typedef SINTa HSAMPLESTATE;
+typedef SINTa HDRIVERSTATE;
+
+//
+// Digital pipeline stages
+//
+// These are the points at which external modules may be installed into
+// a given HSAMPLE or HDIGDRIVER's processing pipeline
+//
+
+typedef enum
+{
+ SP_ASI_DECODER = 0, // Must be "ASI codec stream" provider
+ SP_FILTER, // Must be "MSS pipeline filter" provider
+ SP_FILTER_0 = SP_FILTER, // Must be "MSS pipeline filter" provider
+ SP_FILTER_1, // Must be "MSS pipeline filter" provider
+ SP_FILTER_2, // Must be "MSS pipeline filter" provider
+ SP_FILTER_3, // Must be "MSS pipeline filter" provider
+ SP_FILTER_4, // Must be "MSS pipeline filter" provider
+ SP_FILTER_5, // Must be "MSS pipeline filter" provider
+ SP_FILTER_6, // Must be "MSS pipeline filter" provider
+ SP_FILTER_7, // Must be "MSS pipeline filter" provider
+ SP_MERGE, // Must be "MSS mixer" provider
+ N_SAMPLE_STAGES, // Placeholder for end of list (= # of valid sample pipeline stages)
+ SP_OUTPUT = N_SAMPLE_STAGES, // Used to set/get prefs/attribs on a driver's output or matrix filter (if present)
+ SAMPLE_ALL_STAGES // Used to signify all pipeline stages, for shutdown
+}
+SAMPLESTAGE;
+
+#define N_SP_FILTER_STAGES 8 // SP_FILTER_0 ... SP_FILTER_7
+
+typedef enum
+{
+ DP_FLUSH = 0, // Must be "MSS mixer" provider
+ DP_DEFAULT_FILTER, // Must be "MSS pipeline filter" provider (sets the default)
+ DP_DEFAULT_MERGE, // Must be "MSS mixer" provider (sets the default)
+ DP_COPY, // Must be "MSS mixer" provider
+ DP_MC_COPY, // Must be "MSS mixer" provider
+ DP_ADPCM_DECODE, // Must be "MSS mixer" provider
+ N_DIGDRV_STAGES, // Placeholder for end of list (= # of valid stages)
+ DIGDRV_ALL_STAGES // Used to signify all pipeline stages, for shutdown
+}
+DIGDRVSTAGE;
+
+typedef struct
+ {
+ ASI_STREAM_OPEN ASI_stream_open;
+ ASI_STREAM_PROCESS ASI_stream_process;
+ ASI_STREAM_SEEK ASI_stream_seek;
+ ASI_STREAM_CLOSE ASI_stream_close;
+ ASI_STREAM_PROPERTY ASI_stream_property;
+
+ HPROPERTY INPUT_BIT_RATE;
+ HPROPERTY INPUT_SAMPLE_RATE;
+ HPROPERTY INPUT_BITS;
+ HPROPERTY INPUT_CHANNELS;
+ HPROPERTY OUTPUT_BIT_RATE;
+ HPROPERTY OUTPUT_SAMPLE_RATE;
+ HPROPERTY OUTPUT_BITS;
+ HPROPERTY OUTPUT_CHANNELS;
+ HPROPERTY OUTPUT_CHANNEL_MASK;
+ HPROPERTY OUTPUT_RESERVOIR;
+ HPROPERTY POSITION;
+ HPROPERTY PERCENT_DONE;
+ HPROPERTY MIN_INPUT_BLOCK_SIZE;
+ HPROPERTY RAW_RATE;
+ HPROPERTY RAW_BITS;
+ HPROPERTY RAW_CHANNELS;
+ HPROPERTY REQUESTED_RATE;
+ HPROPERTY REQUESTED_BITS;
+ HPROPERTY REQUESTED_CHANS;
+ HPROPERTY STREAM_SEEK_POS;
+ HPROPERTY DATA_START_OFFSET;
+ HPROPERTY DATA_LEN;
+ HPROPERTY EXACT_SEEK;
+ HPROPERTY EXACT_GETPOS;
+ HPROPERTY SEEK_LOOKUP;
+ HPROPERTY SET_LOOPING_SAMPLES;
+ HPROPERTY CLEAR_LOOP_META;
+
+ HASISTREAM stream;
+ }
+ASISTAGE;
+
+typedef struct
+ {
+ struct _FLTPROVIDER *provider;
+ HSAMPLESTATE sample_state[MAX_SPEAKERS];
+ }
+FLTSTAGE;
+
+typedef struct
+{
+ S32 active; // Pass-through if 0, active if 1
+ HPROVIDER provider;
+
+ union
+ {
+ ASISTAGE ASI;
+ MIXER_MERGE MSS_mixer_merge;
+ FLTSTAGE FLT;
+ }
+ TYPE;
+}
+SPINFO;
+
+typedef struct
+{
+ S32 active; // Pass-through if 0, active if 1
+ HPROVIDER provider;
+
+ union
+ {
+ MIXER_FLUSH MSS_mixer_flush;
+ MIXER_COPY MSS_mixer_copy;
+ MIXER_MC_COPY MSS_mixer_mc_copy;
+ MIXER_ADPCM_DECODE MSS_mixer_adpcm_decode;
+ }
+ TYPE;
+}
+DPINFO;
+
+//
+// Other data types
+//
+
+typedef enum
+{
+ WIN32_HWAVEOUT, // waveOut handle for HDIGDRIVER, if any
+ WIN32_HWAVEIN, // waveIn handle for HDIGINPUT, if any
+ WIN32_LPDS, // lpDirectSound pointer for HSAMPLE
+ WIN32_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE
+ WIN32_HWND, // HWND that will be used to open DirectSound driver
+ WIN32_POSITION_ERR, // Nonzero if DirectSound play cursor stops moving (e.g., headphones removed)
+
+ PS3_AUDIO_PORT, // cellaudio port that Miles is using
+ PS3_AUDIO_ADDRESS, // address of cellaudio sound buffer
+ PS3_AUDIO_LENGTH, // length of cellaudio sound buffer
+ PS3_AUDIO_POSITION, // current playback position of cellaudio sound buffer
+
+ PSP_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw
+ PSP_AUDIO_PORT, // Port # Miles is using, -1 for simple audio, >= 0 for libwave
+
+ PSP2_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw
+ PSP2_AUDIO_PORT, // Port # Miles is using
+
+ OAL_CONTEXT, // OpenAL Context
+ OAL_DEVICE, // OpenAL Device
+
+ XB_LPDS, // lpDirectSound pointer for HSAMPLE
+ XB_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE
+
+ XB360_LPXAB // IXAudioSourceVoice pointer for HDIGDRIVER
+}
+MSS_PLATFORM_PROPERTY;
+
+
+typedef struct _AIL_INPUT_INFO // Input descriptor type
+{
+ AILINCB callback; // Callback function to receive incoming data
+ UINTa user_data; // this is a user defined value
+ U32 device_ID; // DS LPGUID or wave device ID
+ U32 hardware_format; // e.g., DIG_F_STEREO_16
+ U32 hardware_rate; // e.g., 22050
+ S32 buffer_size; // Maximum # of bytes to be passed to callback (-1 to use DIG_INPUT_LATENCY)
+} AIL_INPUT_INFO;
+
+typedef struct _AILTIMER // Timer instance
+{
+ AILTIMERCB callback;
+ U64 next;
+ U64 delta;
+ UINTa user;
+ U32 status;
+} AILTIMERSTR;
+
+#ifndef IS_WIN64
+
+ #define OFSblocksize 0 // these constants valid for 32-bit versions only!
+ #define OFSextrasamples 4
+ #define OFSblockleft 8
+ #define OFSstep 12
+ #define OFSsavesrc 16
+ #define OFSsample 20
+ #define OFSdestend 24
+ #define OFSsrcend 28
+ #define OFSsamplesL 32
+ #define OFSsamplesR 36
+ #define OFSmoresamples 40
+
+#endif
+
+typedef struct LOWPASS_INFO
+{
+ S32 X0, X1;
+ S32 Y0, Y1;
+ S32 A, B0, B1;
+ S32 flags;
+ S32 queuedA, queuedB;
+ F32 calculated_cut;
+ F32 cutoff;
+} LOWPASS_INFO;
+
+
+typedef union STAGE_BUFFER
+{
+ union STAGE_BUFFER * next;
+ U8 data[ 1 ];
+} STAGE_BUFFER;
+
+typedef struct _MSSVECTOR3D
+{
+ F32 x;
+ F32 y;
+ F32 z;
+} MSSVECTOR3D;
+
+#define MILES_TANGENT_LINEAR 0
+#define MILES_TANGENT_CURVE 1
+#define MILES_TANGENT_STEP 2
+#define MILES_MAX_FALLOFF_GRAPH_POINTS 5
+
+#define MILES_MAX_SEGMENT_COUNT 10
+
+typedef struct _MSSGRAPHPOINT
+{
+ F32 X, Y, ITX, ITY, OTX, OTY; // Point & tangents.
+ S32 IType, OType;
+} MSSGRAPHPOINT;
+
+typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D positioning
+{
+ MSSVECTOR3D position; // 3D position
+ MSSVECTOR3D face; // 3D orientation
+ MSSVECTOR3D up; // 3D up-vector
+ MSSVECTOR3D velocity; // 3D velocity
+
+ S32 doppler_valid; // TRUE if OK to apply Doppler shift
+ F32 doppler_shift; // Scalar for S->playback rate
+
+ F32 inner_angle; // Cone attenuation parameters
+ F32 outer_angle; // (Angles divided by two and convered to rads for dot-product comparisons)
+ F32 outer_volume;
+ S32 cone_enabled;
+
+ F32 max_dist; // Sample distances
+ F32 min_dist;
+ S32 dist_changed; // TRUE if min/max distances have changed and need to be sent to the hardware
+
+ S32 auto_3D_atten; // TRUE if distance/cone attenuation should be applied to wet signal
+ F32 atten_3D; // Attenuation due to distance/cone effects, calculated by software 3D positioner
+ F32 rolloff; // per sample rolloff factor to use instead of global rolloff, if non zero.
+
+ F32 exclusion_3D; // exclusion value computed by falloff graph. -1 if not affected.
+ F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected.
+
+ F32 spread;
+
+ HSAMPLE owner; // May be NULL if used for temporary/internal calculations
+ AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired
+
+ MSSVECTOR3D position_graph[MILES_MAX_SEGMENT_COUNT];
+ S32 position_graph_count;
+
+ MSSGRAPHPOINT volgraph[MILES_MAX_FALLOFF_GRAPH_POINTS];
+ MSSGRAPHPOINT excgraph[MILES_MAX_FALLOFF_GRAPH_POINTS];
+ MSSGRAPHPOINT lpgraph[MILES_MAX_FALLOFF_GRAPH_POINTS];
+ MSSGRAPHPOINT spreadgraph[MILES_MAX_FALLOFF_GRAPH_POINTS];
+
+ U8 volgraphcnt;
+ U8 excgraphcnt;
+ U8 lpgraphcnt;
+ U8 spreadgraphcnt;
+
+} S3DSTATE;
+
+typedef struct _SMPBUF
+{
+ void const *start; // Sample buffer address (W)
+ U32 len; // Sample buffer size in bytes (W)
+ U32 pos; // Index to next byte (R/W)
+ U32 done; // Nonzero if buffer with len=0 sent by app
+ S32 reset_ASI; // Reset the ASI decoder at the end of the buffer
+ S32 reset_seek_pos; // New destination offset in stream source data, for ASI codecs that care
+} SMPBUF;
+
+typedef struct _SAMPLE // Sample instance
+{
+ U32 tag; // HSAM
+
+ HDIGDRIVER driver; // Driver for playback
+
+ S32 index; // Numeric index of this sample
+
+ SMPBUF buf[8]; // Source data buffers
+
+ U32 src_fract; // Fractional part of source address
+
+ U32 mix_delay; // ms until start mixing (decreased every buffer mix)
+ F32 max_output_mix_volume; // max_volume of any speaker at last mix
+
+ U64 mix_bytes; // total number of bytes sent to the mixer for this sample.
+
+ S32 group_id; // ID for grouped operations.
+
+ // size of the next dynamic arrays
+ U32 chan_buf_alloced;
+ U32 chan_buf_used;
+ U8* chan_buf_ptr;
+
+ // these are dynamic arrays sized as n_channels long (so 1 for mono, 2 stereo, 6 for 5.1)
+ S32 *left_val;
+ S32 *right_val;
+ S32 *last_decomp;
+ LOWPASS_INFO *lp; // low pass info
+
+
+ // these are dynamic arrays pointing to dynamic arrays, each of the sub arrays are n_channels long or [MAX_SPEAKERS][n_channels]
+ F32 **user_channel_levels; // Channel levels set by AIL_set_sample_channel_levels() [source_channels][driver->logical_channels]
+ S32 **cur_scale; // Calculated 11-bit volume scale factors for current/previous mixing interval
+ S32 **prev_scale; // (These are all indexed by build buffer*2, not speaker indexes!)
+ S32 **ramps_left;
+
+ // these are dynamic arrays
+ F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned)
+ F32 *speaker_levels; // one level per speaker (multiplied after user or 3D)
+
+ S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel #
+ // 99% of the time this is a 1:1 mapping and is zero.
+
+ S32 lp_any_on; // are any of the low pass filters on?
+ S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced?
+
+ S32 n_buffers; // # of buffers (default = 2)
+ S32 head;
+ S32 tail;
+ S32 starved; // Buffer stream has run out of data
+ S32 exhaust_ASI; // Are we prolonging the buffer lifetime until ASI output is exhausted?
+
+ S32 loop_count; // # of cycles-1 (1=one-shot, 0=indefinite)
+ S32 loop_start; // Starting offset of loop block (0=SOF)
+ S32 loop_end; // End offset of loop block (-1=EOF)
+ S32 orig_loop_count; // Original loop properties specified by app, before any
+ S32 orig_loop_start; // alignment constraints
+ S32 orig_loop_end;
+
+ S32 format; // DIG_F format (8/16 bits, mono/stereo/multichannel)
+ S32 n_channels; // # of channels (which can be >2 for multichannel formats)
+ U32 channel_mask; // Same as WAVEFORMATEXTENSIBLE.dwChannelMask
+
+ S32 original_playback_rate; // Playback rate in hertz
+ F32 playback_rate_factor; // Fractional playback rate, normally 1.0
+
+ F32 save_volume; // Sample volume 0-1.0
+ F32 save_pan; // Mono panpot/stereo balance (0=L ... 1.0=R)
+
+ F32 left_volume; // Left/mono volume 0 to 1.0
+ F32 right_volume; // Right volume 0 to 1.0
+ F32 wet_level; // reverb level 0 to 1.0
+ F32 dry_level; // non-reverb level 0 to 1.0
+ F32 sys_level; // system control
+
+ F32 extra_volume; // Volume scalar for ramping or otherwise.
+ F32 extra_wet;
+ F32 extra_lp;
+ F32 extra_rate;
+
+
+ U32 low_pass_changed; // bit mask for what channels changed.
+
+ S32 bus; // Bus assignment for this sample.
+ S32 bus_comp_sends; // Which buses this bus routes compressor input to.
+ S32 bus_comp_installed; // Nonzero if we have a compressor installed.
+ U32 bus_comp_input; // The input to use for this bus's compressor, if we have one installed
+ S32 bus_override_wet; // If true, samples on this bus will use the bus's wet level instead of their own.
+ U32 bus_signal_strength; // The bus level.
+ S32 bus_enable_limiter; // If true, a basic limiter will be run on the samples prior to clamping to S16.
+ S32 bus_limiter_atten; // The attenuation that was applied on the last bus pass.
+
+ S32 fade_to_stop; // # of samples to fade to stop over. ( currently fixed at the volramp count )
+
+ U64 mix_start_time; // arbitrary non-zero id for starting sounds synced.
+
+ S16 pop_fade_total;
+ S16 pop_fade_time;
+ U8 pop_fade_stop; // nonzero we end the sample when it fades out.
+
+ U8 state_level; // Level the sample was started at.
+#ifdef IS_WIIU
+ S8 route_to_drc;
+#endif
+
+ F32 obstruction;
+ F32 occlusion;
+ F32 exclusion;
+
+ S32 service_type; // 1 if single-buffered; 2 if streamed
+
+ AILSAMPLECB SOB; // Start-of-block callback function
+ AILSAMPLECB EOB; // End-of-buffer callback function
+ AILSAMPLECB EOS; // End-of-sample callback function
+
+ SINTa user_data [8]; // Miscellaneous user data
+ SINTa system_data[8]; // Miscellaneous system data
+ SINTa hl_marker_list;
+
+ ADPCMDATA adpcm;
+
+ S32 doeob; // Flags to trigger callbacks
+ S32 dosob;
+ S32 doeos;
+
+ S32 vol_ramps;
+ S32 resamp_tolerance;
+ S32 enable_resamp_filter;
+
+ //
+ // Sample pipeline stages
+ //
+
+ SPINFO pipeline[N_SAMPLE_STAGES];
+ S32 n_active_filters; // # of SP_FILTER_n stages active
+
+ //
+ // 3D-related state for all platforms (including Xbox)
+ //
+
+ S32 is_3D; // TRUE if channel levels are derived automatically from 3D positional state, FALSE if they're controlled manually
+
+ S3DSTATE S3D; // Software version applies 3D positioning only if is_3D == TRUE, but output filters always use it
+
+#ifdef MSS_VFLT_SUPPORTED
+ void *voice; // Optional object used by output filter to store per-sample information such as DS3D buffers
+#endif
+
+ F32 leftb_volume; // Left/mono volume 0 to 1.0 (back)
+ F32 rightb_volume; // Right volume 0 to 1.0 (back)
+ F32 center_volume; // Center volume 0 to 1.0
+ F32 low_volume; // Low volume 0 to 1.0
+ F32 save_fb_pan; // Sample volume 0-1.0
+ F32 save_center; // saved center level
+ F32 save_low; // saved sub level
+
+#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS)
+ S32 spu_on;
+ U32 align[1];
+#endif
+
+#if defined(IS_WINDOWS)
+
+ //
+ // DirectSound-specific data
+ //
+
+ S32 service_interval; // Service sample every n ms
+ S32 service_tick; // Current service countdown value
+ S32 buffer_segment_size; // Buffer segment size to fill
+
+ S32 prev_segment; // Previous segment # (0...n)
+ S32 prev_cursor; // Previous play cursor location
+
+ S32 bytes_remaining; // # of bytes left to play (if not -1)
+
+ S32 direct_control; // 1 if app controls buffer, 0 if MSS
+
+#endif
+} SAMPLE;
+
+#ifdef MILES_CHECK_OFFSETS
+ RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(SAMPLE, save_low) & 3) == 0);
+#endif
+
+//
+// used for AIL_process
+//
+
+typedef struct _AILMIXINFO {
+ AILSOUNDINFO Info;
+ ADPCMDATA mss_adpcm;
+ U32 src_fract;
+ S32 left_val;
+ S32 right_val;
+} AILMIXINFO;
+
+
+
+DXDEC U32 AILCALL AIL_get_timer_highest_delay (void);
+
+DXDEC void AILCALL AIL_serve(void);
+
+#ifdef IS_MAC
+
+ typedef void * LPSTR;
+
+ #define WHDR_DONE 0
+
+ typedef struct _WAVEIN
+ {
+ long temp;
+ } * HWAVEIN;
+
+ typedef struct _WAVEHDR
+ {
+ S32 dwFlags;
+ S32 dwBytesRecorded;
+ S32 dwUser;
+ S32 temp;
+ void * lpData;
+ S32 dwBufferLength;
+ S32 longdwLoops;
+ S32 dwLoops;
+ void * lpNext;
+ U32 * reserved;
+
+ } WAVEHDR, * LPWAVEHDR;
+
+#endif
+
+#define N_WAVEIN_BUFFERS 8 // Use a ring of 8 buffers by default
+
+typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver
+
+#ifdef IS_MAC
+
+ #define AIL_DIGITAL_INPUT_DEFAULT 0
+
+ typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver
+ {
+ U32 tag; // HDIN
+ S32 input_enabled; // 1 if enabled, 0 if not
+ U32 incoming_buffer_size;
+ void * incoming_buffer[ 2 ];
+ void* outgoing_buffer;
+ U32 which_buffer;
+ AIL_INPUT_INFO info; // Input device descriptor
+ AILMIXINFO incoming_info;
+ long device;
+#ifdef IS_MAC
+ char InternalRecordingState[128]; // Hide this so we dont' have to #include OS stuff everywhere.
+#endif
+ } DIG_INPUT_DRIVER;
+
+#else
+
+#define AIL_DIGITAL_INPUT_DEFAULT ((U32)WAVE_MAPPER)
+
+typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver
+{
+ U32 tag; // HDIN
+
+ HTIMER background_timer; // Background timer handle
+
+ AIL_INPUT_INFO info; // Input device descriptor
+
+ S32 input_enabled; // 1 if enabled, 0 if not
+
+ UINTa callback_user; // Callback user value
+
+ //
+ // Provider-independent data
+ //
+
+ U32 DMA_size; // Size of each DMA sub-buffer in bytes
+ void *DMA[N_WAVEIN_BUFFERS]; // Simulated DMA buffers
+
+ U32 silence; // Silence value for current format (0 or 128)
+
+ S32 device_active; // 1 if buffers submittable, 0 if not
+
+#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)
+ //
+ // waveOut-specific data
+ //
+
+ HWAVEIN hWaveIn; // Handle to wave input device
+ volatile MWAVEHDR wavehdr[N_WAVEIN_BUFFERS]; // Handles to wave headers
+
+#endif
+} DIG_INPUT_DRIVER;
+#endif
+
+
+typedef struct REVERB_CONSTANT_INFO
+{
+ F32* start0,* start1,* start2,* start3,* start4,* start5;
+ F32* end0,* end1,* end2,* end3,* end4,* end5;
+ F32 C0, C1, C2, C3, C4, C5;
+ F32 A;
+ F32 B0, B1;
+} REVERB_CONSTANT_INFO;
+
+typedef struct REVERB_UPDATED_INFO
+{
+ F32 * address0, * address1, * address2, * address3, * address4, * address5;
+ F32 X0, X1, Y0, Y1;
+} REVERB_UPDATED_INFO;
+
+typedef struct REVERB_INFO
+{
+ REVERB_UPDATED_INFO u;
+ REVERB_CONSTANT_INFO c;
+} REVERB_INFO;
+
+typedef struct REVERB_SETTINGS
+{
+ S32 room_type; // Changes to this drive master_wet and duration/damping/predelay!
+ F32 master_wet; // Master reverb level 0-1.0
+ F32 master_dry; // Master non-reverb level 0-1.0
+
+ REVERB_INFO ri;
+
+ S32 *reverb_build_buffer;
+ S32 reverb_total_size;
+ S32 reverb_fragment_size;
+ S32 reverb_buffer_size;
+ S32 reverb_on;
+ U32 reverb_off_time_ms;
+
+ U32 reverb_duration_ms;
+
+ F32 reverb_decay_time_s;
+ F32 reverb_predelay_s;
+ F32 reverb_damping;
+
+ S32 reverb_head;
+ S32 reverb_tail;
+} REVERB_SETTINGS;
+
+
+typedef struct _MSS_RECEIVER_LIST
+{
+ MSSVECTOR3D direction; // Normalized direction vector from listener
+
+ S32 speaker_index[MAX_SPEAKERS]; // List of speakers affected by sounds in this direction
+ F32 speaker_level[MAX_SPEAKERS]; // Each speaker's degree of effect from this source
+ S32 n_speakers_affected;
+} MSS_RECEIVER_LIST;
+
+typedef struct _D3DSTATE
+{
+ S32 mute_at_max;
+
+ MSSVECTOR3D listen_position;
+ MSSVECTOR3D listen_face;
+ MSSVECTOR3D listen_up;
+ MSSVECTOR3D listen_cross;
+ MSSVECTOR3D listen_velocity;
+
+ F32 rolloff_factor;
+ F32 doppler_factor;
+ F32 distance_factor;
+ F32 falloff_power;
+
+ //
+ // Precalculated listener info
+ //
+
+ S32 ambient_channels [MAX_SPEAKERS]; // E.g., LFE
+ S32 n_ambient_channels;
+
+ S32 directional_channels[MAX_SPEAKERS+1]; // Channel index, or -1 if virtual
+ MSSVECTOR3D listener_to_speaker [MAX_SPEAKERS+1];
+ S32 n_directional_channels;
+
+ MSS_RECEIVER_LIST receiver_specifications[MAX_RECEIVER_SPECS]; // Constellation of receiver vectors
+ S32 n_receiver_specs;
+
+ MSSVECTOR3D speaker_positions [MAX_SPEAKERS]; // Listener-relative speaker locations
+
+ F32 speaker_wet_reverb_response [MAX_SPEAKERS]; // Reverb sensitivity of each speaker
+ F32 speaker_dry_reverb_response [MAX_SPEAKERS];
+} D3DSTATE;
+
+typedef enum
+{
+ MSS_MC_INVALID = 0, // Used for configuration-function errors
+ MSS_MC_MONO = 1, // For compatibility with S32 channel param
+ MSS_MC_STEREO = 2,
+ MSS_MC_USE_SYSTEM_CONFIG = 0x10, // Leave space between entries for new variations
+ MSS_MC_HEADPHONES = 0x20, // with similar quality levels/speaker counts
+ MSS_MC_DOLBY_SURROUND = 0x30,
+ MSS_MC_SRS_CIRCLE_SURROUND = 0x40,
+ MSS_MC_40_DTS = 0x48,
+ MSS_MC_40_DISCRETE = 0x50,
+ MSS_MC_51_DTS = 0x58,
+ MSS_MC_51_DISCRETE = 0x60,
+ MSS_MC_61_DISCRETE = 0x70,
+ MSS_MC_71_DISCRETE = 0x80,
+ MSS_MC_81_DISCRETE = 0x90,
+ MSS_MC_DIRECTSOUND3D = 0xA0,
+ MSS_MC_EAX2 = 0xC0,
+ MSS_MC_EAX3 = 0xD0,
+ MSS_MC_EAX4 = 0xE0,
+ MSS_MC_FORCE_32 = 0x7fffffff
+}
+MSS_MC_SPEC;
+
+
+typedef struct _DIG_DRIVER // Handle to digital audio driver
+{
+ U32 tag; // HDIG
+
+ HTIMER backgroundtimer; // Background timer handle
+
+ U32 num_mixes; // incrementing number of mixes
+
+ S32 mix_ms; // rough ms per mix
+
+
+ F32 master_volume; // Master sample volume 0-1.0
+
+ S32 DMA_rate; // Hardware sample rate
+ S32 hw_format; // DIG_F code in use
+ S32 n_active_samples; // # of samples being processed
+
+ MSS_MC_SPEC channel_spec; // Original "channels" value passed to AIL_open_digital_driver()
+
+ D3DSTATE D3D; // 3D listener parms for all platforms
+
+
+#if defined(IS_PSP2) || defined(IS_PSP) || defined(IS_XENON) || defined(IS_IPHONE) || defined(IS_MAC) || defined(IS_LINUX) || defined(IS_3DS) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) // generic dig platforms
+#define IS_GENERICDIG
+ void* dig_ss; // Sound system ptr (embed in mss.h?)
+ void* dig_heap; // Sound system heap.
+#endif
+
+#ifdef IS_XENON
+ void* x2_voiceptr; //! \todo get rid of this? Only expose dig_ss?
+#endif
+
+ S32 quiet; // # of consecutive quiet sample periods
+ S32 playing; // Playback active if non-zero
+
+ S32 bytes_per_channel; // # of bytes per channel (always 1 or 2 for 8- or 16-bit hardware output)
+ S32 samples_per_buffer; // # of samples per build buffer / half-buffer
+ S32 physical_channels_per_sample; // # of channels per *physical* sample (1 or 2, or more in discrete MC mode)
+ S32 logical_channels_per_sample; // # of logical channels per sample (may differ from physical channel count in matrix formats)
+
+#ifdef IS_LINUX
+ S32 released; // has the sound manager been released?
+#endif
+
+ HSAMPLE samples; // Pointer to list of SAMPLEs
+
+ U32 *sample_status; // SMP_ flags: _FREE, _DONE, _PLAYING, moved out of SAMPLEs for faster iteration
+ S32 n_samples; // # of SAMPLEs
+
+ SINTa system_data[8]; // Miscellaneous system data
+
+ HSAMPLE bus_samples[MAX_BUSSES]; // Sample handles the bus will route through.
+ S32 bus_active_count[MAX_BUSSES]; // Number of samples mixed on the bus last mix.
+ void* bus_ptrs[MAX_BUSSES]; // Buffers for each bus to mix in to.
+
+ void* pushed_states[MILES_MAX_STATES];
+ U8 state_index;
+
+ //
+ // Build buffers
+ //
+ // In multichannel mode, source samples may be mixed into more than one
+ // build buffer
+ //
+
+ MSS_BB build[MAX_SPEAKERS+EXTRA_BUILD_BUFFERS];
+ S32 n_build_buffers; // # of build buffers actually used for output processing
+
+ S32 hardware_buffer_size; // Size of each output buffer
+
+ S32 enable_limiter;
+ S32 limiter_atten; // attenuation level from last hw copy.
+
+ S32 scheduled_sample_count; // # of samples that are waiting to be started at an exact time.
+
+ AILMIXERCB mixcb; // callback for each mix.
+
+#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)
+
+ //
+ // waveOut-specific interface data
+ //
+
+ HWAVEOUT hWaveOut; // Wave output driver
+
+ U32 reset_works; // TRUE if OK to do waveOutReset
+ U32 request_reset; // If nonzero, do waveOutReset ASAP
+
+ LPWAVEHDR first; // Pointer to first WAVEHDR in chain
+ S32 n_buffers; // # of output WAVEHDRs in chain
+
+ LPWAVEHDR volatile *return_list; // Circular list of returned WAVEHDRs
+ S32 volatile return_head; // Head of WAVEHDR list (insertion point)
+ S32 volatile return_tail; // Tail of WAVEHDR list (retrieval point)
+
+ //
+ // DirectSound-specific interface data
+ //
+
+ UINTa guid; // The guid id of the ds driver
+ AILLPDIRECTSOUND pDS; // DirectSound output driver (don't
+ // use with Smacker directly anymore!)
+
+ U32 ds_priority; // priority opened with
+
+ S32 emulated_ds; // is ds emulated or not?
+ AILLPDIRECTSOUNDBUFFER lppdsb; // primary buffer or null
+
+ UINTa dsHwnd; // HWND used with DirectSound
+
+ AILLPDIRECTSOUNDBUFFER * lpbufflist; // List of pointers to secondary buffers
+ HSAMPLE *samp_list; // HSAMPLE associated with each buffer
+ S32 *sec_format; // DIG_F_ format for secondary buffer
+ S32 max_buffs; // Max. allowable # of secondary buffers
+
+ //
+ // Driver output configuration
+ //
+ // Note: # of "logical" (source) channels per sample = dig->channels_per_sample
+ // # of "physical" (DAC) channels per sample = dig->wformat.wf.nChannels
+ //
+ // These may be different if a matrix format (e.g., Dolby/SRS)
+ // is in use!
+ //
+
+ MPCMWAVEFORMAT wformat; // format from waveout open
+ C8 wfextra[32]; // Extension to PCMWAVEFORMAT (e.g., WAVE_FORMAT_EXTENSIBLE)
+
+ //
+ // Misc. data
+ //
+
+ S32 released; // has the sound manager been released?
+
+ HDIGDRIVER next; // Pointer to next HDIGDRIVER in use
+
+ //
+ // Vars for waveOut emulation
+ //
+
+ S32 DS_initialized;
+
+ AILLPDIRECTSOUNDBUFFER DS_sec_buff; // Secondary buffer (or NULL if none)
+ AILLPDIRECTSOUNDBUFFER DS_out_buff; // Output buffer (may be sec or prim)
+ S32 DS_buffer_size; // Size of entire output buffer
+
+ S32 DS_frag_cnt; // Total fragment count and size, and
+ S32 DS_frag_size; // last fragment occupied by play cursor
+ S32 DS_last_frag;
+ S32 DS_last_write;
+ S32 DS_last_timer;
+ S32 DS_skip_time;
+
+ S32 DS_use_default_format; // 1 to force use of default DS primary buffer format
+
+ U32 position_error; // last status from position report (can be used
+ // to watch for headset removal)
+ U32 last_ds_play;
+ U32 last_ds_write;
+ U32 last_ds_move;
+
+#endif
+
+#ifdef IS_X86
+ S32 use_MMX; // Use MMX with this driver if TRUE
+#endif
+
+ U64 mix_total;
+ U64 last_polled;
+ U32 last_percent;
+
+ void * MC_buffer;
+ //
+ // Digital driver pipeline filter stages
+ //
+
+ DPINFO pipeline[N_DIGDRV_STAGES];
+
+#ifdef MSS_VFLT_SUPPORTED
+ struct _FLTPROVIDER *voice_filter;
+ SS_STREAM_CB stream_callback;
+#endif
+
+ struct _FLTPROVIDER *matrix_filter;
+
+ //
+ // Reverb
+ // If no busses are active, 0 is still used as the base reverb.
+ //
+ REVERB_SETTINGS reverb[MAX_BUSSES];
+
+#ifdef IS_PS3
+ HDIGDRIVER next; // Pointer to next HDIGDRIVER in use
+
+ void * hw_buf;
+ U32 hw_datarate;
+ U32 hw_align;
+ U32 port;
+ S32 hw_buffer_size;
+ S32 snd_frag_cnt;
+ S32 snd_frag_size;
+ S32 snd_last_frag;
+ S32 snd_last_write;
+ S32 snd_skip_time;
+ U32 snd_last_play;
+ U32 snd_last_move;
+ S32 snd_last_timer;
+#endif
+
+#ifdef IS_GENERICDIG
+ HDIGDRIVER next;
+#endif
+
+#if defined(IS_WINDOWS)
+ S32 no_wom_done; // don't process WOM_DONEs on this driver
+ U32 wom_done_buffers;
+#endif
+
+#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS)
+ U32 spu_num;
+ S32 spu_on;
+ U64 spu_total;
+ U64 spu_last_polled;
+ U32 spu_last_percent;
+ #ifdef IS_PS3
+ U32 align[ 2 ];
+ #else
+ U32 align[ 1 ];
+ #endif
+#endif
+
+ U64 adpcm_time;
+ U64 deinterlace_time;
+ U64 mix_time;
+ U64 rev_time;
+ U64 reformat_time;
+ U64 lowpass_time;
+ U64 filter_time;
+ U64 copy_time;
+ U64 sob_time;
+ U64 eob_time;
+ U64 eos_time;
+ U64 spu_wait_time;
+ U64 asi_times[4];
+
+ HSAMPLE adpcm_sam;
+ HSAMPLE deinterlace_sam;
+ HSAMPLE mix_sam;
+ HSAMPLE rev_sam;
+ HSAMPLE reformat_sam;
+ HSAMPLE lowpass_sam;
+ HSAMPLE filter_sam;
+ HSAMPLE asi_sams[4];
+
+ U32 adpcm_num;
+ U32 deinterlace_num;
+ U32 mix_num;
+ U32 rev_num;
+ U32 reformat_num;
+ U32 lowpass_num;
+ U32 filter_num;
+ U32 asi_nums[4];
+
+
+ // these clauses have to be at the end of the structure!!
+#ifdef IS_WII
+ HDIGDRIVER next; // Pointer to next HDIGDRIVER in use
+
+ U32 hw_datarate;
+ S32 hw_buffer_size;
+ S32 each_buffer_size;
+ S32 snd_frag_cnt;
+ S32 snd_frag_size;
+ S32 snd_last_frag;
+ S32 snd_last_write;
+ S32 snd_skip_time;
+ U32 snd_last_play;
+ U32 snd_last_move;
+ S32 snd_last_timer;
+
+ void * buffer[ 2 ];
+ U32 physical[ 2 ];
+
+ #ifdef AX_OUTPUT_BUFFER_DOUBLE
+ AXVPB* voice[ 2 ];
+ #endif
+
+#endif
+
+#ifdef XAUDIOFRAMESIZE_NATIVE
+ XAUDIOPACKET packet;
+#endif
+
+} DIG_DRIVER;
+
+#ifdef MILES_CHECK_OFFSETS
+ RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(DIG_DRIVER, filter_num) & 3) == 0);
+#endif
+
+typedef struct // MIDI status log structure
+ {
+ S32 program [NUM_CHANS]; // Program Change
+ S32 pitch_l [NUM_CHANS]; // Pitch Bend LSB
+ S32 pitch_h [NUM_CHANS]; // Pitch Bend MSB
+
+ S32 c_lock [NUM_CHANS]; // Channel Lock
+ S32 c_prot [NUM_CHANS]; // Channel Lock Protection
+ S32 c_mute [NUM_CHANS]; // Channel Mute
+ S32 c_v_prot [NUM_CHANS]; // Voice Protection
+ S32 bank [NUM_CHANS]; // Patch Bank Select
+ S32 gm_bank_l [NUM_CHANS]; // GM Bank Select
+ S32 gm_bank_m [NUM_CHANS]; // GM Bank Select
+ S32 indirect [NUM_CHANS]; // ICA indirect controller value
+ S32 callback [NUM_CHANS]; // Callback Trigger
+
+ S32 mod [NUM_CHANS]; // Modulation
+ S32 vol [NUM_CHANS]; // Volume
+ S32 pan [NUM_CHANS]; // Panpot
+ S32 exp [NUM_CHANS]; // Expression
+ S32 sus [NUM_CHANS]; // Sustain
+ S32 reverb [NUM_CHANS]; // Reverb
+ S32 chorus [NUM_CHANS]; // Chorus
+
+ S32 bend_range[NUM_CHANS]; // Bender Range (data MSB, RPN 0 assumed)
+
+ S32 RPN_L [NUM_CHANS]; // RPN # LSB
+ S32 RPN_M [NUM_CHANS]; // RPN # MSB
+ }
+CTRL_LOG;
+
+typedef struct _SEQUENCE // XMIDI sequence state table
+{
+ char tag[4]; // HSEQ
+
+ HMDIDRIVER driver; // Driver for playback
+
+ U32 status; // SEQ_ flagsstruct
+
+ void const *TIMB; // XMIDI IFF chunk pointers
+ void const *RBRN;
+ void const *EVNT;
+
+ U8 const *EVNT_ptr; // Current event pointer
+
+ U8 *ICA; // Indirect Controller Array
+
+ AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler
+ AILTRIGGERCB trigger_callback; // XMIDI Callback Trigger handler
+ AILBEATCB beat_callback; // XMIDI beat/bar change handler
+ AILSEQUENCECB EOS; // End-of-sequence callback function
+
+ S32 loop_count; // 0=one-shot, -1=indefinite, ...
+
+ S32 interval_count; // # of intervals until next event
+ S32 interval_num; // # of intervals since start
+
+ S32 volume; // Sequence volume 0-127
+ S32 volume_target; // Target sequence volume 0-127
+ S32 volume_accum; // Accumulated volume period
+ S32 volume_period; // Period for volume stepping
+
+ S32 tempo_percent; // Relative tempo percentage 0-100
+ S32 tempo_target; // Target tempo 0-100
+ S32 tempo_accum; // Accumulated tempo period
+ S32 tempo_period; // Period for tempo stepping
+ S32 tempo_error; // Error counter for tempo DDA
+
+ S32 beat_count; // Sequence playback position
+ S32 measure_count;
+
+ S32 time_numerator; // Sequence timing data
+ S32 time_fraction;
+ S32 beat_fraction;
+ S32 time_per_beat;
+
+ U8 const *FOR_ptrs[FOR_NEST]; // Loop stack
+ S32 FOR_loop_count [FOR_NEST];
+
+ S32 chan_map [NUM_CHANS]; // Physical channel map for sequence
+
+ CTRL_LOG shadow; // Controller values for sequence
+
+ S32 note_count; // # of notes "on"
+
+ S32 note_chan [MAX_NOTES]; // Channel for queued note (-1=free)
+ S32 note_num [MAX_NOTES]; // Note # for queued note
+ S32 note_time [MAX_NOTES]; // Remaining duration in intervals
+
+ SINTa user_data [8]; // Miscellaneous user data
+ SINTa system_data[8]; // Miscellaneous system data
+
+} SEQUENCE;
+
+#if defined(IS_MAC) || defined(IS_LINUX) || defined(IS_XENON) || defined(IS_PS3) || defined(IS_WII) || defined(IS_PSP) || defined(IS_PSP2) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__)
+
+struct MIDIHDR;
+struct MIDIOUT;
+typedef struct MIDIOUT* HMIDIOUT;
+typedef HMIDIOUT* LPHMIDIOUT;
+
+#endif
+
+typedef struct _MDI_DRIVER // Handle to XMIDI driver
+{
+ char tag[4]; // HMDI
+
+ HTIMER timer; // XMIDI quantization timer
+ S32 interval_time; // XMIDI quantization timer interval in uS
+
+ HSEQUENCE sequences; // Pointer to list of SEQUENCEs
+ S32 n_sequences; // # of SEQUENCEs
+
+ S32 lock [NUM_CHANS]; // 1 if locked, 2 if protected, else 0
+ HSEQUENCE locker[NUM_CHANS]; // HSEQUENCE which locked channel
+ HSEQUENCE owner [NUM_CHANS]; // HSEQUENCE which owned locked channel
+ HSEQUENCE user [NUM_CHANS]; // Last sequence to use channel
+ S32 state [NUM_CHANS]; // Lock state prior to being locked
+
+ S32 notes [NUM_CHANS]; // # of active notes in channel
+
+ AILEVENTCB event_trap; // MIDI event trap callback function
+ AILTIMBRECB timbre_trap; // Timbre request callback function
+
+ S32 master_volume; // Master XMIDI note volume 0-127
+
+ SINTa system_data[8]; // Miscellaneous system data
+
+#if (defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)) || defined(IS_MAC) || defined(IS_LINUX)
+
+ S32 released; // has the hmidiout handle been released
+ U32 deviceid; // ID of the MIDI device
+ U8 *sysdata; // SysEx buffer
+
+#endif
+
+#if defined(IS_XENON) || defined(IS_WII) || defined(IS_PS3) || defined(IS_PSP) || defined(IS_3DS) || defined(IS_IPHONE) || defined(IS_PSP2) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__)
+ HMDIDRIVER next; // Pointer to next HMDIDRIVER in use
+#endif
+
+#ifdef IS_LINUX
+ struct MIDIHDR *mhdr; // SysEx header
+ HMDIDRIVER next; // Pointer to next HMDIDRIVER in use
+ HMIDIOUT hMidiOut; // MIDI output driver
+#endif
+
+#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)
+
+ struct midihdr_tag *mhdr; // SysEx header
+
+ HMDIDRIVER next; // Pointer to next HMDIDRIVER in use
+
+ HMIDIOUT hMidiOut; // MIDI output driver
+
+#else
+
+ #if defined(IS_MAC)
+ struct MIDIHDR *mhdr; // SysEx header
+ HMDIDRIVER next; // Pointer to next HMDIDRIVER in use
+ HMIDIOUT hMidiOut; // MIDI output driver
+ #endif
+
+#endif
+
+} MDI_DRIVER;
+
+#if defined(IS_WIN32API) || defined(IS_WII)
+ #pragma pack(push, 1)
+#endif
+
+typedef MSS_STRUCT // XMIDI TIMB IFF chunk
+ {
+ S8 name[4];
+
+ U8 msb;
+ U8 lsb;
+ U8 lsb2;
+ U8 lsb3;
+
+ U16 n_entries;
+
+ U16 timbre[1];
+ }
+TIMB_chunk;
+
+typedef MSS_STRUCT // XMIDI RBRN IFF entry
+ {
+ S16 bnum;
+ U32 offset;
+ }
+RBRN_entry;
+
+#if defined(IS_WIN32API) || defined(IS_WII)
+ #pragma pack(pop)
+#endif
+
+typedef struct // Wave library entry
+{
+ S32 bank; // XMIDI bank, MIDI patch for sample
+ S32 patch;
+
+ S32 root_key; // Root MIDI note # for sample (or -1)
+
+ U32 file_offset; // Offset of wave data from start-of-file
+ U32 size; // Size of wave sample in bytes
+
+ S32 format; // DIG_F format (8/16 bits, mono/stereo)
+ S32 playback_rate; // Playback rate in hertz
+}
+WAVE_ENTRY;
+
+typedef struct // Virtual "wave synthesizer" descriptor
+{
+ HMDIDRIVER mdi; // MIDI driver for use with synthesizer
+ HDIGDRIVER dig; // Digital driver for use with synthesizer
+
+ WAVE_ENTRY *library; // Pointer to wave library
+
+ AILEVENTCB prev_event_fn; // Previous MIDI event trap function
+ AILTIMBRECB prev_timb_fn; // Previous timbre request trap function
+
+ CTRL_LOG controls; // MIDI controller states
+
+ WAVE_ENTRY *wave [NUM_CHANS];// Pointer to WAVE_ENTRY for each channel
+
+ HSAMPLE S [MAX_W_VOICES]; // List of HSAMPLE voices
+ S32 n_voices; // Actual # of voices allocated to synth
+
+ S32 chan [MAX_W_VOICES]; // MIDI channel for each voice, or -1
+ S32 note [MAX_W_VOICES]; // MIDI note number for voice
+ S32 root [MAX_W_VOICES]; // MIDI root note for voice
+ S32 rate [MAX_W_VOICES]; // Playback rate for voice
+ S32 vel [MAX_W_VOICES]; // MIDI note velocity for voice
+ U32 time [MAX_W_VOICES]; // Timestamp for voice
+
+ U32 event; // Event counter for LRU timestamps
+}
+WAVE_SYNTH;
+
+typedef WAVE_SYNTH * HWAVESYNTH;// Handle to virtual wave synthesizer
+
+
+//
+// DIG_DRIVER list
+//
+
+extern HDIGDRIVER DIG_first;
+
+//
+// MDI_DRIVER list
+//
+
+extern HMDIDRIVER MDI_first;
+
+//
+// Miscellaneous system services
+//
+
+#define FILE_READ_WITH_SIZE ((void*)(SINTa)-1)
+
+
+typedef void * (AILCALLBACK *AILMEMALLOCCB)(UINTa size);
+typedef void (AILCALLBACK *AILMEMFREECB)(void *);
+
+#define AIL_mem_alloc_lock_trk(size) AIL_mem_alloc_lock_info( size, __FILE__, __LINE__ )
+#define AIL_file_read_trk(file,dest) AIL_file_read_info( file, dest, __FILE__, __LINE__ )
+#define AIL_file_size_trk(file) AIL_file_size_info( file, __FILE__, __LINE__ )
+
+//#define MSS_NONTRACKED
+#ifdef MSS_NONTRACKED
+ DXDEC void * AILCALL AIL_mem_alloc_lock(UINTa size);
+ DXDEC void * AILCALL AIL_file_read(char const * filename, void * dest );
+ DXDEC S32 AILCALL AIL_file_size(char const * filename );
+#else
+ #define AIL_mem_alloc_lock(size) AIL_mem_alloc_lock_trk(size)
+ #define AIL_file_read(file,dest) AIL_file_read_trk(file,dest)
+ #define AIL_file_size(file) AIL_file_size_trk(file)
+#endif
+
+DXDEC void * AILCALL AIL_mem_alloc_lock_info(UINTa size, char const * file, U32 line);
+DXDEC void AILCALL AIL_mem_free_lock (void *ptr);
+
+
+DXDEC S32 AILCALL AIL_file_error (void);
+
+DXDEC S32 AILCALL AIL_file_size_info(char const *filename,
+ char const * caller,
+ U32 line);
+
+DXDEC void * AILCALL AIL_file_read_info(char const *filename,
+ void *dest,
+ char const * caller,
+ U32 line);
+
+DXDEC S32 AILCALL AIL_file_write (char const *filename,
+ void const *buf,
+ U32 len);
+
+DXDEC S32 AILCALL AIL_WAV_file_write
+ (char const *filename,
+ void const *buf,
+ U32 len,
+ S32 rate,
+ S32 format);
+
+DXDEC S32 AILCALL AIL_file_append (char const *filename,
+ void const *buf, U32 len);
+
+DXDEC AILMEMALLOCCB AILCALL AIL_mem_use_malloc(AILMEMALLOCCB fn);
+DXDEC AILMEMFREECB AILCALL AIL_mem_use_free (AILMEMFREECB fn);
+
+
+#define MSSBreakPoint RR_BREAK
+
+
+//
+// Compiler-independent CRTL helper functions for PS2
+// Exported here for use in demo programs as well as MSS itself
+//
+
+#if defined(IS_PSP)
+
+ DXDEC F32 AILCALL AIL_sin(F32 x);
+ DXDEC F32 AILCALL AIL_cos(F32 x);
+ DXDEC F32 AILCALL AIL_tan( F32 x );
+ DXDEC F32 AILCALL AIL_acos(F32 x);
+ DXDEC F32 AILCALL AIL_atan(F32 x);
+ DXDEC F32 AILCALL AIL_ceil( F32 x );
+ DXDEC F32 AILCALL AIL_floor( F32 x );
+ DXDEC F32 AILCALL AIL_fsqrt( F32 x );
+ DXDEC F32 AILCALL AIL_fabs ( F32 x );
+ DXDEC F32 AILCALL AIL_log10( F32 x );
+ DXDEC F32 AILCALL AIL_log( F32 x );
+ DXDEC F32 AILCALL AIL_pow( F32 x, F32 p );
+ DXDEC F32 AILCALL AIL_frexpf( F32 x, S32 *pw2 );
+ DXDEC F32 AILCALL AIL_ldexpf( F32 x, S32 pw2 );
+ #define AIL_exp(x) AIL_pow(2.718281828F,(x))
+
+#else
+
+ #ifdef IS_WATCOM
+ #define AIL_pow powf
+ #define AIL_tan tanf
+ #else
+ #define AIL_tan tan
+ #define AIL_pow pow
+ #endif
+
+ #define AIL_sin sin
+ #define AIL_cos cos
+ #define AIL_acos acos
+ #define AIL_atan atan
+ #define AIL_ceil ceil
+ #define AIL_floor floor
+
+ #if defined(IS_PS3) && !defined(IS_SPU)
+ DXDEC F32 AILCALL AIL_fsqrt( F32 val );
+ #else
+ #define AIL_fsqrt(arg) ((F32) sqrt(arg))
+ #endif
+
+ #define AIL_fabs fabs
+ #define AIL_log10 log10
+ #define AIL_log log
+ #define AIL_frexpf(a1,a2) ((F32) frexp(a1,a2))
+ #define AIL_ldexpf(a1,a2) ((F32) ldexp(a1,a2))
+ #define AIL_exp exp
+
+#endif
+
+//
+// High-level support services
+//
+
+DXDEC S32 AILCALL AIL_startup (void);
+
+DXDEC SINTa AILCALL AIL_get_preference (U32 number);
+
+DXDEC void AILCALL AIL_shutdown (void);
+
+DXDEC SINTa AILCALL AIL_set_preference (U32 number,
+ SINTa value);
+
+DXDEC char *AILCALL AIL_last_error (void);
+
+DXDEC void AILCALL AIL_set_error (char const * error_msg);
+
+#ifdef IS_WIIU
+DXDEC void AILCALL AIL_set_wiiu_file_client (void* ptr_to_fsclient, void* ptr_to_fscmdblock);
+#endif
+
+#ifdef __RADIPHONE__
+//
+// On iOS, audio session interruptions stop the audio queues, and we have to manually restart them.
+//
+// This should be called whenever you get an Interruption Ended msg via your Audio Session callback.
+//
+DXDEC void AILCALL AIL_ios_post_audio_session_interrupt_end(HDIGDRIVER dig);
+#endif
+
+//
+// Low-level support services
+//
+
+#ifdef IS_X86
+
+DXDEC U32 AILCALL AIL_MMX_available (void);
+
+#endif
+
+#define AIL_lock AIL_lock_mutex
+#define AIL_unlock AIL_unlock_mutex
+
+DXDEC void AILCALL AIL_lock_mutex (void);
+DXDEC void AILCALL AIL_unlock_mutex (void);
+
+#define AIL_delay AIL_sleep
+DXDEC void AILCALL AIL_sleep (U32 ms);
+
+DXDEC AILTRACECB AILCALL AIL_configure_logging (char const * filename,
+ AILTRACECB cb,
+ S32 level);
+
+
+//
+// Process services
+//
+
+DXDEC HTIMER AILCALL AIL_register_timer (AILTIMERCB fn);
+
+DXDEC UINTa AILCALL AIL_set_timer_user (HTIMER timer,
+ UINTa user);
+
+DXDEC void AILCALL AIL_set_timer_period (HTIMER timer,
+ U32 microseconds);
+
+DXDEC void AILCALL AIL_set_timer_frequency (HTIMER timer,
+ U32 hertz);
+
+DXDEC void AILCALL AIL_set_timer_divisor (HTIMER timer,
+ U32 PIT_divisor);
+
+DXDEC void AILCALL AIL_start_timer (HTIMER timer);
+DXDEC void AILCALL AIL_start_all_timers (void);
+
+DXDEC void AILCALL AIL_stop_timer (HTIMER timer);
+DXDEC void AILCALL AIL_stop_all_timers (void);
+
+DXDEC void AILCALL AIL_release_timer_handle (HTIMER timer);
+DXDEC void AILCALL AIL_release_all_timers (void);
+
+DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle);
+
+#ifdef IS_MAC
+ #if defined(__PROCESSES__)
+ DXDEC ProcessSerialNumber AIL_Process(void);
+ #endif
+#endif
+
+//
+// high-level digital services
+//
+
+#define AIL_OPEN_DIGITAL_FORCE_PREFERENCE 1
+#define AIL_OPEN_DIGITAL_NEED_HW_3D 2
+#define AIL_OPEN_DIGITAL_NEED_FULL_3D 4
+#define AIL_OPEN_DIGITAL_NEED_LIGHT_3D 8
+#define AIL_OPEN_DIGITAL_NEED_HW_REVERB 16
+#define AIL_OPEN_DIGITAL_NEED_REVERB 32
+#define AIL_OPEN_DIGITAL_USE_IOP_CORE0 64
+
+#define AIL_OPEN_DIGITAL_USE_SPU0 (1<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU1 (2<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU2 (3<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU3 (4<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU4 (5<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU5 (6<<24)
+#define AIL_OPEN_DIGITAL_USE_SPU6 (7<<24)
+
+#define AIL_OPEN_DIGITAL_USE_SPU( num ) ( ( num + 1 ) << 24 )
+
+#ifdef IS_GENERICDIG
+
+ struct _RadSoundSystem;
+ typedef S32 (*RADSS_OPEN_FUNC)(struct _RadSoundSystem* i_SoundSystem, U32 i_MinBufferSizeInMs, U32 i_Frequency, U32 i_ChannelCount, U32 i_MaxLockSize, U32 i_Flags);
+
+ DXDEC HDIGDRIVER AILCALL AIL_open_generic_digital_driver(U32 frequency, S32 bits, S32 channel, U32 flags, RADSS_OPEN_FUNC dig_open);
+
+ #ifdef IS_WIN32
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_DSInstallDriver(UINTa, UINTa);
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_WOInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_DSInstallDriver(0, 0))
+
+ #elif defined(IS_3DS)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_3DSInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_3DSInstallDriver(0, 0))
+
+ #elif defined(__RADANDROID__)
+
+ DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager);
+
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0))
+
+
+ #elif defined(IS_PSP2)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSP2InstallDriver(0, 0))
+
+ #elif defined(__RADSEKRIT2__)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SonyInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SonyInstallDriver(0, 0))
+
+ #elif defined(IS_PSP)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSPInstallDriver(UINTa, UINTa);
+
+ #define AIL_OPEN_DIGITAL_USE_SIMPLEAUDIO ~0U
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSPInstallDriver(0, 0))
+
+ #elif defined(IS_XENON) || defined(__RADWINRTAPI__)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_XAudio2InstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_XAudio2InstallDriver(0, 0))
+
+ #elif defined(IS_WIIU)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_AXInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_AXInstallDriver(0, 0))
+
+ #elif defined(IS_MAC) || defined(IS_IPHONE)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa);
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_CAInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_CAInstallDriver(0, 0))
+
+ #elif defined(IS_LINUX)
+ DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa);
+
+ #define AIL_open_digital_driver(frequency, bits, channel, flags) \
+ AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_OalInstallDriver(0, 0))
+ #endif
+#else // IS_GENERICDIG
+
+DXDEC HDIGDRIVER AILCALL AIL_open_digital_driver( U32 frequency,
+ S32 bits,
+ S32 channel,
+ U32 flags );
+
+#endif // not IS_GENERICDIG
+
+DXDEC void AILCALL AIL_close_digital_driver( HDIGDRIVER dig );
+
+#ifdef IS_LINUX
+
+#define AIL_MSS_version(str,len) \
+{ \
+ strncpy(str, MSS_VERSION, len); \
+}
+
+DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr);
+
+DXDEC S32 AILCALL AIL_digital_handle_reacquire
+ (HDIGDRIVER drvr);
+#elif defined( IS_WINDOWS )
+
+#define AIL_MSS_version(str,len) \
+{ \
+ HINSTANCE l=LoadLibrary(MSSDLLNAME); \
+ if ((UINTa)l<=32) \
+ *(str)=0; \
+ else { \
+ LoadString(l,1,str,len); \
+ FreeLibrary(l); \
+ } \
+}
+
+DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr);
+
+DXDEC S32 AILCALL AIL_digital_handle_reacquire
+ (HDIGDRIVER drvr);
+
+#elif defined( IS_MAC )
+
+#if defined(__RESOURCES__)
+
+ typedef MSS_STRUCT MSS_VersionType_
+ {
+ Str255 version_name;
+ } MSS_VersionType;
+
+ #define AIL_MSS_version(str,len) \
+ { \
+ long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \
+ if (_res==-1) \
+ { \
+ str[0]=0; \
+ } \
+ else \
+ { \
+ Handle _H; \
+ short _Err; \
+ long _cur= CurResFile(); \
+ UseResFile(_res); \
+ _H = GetResource('vers', 2); \
+ _Err = ResError(); \
+ if((_Err != noErr) || (_H==0)) \
+ { \
+ str[0]=0; \
+ UseResFile(_cur); \
+ CloseResFile(_res); \
+ } \
+ else \
+ { \
+ if (GetHandleSize(_H)==0) \
+ { \
+ str[0]=0; \
+ UseResFile(_cur); \
+ CloseResFile(_res); \
+ } \
+ else \
+ { \
+ MSS_VersionType * _vt = (MSS_VersionType*)*_H; \
+ if ((U32)_vt->version_name[6]>4) \
+ _vt->version_name[6]-=4; \
+ else \
+ _vt->version_name[6]=0; \
+ if (((U32)len) <= ((U32)_vt->version_name[6])) \
+ _vt->version_name[6] = (U8)len-1; \
+ memcpy( str, _vt->version_name+11, _vt->version_name[6] ); \
+ str[_vt->version_name[6]]=0; \
+ UseResFile(_cur); \
+ CloseResFile(_res); \
+ } \
+ ReleaseResource(_H); \
+ } \
+ } \
+ }
+
+ #endif
+
+ DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr);
+
+ DXDEC S32 AILCALL AIL_digital_handle_reacquire
+ (HDIGDRIVER drvr);
+
+#endif
+
+DXDEC void AILCALL AIL_debug_log (char const * ifmt, ...);
+
+DXDEC S32 AILCALL AIL_sprintf(char *dest,
+ char const *fmt, ...);
+
+DXDEC char* AILCALL AIL_set_redist_directory(char const*dir);
+
+DXDEC S32 AILCALL AIL_background_CPU_percent (void);
+
+DXDEC S32 AILCALL AIL_digital_CPU_percent (HDIGDRIVER dig);
+
+#ifdef HOST_SPU_PROCESS
+DXDEC S32 AILCALL AIL_digital_SPU_percent (HDIGDRIVER dig);
+#endif
+
+DXDEC S32 AILCALL AIL_digital_latency (HDIGDRIVER dig);
+
+DXDEC HSAMPLE AILCALL AIL_allocate_sample_handle
+ (HDIGDRIVER dig);
+
+
+EXPGROUP(Digital Audio Services)
+
+#define MILES_PUSH_REVERB 1
+#define MILES_PUSH_VOLUME 2
+#define MILES_PUSH_3D 4
+#define MILES_PUSH_RESET 8
+
+DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 crossfade_ms);
+/*
+ Pushes the current system state, allowing for a temporary "clean" driver to use, and then
+ revert from.
+
+ $:dig The driver to push
+ $:flags Logical "or" of options controlling the extent of the push. See discussion.
+ $:crossfade_ms The number of milliseconds to fade the transition over. [0, 32767]
+
+ By default (ie flags == 0), effectively nothing happens. Since the operation neither affects
+ any subsystems nor resets the playing samples, a push immediately followed by a pop should
+ have no audible effects.
+
+ However, any samples started during the push will be stopped (via $AIL_end_fade_sample) when the system is popped.
+ Streams will return SMP_DONE via $AIL_stream_status. It is up to the client code to perform any cleanup required.
+
+ The flags can alter the above behavior in the following ways:
+
+ $* <b>MILES_PUSH_RESET</b> - This flag causes the system to revert to a "new" state when pushed. Without any
+ other flags this will only be apparent with samples - any playing samples will cease to be processed
+ (though they will still report SMP_PLAYING). When the system is popped, these samples will resume.
+
+ $* <b>MILES_PUSH_REVERB</b> - When present, reverb state will be affected in addition to sample state.
+ If MILES_PUSH_RESET is present, the reverb will be cleared to zero on push. Otherwise, it will be retained,
+ and only affected when popped.
+
+ $* <b>MILES_PUSH_3D</b> - When present, 3d listener state will be affected in addition to sample state.
+ If MILES_PUSH_RESET is present, the 3d listener state will be reverted to the same state as a new driver. Otherwise
+ it will be retained and only affected when popped.
+
+ $* <b>MILES_PUSH_VOLUME</b> - When present, master volume will be affected in addition to sample state.
+ If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only
+ affected when popped.
+
+ $-
+
+ If you want more control over whether a sample will be affected by a push or a pop operation,
+ see $AIL_set_sample_level_mask.
+
+*/
+
+DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms);
+/*
+ Pops the current system state and returns the system to the way it
+ was before the last push.
+
+ $:dig The driver to pop.
+ $:crossfade_ms The number of milliseconds to crossfade the transition over - [0, 32767]
+
+ See $AIL_push_system_state for documentation.
+*/
+
+DXDEC EXPAPI U8 AILCALL AIL_system_state_level(HDIGDRIVER dig);
+/*
+ Returns the current level the system has been pushed to.
+
+ $:dig The driver to inspect
+ $:return A value between 0 and MILES_MAX_STATES, representing the depth of the current system stack.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask);
+/*
+ Sets the system levels at which a sample will play.
+
+ $:S The sample to set the mask for.
+ $:mask The bitmask of levels for which the sample will play.
+
+ Under normal push/pop operations, a sample's mask is set when it is
+ started to the level the system is at. If the system is pushed
+ without a reset, then the mask is adjusted to include the new level.
+ When a system is popped, if the sample is going to continue playing,
+ the state mask is adjusted to remove the level the system is popping
+ <i>from</i>.
+
+ If you have a sample playing on a higher system level that needs
+ to continue after a pop, you can adjust the sample's mask by using
+ this function in conjunction with $AIL_system_state_level and
+ $AIL_sample_level_mask:
+
+ ${
+ AIL_set_sample_level_mask(S, AIL_sample_level_mask(S) |= (1 << (AIL_system_state_level(dig) - 1)));
+ $}
+*/
+
+DXDEC EXPAPI U8 AILCALL AIL_sample_level_mask(HSAMPLE S);
+/*
+ Return the mask used to determine if the sample will play at a given system level.
+
+ $:S The sample to inspect.
+ $:return The level mask for the sample.
+
+ See $AIL_set_sample_level_mask.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_digital_mixed_samples(HDIGDRIVER dig);
+/*
+ Returns the number of samples that have been mixed in to the hardware.
+
+ Used for timing samples for start via $AIL_schedule_start_sample.
+*/
+
+#define AIL_digital_samples_per_second(dig) (dig->DMA_rate)
+
+
+DXDEC EXPAPI void AILCALL AIL_enable_limiter(HDIGDRIVER dig, S32 on_off);
+/*
+ Enables a basic limiter to prevent clipping.
+
+ $:dig The driver to enable the limiter on.
+ $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled.
+
+ By default limiters are off. Currently they are not configurable. They kick on around
+ -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to
+ the 16 bit clamp.
+
+ See also $AIL_bus_enable_limiter.
+*/
+
+EXPGROUP(bus_section)
+
+DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig);
+/*
+ Allocates a bus to mix samples to.
+
+ $:dig The HDIGDRIVER to allocate the bus on.
+ $:return The HSAMPLE for the new bus.
+
+ A bus allows you to treat a group of samples as one sample. With the bus sample you can
+ do almost all of the things you can do with a normal sample handle. The only exception
+ is you can't adjust the playback rate of the sample.
+
+ Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus.
+
+ Each call to AIL_allocate_bus adds a new bus, up to a total bus count of MAX_BUSSES. After
+ the first call, two busses exist - the main bus and the first aux bus. The HSAMPLE returned
+ is for the first aux bus (index 1)
+*/
+
+DXDEC EXPAPI void AILCALL AIL_bus_enable_limiter(HDIGDRIVER dig, S32 bus_index, S32 on_off);
+/*
+ Enables a basic limiter to prevent clipping.
+
+ $:dig The driver containing the bus to enable the limiter on.
+ $:bus_index The index of the bus to enable the limiter on.
+ $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled.
+
+ By default limiters are off. Currently they are not configurable. They kick on around
+ -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to
+ the 16 bit clamp.
+
+ See also $AIL_enable_limiter.
+*/
+
+DXDEC EXPAPI HSAMPLE AILCALL AIL_bus_sample_handle(HDIGDRIVER dig, S32 bus_index);
+/*
+ Returns the HSAMPLE associated with a bus.
+
+ $:dig The HDIGDRIVER the bus resides within.
+ $:bus_index The index of the bus to return the HSAMPLE for.
+ $:return The HSAMPLE for the bus index.
+
+ If the bus has not been allocated, or no busses have been allocated, this returns 0. This
+ means that for the "Main Bus" - index 0 - it will still return zero if no additional busses
+ have been allocated.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_bus(HSAMPLE S, S32 bus_index);
+/*
+ Assigns an HSAMPLE to a bus.
+
+ $:S The HSAMPLE to assign.
+ $:bus_index The bus index to assign the sample to.
+
+ If the given bus has not been allocated, this function has no effect.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S);
+/*
+ Returns the bus an HSAMPLE is assigned to.
+
+ $:S The HSAMPLE to check.
+ $:return The index of the bus the sample is assigned.
+
+ All samples by default are assigned to bus 0.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index);
+/*
+ Installs the Compressor filter on to a bus, using another bus as the input for
+ compression/limiting.
+
+ $:dig The driver the busses exist on.
+ $:bus_index The index of the bus the compressor will affect.
+ $:filter_stage The SAMPLESTAGE the compressor will use on the bus HSAMPLE.
+ $:input_bus_index The bus index the compressor will use as <b>input</b>.
+
+ This installs a side chain compressor in to a given bus. It acts exactly like
+ any other filter you would put on an HSAMPLE, except the input_bus_index bus pipe's
+ its signal strength to the filter, allowing it to attenuate the bus_index bus based
+ on another bus's contents.
+
+ To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and
+ use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties
+ are documented under $(Compressor Filter)
+*/
+
+DXDEC void AILCALL AIL_set_speaker_configuration
+ (HDIGDRIVER dig,
+ MSSVECTOR3D *array,
+ S32 n_channels,
+ F32 falloff_power);
+
+DXDEC MSSVECTOR3D *
+ AILCALL AIL_speaker_configuration
+ (HDIGDRIVER dig,
+ S32 *n_physical_channels,
+ S32 *n_logical_channels,
+ F32 *falloff_power,
+ MSS_MC_SPEC *channel_spec);
+
+DXDEC void AILCALL AIL_set_listener_relative_receiver_array
+ (HDIGDRIVER dig,
+ MSS_RECEIVER_LIST *array,
+ S32 n_receivers);
+
+DXDEC MSS_RECEIVER_LIST *
+ AILCALL AIL_listener_relative_receiver_array
+ (HDIGDRIVER dig,
+ S32 *n_receivers);
+DXDEC void AILCALL AIL_set_speaker_reverb_levels
+ (HDIGDRIVER dig,
+ F32 *wet_array,
+ F32 *dry_array,
+ MSS_SPEAKER const *speaker_index_array,
+ S32 n_levels);
+
+DXDEC S32 AILCALL AIL_speaker_reverb_levels (HDIGDRIVER dig,
+ F32 * *wet_array,
+ F32 * *dry_array,
+ MSS_SPEAKER const * *speaker_index_array);
+
+
+DXDEC
+void AILCALL AIL_set_sample_speaker_scale_factors (HSAMPLE S, //)
+ MSS_SPEAKER const * dest_speaker_indexes,
+ F32 const * levels,
+ S32 n_levels );
+DXDEC
+void AILCALL AIL_sample_speaker_scale_factors (HSAMPLE S, //)
+ MSS_SPEAKER const * dest_speaker_indexes,
+ F32 * levels,
+ S32 n_levels );
+
+DXDEC
+S32 AILEXPORT AIL_set_sample_is_3D (HSAMPLE S, //)
+ S32 onoff);
+
+//DXDEC F32 AILEXPORT AIL_calculate_sample_final_attenuation(HSAMPLE S);
+/*
+ Returns the attenuation that a sample will have.
+
+ $:S Sample to compute.
+*/
+
+DXDEC
+S32 AILEXPORT AIL_calculate_3D_channel_levels (HDIGDRIVER dig, //)
+ F32 *channel_levels,
+ MSS_SPEAKER const * *speaker_array,
+ MSSVECTOR3D *src_pos,
+ MSSVECTOR3D *src_face,
+ MSSVECTOR3D *src_up,
+ F32 src_inner_angle,
+ F32 src_outer_angle,
+ F32 src_outer_volume,
+ F32 src_max_dist,
+ F32 src_min_dist,
+ MSSVECTOR3D *listen_pos,
+ MSSVECTOR3D *listen_face,
+ MSSVECTOR3D *listen_up,
+ F32 rolloff_factor,
+ MSSVECTOR3D *doppler_velocity,
+ F32 *doppler_shift);
+
+
+DXDEC void AILCALL AIL_release_sample_handle (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_init_sample (HSAMPLE S,
+ S32 format);
+
+DXDEC S32 AILCALL AIL_set_sample_file (HSAMPLE S,
+ void const *file_image,
+ S32 block);
+
+DXDEC S32 AILCALL AIL_set_sample_info (HSAMPLE S,
+ AILSOUNDINFO const * info);
+
+DXDEC S32 AILCALL AIL_set_named_sample_file (HSAMPLE S,
+ C8 const *file_type_suffix,
+ void const *file_image,
+ U32 file_size,
+ S32 block);
+
+DXDEC HPROVIDER AILCALL AIL_set_sample_processor (HSAMPLE S,
+ SAMPLESTAGE pipeline_stage,
+ HPROVIDER provider);
+
+DXDEC HPROVIDER AILCALL AIL_set_digital_driver_processor
+ (HDIGDRIVER dig,
+ DIGDRVSTAGE pipeline_stage,
+ HPROVIDER provider);
+
+DXDEC HPROVIDER AILCALL AIL_sample_processor (HSAMPLE S,
+ SAMPLESTAGE pipeline_stage);
+
+DXDEC HPROVIDER AILCALL AIL_digital_driver_processor
+ (HDIGDRIVER dig,
+ DIGDRVSTAGE pipeline_stage);
+
+DXDEC void AILCALL AIL_set_sample_adpcm_block_size
+ (HSAMPLE S,
+ U32 blocksize);
+
+DXDEC void AILCALL AIL_set_sample_address (HSAMPLE S,
+ void const *start,
+ U32 len);
+
+DXDEC void AILCALL AIL_start_sample (HSAMPLE S);
+
+EXPGROUP(Digital Audio Services)
+
+DXDEC EXPAPI void AILCALL AIL_schedule_start_sample(HSAMPLE S, U64 mix_time_to_start);
+/*
+ Marks the specified sample to begin at the exact time specified.
+
+ $:S The sample to start
+ $:mix_time_to_start The time to start the sample, in samples.
+
+ Once set, the sample will have $AIL_start_sample called automatically
+ when the mixer reaches the specified time. The sample's delay will
+ be automatically adjusted such that the sample starts mid-block.
+
+ ${
+ // Get the current time.
+ U64 mix_time = AIL_digital_mixed_samples(dig);
+
+ // Schedule to start 1 second out
+ mix_time += AIL_digital_samples_per_second(dig);
+ AIL_schedule_start_sample(S, mix_time );
+ $}
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_sample_schedule_time(HSAMPLE S);
+/*
+ Returns the mix time the sample is scheduled to start at, or 0 if not scheduled.
+
+ $:S The sample to query.
+*/
+
+DXDEC void AILCALL AIL_stop_sample (HSAMPLE S);
+
+DXDEC void AILCALL AIL_end_fade_sample (HSAMPLE S);
+
+DXDEC void AILCALL AIL_resume_sample (HSAMPLE S);
+
+DXDEC void AILCALL AIL_end_sample (HSAMPLE S);
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_id(HSAMPLE S, S32 id);
+/*
+ Set an ID on a sample for use in synchronized control.
+
+ $:S The sample to alter
+ $:id The id to use.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_sample_id(HSAMPLE S);
+/*
+ Return the current ID for a sample.
+
+ $:S Sample to access
+*/
+
+DXDEC EXPAPI void AILCALL AIL_start_sample_group(HDIGDRIVER dig, S32 start_id, S32 set_to_id);
+/*
+ Start a group of samples at the same time.
+
+ $:dig The driver the samples are allocated from.
+ $:start_id The ID to start
+ $:set_to_id The ID to set the samples to once they have started.
+
+ This function atomically calls $AIL_start_sample on all the samples to ensure the samples start in sync.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_stop_sample_group(HDIGDRIVER dig, S32 stop_id, S32 set_to_id);
+/*
+ Stops a group of samples at the same time.
+
+ $:dig The driver the samples are allocated from.
+ $:stop_id The ID to stop
+ $:set_to_id The ID to set the samples to once they have stopped.
+
+ This function atomically calls $AIL_stop_sample on all the samples to ensure they stop at the same point.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_resume_sample_group(HDIGDRIVER dig, S32 resume_id, S32 set_to_id);
+/*
+ Resumes a group of samples at the same time.
+
+ $:dig The driver the samples are allocated from.
+ $:resume_id The ID to resume
+ $:set_to_id The ID to set the samples to once they have resumed.
+
+ This function atomically calls $AIL_resume_sample on all the samples to ensure the samples start in sync.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_end_sample_group(HDIGDRIVER dig, S32 end_id);
+/*
+ Ends a group of samples at the same time.
+
+ $:dig The driver the samples are allocated from.
+ $:end_id The ID to end
+
+ This function atomically calls $AIL_end_sample on all the samples.
+*/
+
+DXDEC void AILCALL AIL_set_sample_playback_rate
+ (HSAMPLE S,
+ S32 playback_rate);
+
+DXDEC void AILCALL AIL_set_sample_playback_rate_factor
+ (HSAMPLE S,
+ F32 playback_rate_factor);
+
+DXDEC void AILCALL AIL_set_sample_playback_delay
+ (HSAMPLE S,
+ S32 playback_delay);
+
+DXDEC void AILCALL AIL_set_sample_volume_pan (HSAMPLE S,
+ F32 volume,
+ F32 pan);
+
+DXDEC void AILCALL AIL_set_sample_volume_levels(HSAMPLE S,
+ F32 left_level,
+ F32 right_level);
+
+DXDEC void AILCALL AIL_set_sample_channel_levels (HSAMPLE S,
+ MSS_SPEAKER const *source_speaker_indexes,
+ MSS_SPEAKER const *dest_speaker_indexes,
+ F32 const *levels,
+ S32 n_levels);
+
+DXDEC void AILCALL AIL_set_sample_reverb_levels(HSAMPLE S,
+ F32 dry_level,
+ F32 wet_level);
+
+DXDEC void AILCALL AIL_set_sample_low_pass_cut_off(HSAMPLE S,
+ S32 /*-1 or MSS_SPEAKER*/ channel,
+ F32 cut_off);
+
+DXDEC void AILCALL AIL_set_sample_loop_count (HSAMPLE S,
+ S32 loop_count);
+
+DXDEC void AILCALL AIL_set_sample_loop_block (HSAMPLE S,
+ S32 loop_start_offset,
+ S32 loop_end_offset);
+
+DXDEC EXPAPI S32 AILCALL AIL_set_sample_loop_samples(HSAMPLE S, S32 loop_start_samples, S32 loop_end_samples);
+/*
+ Defines the loop points on a sample in samples rather than bytes.
+
+ $:S The sample to alter.
+ $:loop_start_samples The sample count in to the file to start the looping.
+ $:loop_end_samples The sample count in the file to end the looping.
+ $:return 1 if successful, 0 otherwise. Check $AIL_last_error for details.
+
+ For uncompressed samples, this largely reverts to $AIL_set_sample_loop_block, since the mapping
+ is straightforward. For compressed formats (like bink audio or mp3), looping in sample space is
+ non trivial and must be handled on a format-by-format basis. For the moment, only Bink Audio
+ supports this functionality - all other ASI formats will return failure.
+
+ If a loop's length is too short, it may be extended.
+*/
+
+
+DXDEC S32 AILCALL AIL_sample_loop_block (HSAMPLE S,
+ S32 *loop_start_offset,
+ S32 *loop_end_offset);
+
+DXDEC U32 AILCALL AIL_sample_status (HSAMPLE S);
+
+DXDEC U32 AILCALL AIL_sample_mixed_ms (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_sample_playback_rate (HSAMPLE S);
+
+DXDEC F32 AILCALL AIL_sample_playback_rate_factor (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_sample_playback_delay (HSAMPLE S);
+
+DXDEC void AILCALL AIL_sample_volume_pan (HSAMPLE S, F32* volume, F32* pan);
+
+DXDEC S32 AILCALL AIL_sample_channel_count (HSAMPLE S, U32 *mask);
+
+DXDEC void AILCALL AIL_sample_channel_levels (HSAMPLE S,
+ MSS_SPEAKER const *source_speaker_indexes,
+ MSS_SPEAKER const *dest_speaker_indexes,
+ F32 *levels,
+ S32 n_levels);
+
+DXDEC void AILCALL AIL_sample_volume_levels (HSAMPLE S,
+ F32 *left_level,
+ F32 *right_level);
+
+DXDEC void AILCALL AIL_sample_reverb_levels (HSAMPLE S,
+ F32 *dry_level,
+ F32 *wet_level);
+
+DXDEC F32 AILCALL AIL_sample_output_levels (HSAMPLE S,
+ MSS_SPEAKER const *source_speaker_indexes,
+ MSS_SPEAKER const *dest_speaker_indexes,
+ F32 *levels,
+ S32 n_levels);
+
+DXDEC F32 AILCALL AIL_sample_low_pass_cut_off(HSAMPLE S, S32 /*-1 or MSS_SPEAKER*/ channel);
+
+DXDEC S32 AILCALL AIL_sample_loop_count (HSAMPLE S);
+
+DXDEC void AILCALL AIL_set_digital_master_volume_level
+ (HDIGDRIVER dig,
+ F32 master_volume);
+
+DXDEC F32 AILCALL AIL_digital_master_volume_level (HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_set_sample_51_volume_pan( HSAMPLE S,
+ F32 volume,
+ F32 pan,
+ F32 fb_pan,
+ F32 center_level,
+ F32 sub_level );
+
+DXDEC void AILCALL AIL_sample_51_volume_pan ( HSAMPLE S,
+ F32* volume,
+ F32* pan,
+ F32* fb_pan,
+ F32* center_level,
+ F32* sub_level );
+
+DXDEC void AILCALL AIL_set_sample_51_volume_levels( HSAMPLE S,
+ F32 f_left_level,
+ F32 f_right_level,
+ F32 b_left_level,
+ F32 b_right_level,
+ F32 center_level,
+ F32 sub_level );
+
+DXDEC void AILCALL AIL_sample_51_volume_levels ( HSAMPLE S,
+ F32* f_left_level,
+ F32* f_right_level,
+ F32* b_left_level,
+ F32* b_right_level,
+ F32* center_level,
+ F32* sub_level );
+DXDEC void AILCALL AIL_set_digital_master_reverb
+ (HDIGDRIVER dig,
+ S32 bus_index,
+ F32 reverb_decay_time,
+ F32 reverb_predelay,
+ F32 reverb_damping);
+
+DXDEC void AILCALL AIL_digital_master_reverb
+ (HDIGDRIVER dig,
+ S32 bus_index,
+ F32* reverb_time,
+ F32* reverb_predelay,
+ F32* reverb_damping);
+
+DXDEC void AILCALL AIL_set_digital_master_reverb_levels
+ (HDIGDRIVER dig,
+ S32 bus_index,
+ F32 dry_level,
+ F32 wet_level);
+
+DXDEC void AILCALL AIL_digital_master_reverb_levels
+ (HDIGDRIVER dig,
+ S32 bus_index,
+ F32 * dry_level,
+ F32 * wet_level);
+
+
+//
+// low-level digital services
+//
+
+DXDEC S32 AILCALL AIL_minimum_sample_buffer_size(HDIGDRIVER dig,
+ S32 playback_rate,
+ S32 format);
+
+DXDEC S32 AILCALL AIL_set_sample_buffer_count (HSAMPLE S,
+ S32 n_buffers);
+
+DXDEC S32 AILCALL AIL_sample_loaded_len (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_sample_buffer_count (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_sample_buffer_available (HSAMPLE S);
+
+DXDEC S32 AILCALL AIL_load_sample_buffer (HSAMPLE S,
+ S32 buff_num,
+ void const *buffer,
+ U32 len);
+
+DXDEC void AILCALL AIL_request_EOB_ASI_reset (HSAMPLE S,
+ U32 buff_num,
+ S32 new_stream_position);
+
+DXDEC S32 AILCALL AIL_sample_buffer_info (HSAMPLE S, //)
+ S32 buff_num,
+ U32 *pos,
+ U32 *len,
+ S32 *head,
+ S32 *tail);
+
+DXDEC U32 AILCALL AIL_sample_granularity (HSAMPLE S);
+
+DXDEC void AILCALL AIL_set_sample_position (HSAMPLE S,
+ U32 pos);
+
+DXDEC U32 AILCALL AIL_sample_position (HSAMPLE S);
+
+DXDEC AILSAMPLECB AILCALL AIL_register_SOB_callback
+ (HSAMPLE S,
+ AILSAMPLECB SOB);
+
+DXDEC AILSAMPLECB AILCALL AIL_register_EOB_callback
+ (HSAMPLE S,
+ AILSAMPLECB EOB);
+
+DXDEC AILSAMPLECB AILCALL AIL_register_EOS_callback
+ (HSAMPLE S,
+ AILSAMPLECB EOS);
+
+DXDEC AILMIXERCB AILCALL AIL_register_mix_callback(HDIGDRIVER dig, AILMIXERCB mixcb);
+
+DXDEC AILFALLOFFCB AILCALL AIL_register_falloff_function_callback
+ (HSAMPLE S,
+ AILFALLOFFCB falloff_cb);
+
+DXDEC void AILCALL AIL_set_sample_user_data (HSAMPLE S,
+ U32 index,
+ SINTa value);
+
+DXDEC SINTa AILCALL AIL_sample_user_data (HSAMPLE S,
+ U32 index);
+
+DXDEC S32 AILCALL AIL_active_sample_count (HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_digital_configuration (HDIGDRIVER dig,
+ S32 *rate,
+ S32 *format,
+ char *string);
+
+DXDEC S32 AILCALL AIL_platform_property (void *object,
+ MSS_PLATFORM_PROPERTY property,
+ void *before_value,
+ void const *new_value,
+ void *after_value);
+
+
+DXDEC void AILCALL AIL_set_sample_ms_position (HSAMPLE S, //)
+ S32 milliseconds);
+
+DXDEC U32 AILCALL AIL_sample_ms_lookup (HSAMPLE S, //)
+ S32 milliseconds,
+ S32* actualms);
+
+DXDEC void AILCALL AIL_sample_ms_position (HSAMPLE S, //)
+ S32 * total_milliseconds,
+ S32 * current_milliseconds);
+
+//
+// Digital input services
+//
+
+#if defined(IS_WINDOWS)
+ #define MSS_HAS_INPUT 1
+#elif defined(IS_MAC)
+ #define MSS_HAS_INPUT 1
+#else
+ #define MSS_HAS_INPUT 0
+#endif
+
+#if MSS_HAS_INPUT
+
+DXDEC HDIGINPUT AILCALL AIL_open_input (AIL_INPUT_INFO *info);
+
+DXDEC void AILCALL AIL_close_input (HDIGINPUT dig);
+
+DXDEC AIL_INPUT_INFO *
+ AILCALL AIL_get_input_info (HDIGINPUT dig);
+
+DXDEC S32 AILCALL AIL_set_input_state (HDIGINPUT dig,
+ S32 enable);
+#endif
+
+
+//
+// High-level XMIDI services
+//
+
+DXDEC HMDIDRIVER AILCALL AIL_open_XMIDI_driver( U32 flags );
+
+#define AIL_OPEN_XMIDI_NULL_DRIVER 1
+
+DXDEC void AILCALL AIL_close_XMIDI_driver( HMDIDRIVER mdi );
+
+#if defined(IS_MAC) || defined(IS_LINUX)
+
+DXDEC S32 AILCALL AIL_MIDI_handle_release
+ (HMDIDRIVER mdi);
+
+DXDEC S32 AILCALL AIL_MIDI_handle_reacquire
+ (HMDIDRIVER mdi);
+
+#elif defined( IS_WINDOWS )
+
+DXDEC S32 AILCALL AIL_midiOutOpen(HMDIDRIVER *drvr,
+ LPHMIDIOUT *lphMidiOut,
+ S32 dwDeviceID);
+
+DXDEC void AILCALL AIL_midiOutClose (HMDIDRIVER mdi);
+
+DXDEC S32 AILCALL AIL_MIDI_handle_release
+ (HMDIDRIVER mdi);
+
+DXDEC S32 AILCALL AIL_MIDI_handle_reacquire
+ (HMDIDRIVER mdi);
+
+#endif
+
+DXDEC HSEQUENCE AILCALL AIL_allocate_sequence_handle
+ (HMDIDRIVER mdi);
+
+DXDEC void AILCALL AIL_release_sequence_handle
+ (HSEQUENCE S);
+
+DXDEC S32 AILCALL AIL_init_sequence (HSEQUENCE S,
+ void const *start,
+ S32 sequence_num);
+
+DXDEC void AILCALL AIL_start_sequence (HSEQUENCE S);
+
+DXDEC void AILCALL AIL_stop_sequence (HSEQUENCE S);
+
+DXDEC void AILCALL AIL_resume_sequence (HSEQUENCE S);
+
+DXDEC void AILCALL AIL_end_sequence (HSEQUENCE S);
+
+DXDEC void AILCALL AIL_set_sequence_tempo (HSEQUENCE S,
+ S32 tempo,
+ S32 milliseconds);
+
+DXDEC void AILCALL AIL_set_sequence_volume (HSEQUENCE S,
+ S32 volume,
+ S32 milliseconds);
+
+DXDEC void AILCALL AIL_set_sequence_loop_count
+ (HSEQUENCE S,
+ S32 loop_count);
+
+DXDEC U32 AILCALL AIL_sequence_status (HSEQUENCE S);
+
+DXDEC S32 AILCALL AIL_sequence_tempo (HSEQUENCE S);
+
+DXDEC S32 AILCALL AIL_sequence_volume (HSEQUENCE S);
+
+DXDEC S32 AILCALL AIL_sequence_loop_count (HSEQUENCE S);
+
+DXDEC void AILCALL AIL_set_XMIDI_master_volume
+ (HMDIDRIVER mdi,
+ S32 master_volume);
+
+DXDEC S32 AILCALL AIL_XMIDI_master_volume (HMDIDRIVER mdi);
+
+
+//
+// Low-level XMIDI services
+//
+
+DXDEC S32 AILCALL AIL_active_sequence_count (HMDIDRIVER mdi);
+
+DXDEC S32 AILCALL AIL_controller_value (HSEQUENCE S,
+ S32 channel,
+ S32 controller_num);
+
+DXDEC S32 AILCALL AIL_channel_notes (HSEQUENCE S,
+ S32 channel);
+
+DXDEC void AILCALL AIL_sequence_position (HSEQUENCE S,
+ S32 *beat,
+ S32 *measure);
+
+DXDEC void AILCALL AIL_branch_index (HSEQUENCE S,
+ U32 marker);
+
+DXDEC AILPREFIXCB AILCALL AIL_register_prefix_callback
+ (HSEQUENCE S,
+ AILPREFIXCB callback);
+
+DXDEC AILTRIGGERCB AILCALL AIL_register_trigger_callback
+ (HSEQUENCE S,
+ AILTRIGGERCB callback);
+
+DXDEC AILSEQUENCECB AILCALL AIL_register_sequence_callback
+ (HSEQUENCE S,
+ AILSEQUENCECB callback);
+
+DXDEC AILBEATCB AILCALL AIL_register_beat_callback (HSEQUENCE S,
+ AILBEATCB callback);
+
+DXDEC AILEVENTCB AILCALL AIL_register_event_callback (HMDIDRIVER mdi,
+ AILEVENTCB callback);
+
+DXDEC AILTIMBRECB AILCALL AIL_register_timbre_callback
+ (HMDIDRIVER mdi,
+ AILTIMBRECB callback);
+
+DXDEC void AILCALL AIL_set_sequence_user_data (HSEQUENCE S,
+ U32 index,
+ SINTa value);
+
+DXDEC SINTa AILCALL AIL_sequence_user_data (HSEQUENCE S,
+ U32 index);
+
+DXDEC void AILCALL AIL_register_ICA_array (HSEQUENCE S,
+ U8 *array);
+
+DXDEC S32 AILCALL AIL_lock_channel (HMDIDRIVER mdi);
+
+DXDEC void AILCALL AIL_release_channel (HMDIDRIVER mdi,
+ S32 channel);
+
+DXDEC void AILCALL AIL_map_sequence_channel (HSEQUENCE S,
+ S32 seq_channel,
+ S32 new_channel);
+
+DXDEC S32 AILCALL AIL_true_sequence_channel (HSEQUENCE S,
+ S32 seq_channel);
+
+DXDEC void AILCALL AIL_send_channel_voice_message
+ (HMDIDRIVER mdi,
+ HSEQUENCE S,
+ S32 status,
+ S32 data_1,
+ S32 data_2);
+
+DXDEC void AILCALL AIL_send_sysex_message (HMDIDRIVER mdi,
+ void const *buffer);
+
+DXDEC HWAVESYNTH
+ AILCALL AIL_create_wave_synthesizer (HDIGDRIVER dig,
+ HMDIDRIVER mdi,
+ void const *wave_lib,
+ S32 polyphony);
+
+DXDEC void AILCALL AIL_destroy_wave_synthesizer (HWAVESYNTH W);
+
+DXDEC void AILCALL AIL_set_sequence_ms_position (HSEQUENCE S, //)
+ S32 milliseconds);
+
+DXDEC void AILCALL AIL_sequence_ms_position(HSEQUENCE S, //)
+ S32 *total_milliseconds,
+ S32 *current_milliseconds);
+
+
+
+//
+// red book functions
+//
+
+#ifdef IS_WINDOWS
+
+#pragma pack(push, 1)
+
+typedef MSS_STRUCT _REDBOOK {
+ U32 DeviceID;
+ U32 paused;
+ U32 pausedsec;
+ U32 lastendsec;
+} REDBOOK;
+
+#pragma pack(pop)
+
+typedef MSS_STRUCT _REDBOOK* HREDBOOK;
+
+#define REDBOOK_ERROR 0
+#define REDBOOK_PLAYING 1
+#define REDBOOK_PAUSED 2
+#define REDBOOK_STOPPED 3
+
+
+DXDEC HREDBOOK AILCALL AIL_redbook_open(U32 which);
+
+DXDEC HREDBOOK AILCALL AIL_redbook_open_drive(S32 drive);
+
+DXDEC void AILCALL AIL_redbook_close(HREDBOOK hand);
+
+DXDEC void AILCALL AIL_redbook_eject(HREDBOOK hand);
+
+DXDEC void AILCALL AIL_redbook_retract(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_status(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_tracks(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_track(HREDBOOK hand);
+
+DXDEC void AILCALL AIL_redbook_track_info(HREDBOOK hand,U32 tracknum,
+ U32* startmsec,U32* endmsec);
+
+DXDEC U32 AILCALL AIL_redbook_id(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_position(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_play(HREDBOOK hand,U32 startmsec, U32 endmsec);
+
+DXDEC U32 AILCALL AIL_redbook_stop(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_pause(HREDBOOK hand);
+
+DXDEC U32 AILCALL AIL_redbook_resume(HREDBOOK hand);
+
+DXDEC F32 AILCALL AIL_redbook_volume_level(HREDBOOK hand);
+
+DXDEC F32 AILCALL AIL_redbook_set_volume_level(HREDBOOK hand, F32 volume);
+
+#endif
+
+DXDEC U32 AILCALL AIL_ms_count(void);
+DXDEC U32 AILCALL AIL_us_count(void);
+DXDEC U64 AILCALL AIL_ms_count64(void);
+DXDEC U64 AILCALL AIL_us_count64(void);
+DXDEC U64 AILCALL AIL_get_time(void);
+DXDEC U64 AILCALL AIL_time_to_ms(U64 time);
+DXDEC U64 AILCALL AIL_ms_to_time(U64 ms);
+
+DXDEC void AILCALL MilesUseTelemetry( void * context );
+DXDEC void AILCALL MilesUseTmLite( void* context );
+
+//
+//
+//
+
+#define MSSIO_FLAGS_DONT_CLOSE_HANDLE 1
+#define MSSIO_FLAGS_QUERY_SIZE_ONLY 2
+#define MSSIO_FLAGS_DONT_USE_OFFSET 4
+
+#define MSSIO_STATUS_COMPLETE 1
+#define MSSIO_STATUS_ERROR_FAILED_OPEN 0x1003
+#define MSSIO_STATUS_ERROR_FAILED_READ 0x1004
+#define MSSIO_STATUS_ERROR_SHUTDOWN 0x1005
+#define MSSIO_STATUS_ERROR_CANCELLED 0x1006
+#define MSSIO_STATUS_ERROR_MEMORY_ALLOC_FAIL 0x1007
+#define MSSIO_STATUS_ERROR_MASK 0x1000
+
+// returns percent full (1.0 = 100%)
+typedef F32 (AILCALLBACK *MilesAsyncStreamCallback)(void* i_User);
+
+struct MilesAsyncRead
+{
+ char FileName[256];
+ U64 Offset;
+ S64 Count;
+ void* Buffer;
+ void* StreamUserData;
+ MilesAsyncStreamCallback StreamCB;
+ char const * caller;
+ U32 caller_line;
+ UINTa FileHandle;
+ S32 Flags;
+ S32 ReadAmt; // current read amt.
+ S32 AdditionalBuffer;
+ S32 volatile Status; // This is only valid after a call to MilesAsyncFileWait or MilesAsyncFileCancel has succeeded.
+ char Internal[48+128];
+};
+
+DXDEC S32 AILCALL MilesAsyncFileRead(struct MilesAsyncRead* i_Request);
+DXDEC S32 AILCALL MilesAsyncFileCancel(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed.
+DXDEC S32 AILCALL MilesAsyncFileStatus(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded.
+DXDEC S32 AILCALL MilesAsyncStartup();
+DXDEC S32 AILCALL MilesAsyncShutdown();
+DXDEC S32 AILCALL AIL_IO_thread_handle(void* o_Handle);
+DXDEC void AILCALL MilesAsyncSetPaused(S32 i_IsPaused);
+
+typedef S32 (AILCALLBACK * MilesAsyncFileRead_callback)(struct MilesAsyncRead* i_Request);
+typedef S32 (AILCALLBACK * MilesAsyncFileCancel_callback)(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed.
+typedef S32 (AILCALLBACK * MilesAsyncFileStatus_callback)(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded.
+typedef S32 (AILCALLBACK * MilesAsyncStartup_callback)();
+typedef S32 (AILCALLBACK * MilesAsyncShutdown_callback)();
+typedef void (AILCALLBACK * MilesAsyncSetPaused_callback)(S32 i_IsPaused);
+typedef S32 (AILCALLBACK * AIL_IO_thread_handle_callback)(void* o_Handle);
+
+DXDEC void AILCALL AIL_set_async_callbacks(
+ MilesAsyncFileRead_callback read,
+ MilesAsyncFileCancel_callback cancel,
+ MilesAsyncFileStatus_callback status,
+ MilesAsyncStartup_callback startup,
+ MilesAsyncShutdown_callback shutdown,
+ MilesAsyncSetPaused_callback setpaused,
+ AIL_IO_thread_handle_callback threadhandle);
+
+//
+//
+//
+
+typedef struct _STREAM* HSTREAM; // Handle to stream
+
+typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream);
+
+#define MSS_STREAM_CHUNKS 8
+
+typedef struct _STREAM
+{
+ S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream
+ S32 using_ASI; // 1 if using ASI decoder to uncompress stream data
+ ASISTAGE *ASI; // handy pointer to our ASI coded
+
+ HSAMPLE samp; // the sample handle
+
+ UINTa fileh; // the open file handle
+
+ U8* bufs[MSS_STREAM_CHUNKS]; // the data buffers
+ S32 reset_ASI[MSS_STREAM_CHUNKS]; // should we reset the ASI at the end of the buffer?
+ S32 reset_seek_pos[MSS_STREAM_CHUNKS]; // new stream position after reset
+ S32 bufstart[MSS_STREAM_CHUNKS]; // offset of where this buffer started
+ S32 loadedsizes[MSS_STREAM_CHUNKS]; // sizes of the data to be started
+
+ struct MilesAsyncRead asyncs[MSS_STREAM_CHUNKS];
+ S32 asyncs_loaded[MSS_STREAM_CHUNKS]; // 0=unloaded, 1=loading, 2=loaded, but not started
+ S32 next_read_offset; // offset to pass to the next read, so the seek occurs internally. -1 to not seek.
+
+ S32 into_Miles_index; // index of buffer that we will async into next
+ S32 read_IO_index; // index of buffer to be loaded into Miles next
+
+ S32 bufsize; // size of each buffer
+
+ U32 datarate; // datarate in bytes per second
+ S32 filerate; // original datarate of the file
+ S32 filetype; // file format type
+ U32 filemask; // channel mask for stream file
+ S32 totallen; // total length of the sound data
+
+ S32 substart; // subblock loop start
+ S32 sublen; // subblock loop len
+
+ U32 blocksize; // ADPCM block size
+
+ S32 loadedsome; // have we done any loads?
+
+ U32 startpos; // point that the sound data begins
+ U32 async_pos; // position if the last async completed
+
+ U32 loopsleft; // how many loops are left
+
+ U32 error; // read error has occurred
+
+ S32 preload; // preload the file into the first buffer
+ U32 preloadpos; // position to use in preload
+ U32 noback; // no background processing
+ S32 alldone; // alldone
+ S32 primeamount; // amount to load after a seek
+ S32 primeleft; // amount to read before starting
+
+ S32 playcontrol; // control: 0=stopped, 1=started, |8=paused, |16=sample paused
+
+ AILSTREAMCB callback; // end of stream callback
+
+ SINTa user_data[8]; // Miscellaneous user data
+ void* next; // pointer to next stream
+
+ S32 autostreaming; // are we autostreaming this stream
+
+ F32 level; // io percent full
+ F32 last_level; // old io percent
+ F32 percent_mult; // factor to scale by
+ S32 stream_count; // unique number of the stream
+
+ S32 docallback; // set when it time to poll for a callback
+
+ S32 was_popped; // set to 1 if the stream needs to be freed due to a system push/pop - causes SMP_DONE to be stream_status
+} MSTREAM_TYPE;
+
+
+DXDEC HSTREAM AILCALL AIL_open_stream(HDIGDRIVER dig, char const * filename, S32 stream_mem);
+
+DXDEC void AILCALL AIL_close_stream(HSTREAM stream);
+
+DXDEC HSAMPLE AILCALL AIL_stream_sample_handle(HSTREAM stream);
+
+DXDEC S32 AILCALL AIL_service_stream(HSTREAM stream, S32 fillup);
+
+DXDEC void AILCALL AIL_start_stream(HSTREAM stream);
+
+DXDEC void AILCALL AIL_pause_stream(HSTREAM stream, S32 onoff);
+
+DXDEC S32 AILCALL AIL_stream_loop_count(HSTREAM stream);
+
+DXDEC void AILCALL AIL_set_stream_loop_count(HSTREAM stream, S32 count);
+
+DXDEC void AILCALL AIL_set_stream_loop_block (HSTREAM S,
+ S32 loop_start_offset,
+ S32 loop_end_offset);
+
+DXDEC S32 AILCALL AIL_stream_status(HSTREAM stream);
+
+DXDEC F32 AILCALL AIL_stream_filled_percent(HSTREAM stream);
+
+DXDEC void AILCALL AIL_set_stream_position(HSTREAM stream,S32 offset);
+
+DXDEC S32 AILCALL AIL_stream_position(HSTREAM stream);
+
+DXDEC void AILCALL AIL_stream_info(HSTREAM stream, S32* datarate, S32* sndtype, S32* length, S32* memory);
+
+DXDEC AILSTREAMCB AILCALL AIL_register_stream_callback(HSTREAM stream, AILSTREAMCB callback);
+
+DXDEC void AILCALL AIL_auto_service_stream(HSTREAM stream, S32 onoff);
+
+DXDEC void AILCALL AIL_set_stream_user_data (HSTREAM S,
+ U32 index,
+ SINTa value);
+
+DXDEC SINTa AILCALL AIL_stream_user_data (HSTREAM S,
+ U32 index);
+
+DXDEC void AILCALL AIL_set_stream_ms_position (HSTREAM S,
+ S32 milliseconds);
+
+DXDEC void AILCALL AIL_stream_ms_position (HSTREAM S, //)
+ S32 * total_milliseconds,
+ S32 * current_milliseconds);
+
+//! \todo MSS_FILE not needed anymore?
+typedef char MSS_FILE;
+
+typedef U32 (AILCALLBACK*AIL_file_open_callback) (MSS_FILE const* Filename,
+ UINTa* FileHandle);
+
+typedef void (AILCALLBACK*AIL_file_close_callback) (UINTa FileHandle);
+
+#define AIL_FILE_SEEK_BEGIN 0
+#define AIL_FILE_SEEK_CURRENT 1
+#define AIL_FILE_SEEK_END 2
+
+typedef S32 (AILCALLBACK*AIL_file_seek_callback) (UINTa FileHandle,
+ S32 Offset,
+ U32 Type);
+
+typedef U32 (AILCALLBACK*AIL_file_read_callback) (UINTa FileHandle,
+ void* Buffer,
+ U32 Bytes);
+
+DXDEC void AILCALL AIL_set_file_callbacks (AIL_file_open_callback opencb,
+ AIL_file_close_callback closecb,
+ AIL_file_seek_callback seekcb,
+ AIL_file_read_callback readcb);
+
+DXDEC void AILCALL AIL_file_callbacks(AIL_file_open_callback* opencb,
+ AIL_file_close_callback* closecb,
+ AIL_file_seek_callback* seekcb,
+ AIL_file_read_callback* readcb);
+
+#ifdef IS_32
+
+typedef void* (AILCALLBACK *AIL_file_async_read_callback) (UINTa FileHandle,
+ void* Buffer,
+ U32 Bytes);
+
+typedef S32 (AILCALLBACK*AIL_file_async_status_callback) (void* async,
+ S32 wait,
+ U32* BytesRead);
+
+DXDEC void AILCALL AIL_set_file_async_callbacks (AIL_file_open_callback opencb,
+ AIL_file_close_callback closecb,
+ AIL_file_seek_callback seekcb,
+ AIL_file_async_read_callback areadcb,
+ AIL_file_async_status_callback statuscb);
+
+#endif
+
+//
+// High-level DLS functions
+//
+
+typedef struct _DLSFILEID {
+ SINTa id;
+ struct _DLSFILEID* next;
+} DLSFILEID;
+
+typedef struct _DLSFILEID* HDLSFILEID;
+
+typedef struct _DLSDEVICE {
+ VOIDFUNC* pGetPref;
+ VOIDFUNC* pSetPref;
+ VOIDFUNC* pMSSOpen;
+ VOIDFUNC* pOpen;
+ VOIDFUNC* pClose;
+ VOIDFUNC* pLoadFile;
+ VOIDFUNC* pLoadMem;
+ VOIDFUNC* pUnloadFile;
+ VOIDFUNC* pUnloadAll;
+ VOIDFUNC* pGetInfo;
+ VOIDFUNC* pCompact;
+ VOIDFUNC* pSetAttr;
+ SINTa DLSHandle;
+ U32 format;
+ U32 buffer_size;
+ void* buffer[2];
+ HSAMPLE sample;
+ HMDIDRIVER mdi;
+ HDIGDRIVER dig;
+ HDLSFILEID first;
+#if defined(__RADNT__)
+
+ #ifdef MSS_STATIC_RIB
+ #error "Bad defines - can't have a static rib on NT"
+ #endif
+ HMODULE lib;
+#elif defined(MSS_STATIC_RIB)
+ char* DOSname;
+#endif
+} DLSDEVICE;
+
+typedef struct _DLSDEVICE* HDLSDEVICE;
+
+typedef struct _AILDLSINFO {
+ char Description[128];
+ S32 MaxDLSMemory;
+ S32 CurrentDLSMemory;
+ S32 LargestSize;
+ S32 GMAvailable;
+ S32 GMBankSize;
+} AILDLSINFO;
+
+#ifdef MSS_STATIC_RIB
+
+typedef struct _AILSTATICDLS {
+ char* description;
+ VOIDFUNC* pDLSOpen;
+ VOIDFUNC* pMSSOpen;
+ VOIDFUNC* pOpen;
+ VOIDFUNC* pClose;
+ VOIDFUNC* pLoadFile;
+ VOIDFUNC* pLoadMem;
+ VOIDFUNC* pUnloadFile;
+ VOIDFUNC* pUnloadAll;
+ VOIDFUNC* pGetInfo;
+ VOIDFUNC* pCompact;
+ VOIDFUNC* pSetAttr;
+} AILSTATICDLS;
+
+#endif // MSS_STATIC_RIB
+
+
+DXDEC HDLSDEVICE AILCALL AIL_DLS_open(HMDIDRIVER mdi, HDIGDRIVER dig,
+#ifdef MSS_STATIC_RIB
+ AILSTATICDLS const * staticdls,
+#elif defined(__RADNT__)
+ char const * libname,
+#endif
+ U32 flags, U32 rate, S32 bits, S32 channels);
+
+//
+// Parameters for the dwFlag used in DLSClose() and flags in AIL_DLS_close
+//
+
+#define RETAIN_DLS_COLLECTION 0x00000001
+#define RETURN_TO_BOOTUP_STATE 0x00000002
+#define RETURN_TO_GM_ONLY_STATE 0x00000004
+#define DLS_COMPACT_MEMORY 0x00000008
+
+DXDEC void AILCALL AIL_DLS_close(HDLSDEVICE dls, U32 flags);
+
+DXDEC HDLSFILEID AILCALL AIL_DLS_load_file(HDLSDEVICE dls, char const* filename, U32 flags);
+
+DXDEC HDLSFILEID AILCALL AIL_DLS_load_memory(HDLSDEVICE dls, void const* memfile, U32 flags);
+
+//
+// other parameters for AIL_DLS_unload
+//
+
+#define AIL_DLS_UNLOAD_MINE 0
+#define AIL_DLS_UNLOAD_ALL ((HDLSFILEID)(UINTa)(SINTa)-1)
+
+DXDEC void AILCALL AIL_DLS_unload(HDLSDEVICE dls, HDLSFILEID dlsid);
+
+DXDEC void AILCALL AIL_DLS_compact(HDLSDEVICE dls);
+
+DXDEC void AILCALL AIL_DLS_get_info(HDLSDEVICE dls, AILDLSINFO* info, S32* PercentCPU);
+
+DXDEC HSAMPLE AILCALL AIL_DLS_sample_handle(HDLSDEVICE dls);
+
+
+//
+// Quick-integration service functions and data types
+//
+
+typedef struct
+{
+ U32 const *data;
+ S32 size;
+ S32 type;
+ void *handle;
+ S32 status;
+ void* next;
+ S32 speed;
+ F32 volume;
+ F32 extravol;
+ F32 dry;
+ F32 wet;
+ F32 cutoff;
+ HDLSFILEID dlsid;
+ void* dlsmem;
+ void* dlsmemunc;
+ S32 milliseconds;
+ S32 length;
+ SINTa userdata;
+}
+AUDIO_TYPE;
+
+
+#define QSTAT_DONE 1 // Data has finished playing
+#define QSTAT_LOADED 2 // Data has been loaded, but not yet played
+#define QSTAT_PLAYING 3 // Data is currently playing
+
+typedef AUDIO_TYPE * HAUDIO; // Generic handle to any audio data type
+
+#define AIL_QUICK_USE_WAVEOUT 2
+#define AIL_QUICK_MIDI_AND_DLS 2
+#define AIL_QUICK_DLS_ONLY 3
+#define AIL_QUICK_MIDI_AND_VORTEX_DLS 4
+#define AIL_QUICK_MIDI_AND_SONICVIBES_DLS 5
+
+DXDEC S32 AILCALL
+ AIL_quick_startup (
+ S32 use_digital,
+ S32 use_MIDI,
+ U32 output_rate,
+ S32 output_bits,
+ S32 output_channels);
+
+DXDEC void AILCALL AIL_quick_shutdown (void);
+
+DXDEC void AILCALL AIL_quick_handles (HDIGDRIVER* pdig,
+ HMDIDRIVER* pmdi,
+ HDLSDEVICE* pdls );
+
+DXDEC HAUDIO AILCALL AIL_quick_load (char const *filename);
+
+DXDEC HAUDIO AILCALL AIL_quick_load_mem (void const *mem,
+ U32 size);
+
+DXDEC HAUDIO AILCALL AIL_quick_load_named_mem (void const *mem,
+ char const *filename,
+ U32 size);
+
+DXDEC HAUDIO AILCALL AIL_quick_copy (HAUDIO audio);
+
+DXDEC void AILCALL AIL_quick_unload (HAUDIO audio);
+
+DXDEC S32 AILCALL AIL_quick_play (HAUDIO audio,
+ U32 loop_count);
+
+DXDEC void AILCALL AIL_quick_halt (HAUDIO audio);
+
+DXDEC S32 AILCALL AIL_quick_status (HAUDIO audio);
+
+DXDEC HAUDIO AILCALL AIL_quick_load_and_play (char const *filename,
+ U32 loop_count,
+ S32 wait_request);
+
+DXDEC void AILCALL AIL_quick_set_speed (HAUDIO audio, S32 speed);
+
+DXDEC void AILCALL AIL_quick_set_volume (HAUDIO audio, F32 volume, F32 extravol);
+
+DXDEC void AILCALL AIL_quick_set_reverb_levels (HAUDIO audio,
+ F32 dry_level,
+ F32 wet_level);
+
+DXDEC void AILCALL AIL_quick_set_low_pass_cut_off(HAUDIO S,
+ S32 channel,
+ F32 cut_off);
+
+DXDEC void AILCALL AIL_quick_set_ms_position(HAUDIO audio,S32 milliseconds);
+
+DXDEC S32 AILCALL AIL_quick_ms_position(HAUDIO audio);
+
+DXDEC S32 AILCALL AIL_quick_ms_length(HAUDIO audio);
+
+
+#define AIL_QUICK_XMIDI_TYPE 1
+#define AIL_QUICK_DIGITAL_TYPE 2
+#define AIL_QUICK_DLS_XMIDI_TYPE 3
+#define AIL_QUICK_MPEG_DIGITAL_TYPE 4
+#define AIL_QUICK_OGG_VORBIS_TYPE 5
+#define AIL_QUICK_V12_VOICE_TYPE 6
+#define AIL_QUICK_V24_VOICE_TYPE 7
+#define AIL_QUICK_V29_VOICE_TYPE 8
+#define AIL_QUICK_OGG_SPEEX_TYPE 9
+#define AIL_QUICK_S8_VOICE_TYPE 10
+#define AIL_QUICK_S16_VOICE_TYPE 11
+#define AIL_QUICK_S32_VOICE_TYPE 12
+#define AIL_QUICK_BINKA_TYPE 13
+
+DXDEC S32 AILCALL AIL_quick_type(HAUDIO audio);
+
+DXDEC S32 AILCALL AIL_WAV_info(void const* WAV_image, AILSOUNDINFO* info);
+
+DXDEC S32 AILCALL AIL_WAV_marker_count(void const *WAV_image);
+
+DXDEC S32 AILCALL AIL_WAV_marker_by_index(void const *WAV_image, S32 n, C8 const **name);
+
+DXDEC S32 AILCALL AIL_WAV_marker_by_name(void const *WAV_image, C8 *name);
+
+DXDEC S32 AILCALL AIL_size_processed_digital_audio(
+ U32 dest_rate,
+ U32 dest_format,
+ S32 num_srcs,
+ AILMIXINFO const * src);
+
+DXDEC S32 AILCALL AIL_process_digital_audio(
+ void *dest_buffer,
+ S32 dest_buffer_size,
+ U32 dest_rate,
+ U32 dest_format,
+ S32 num_srcs,
+ AILMIXINFO* src);
+
+#define AIL_LENGTHY_INIT 0
+#define AIL_LENGTHY_SET_PROPERTY 1
+#define AIL_LENGTHY_UPDATE 2
+#define AIL_LENGTHY_DONE 3
+
+typedef S32 (AILCALLBACK* AILLENGTHYCB)(U32 state,UINTa user);
+
+typedef S32 (AILCALLBACK* AILCODECSETPROP)(char const* property,void const * value);
+
+DXDEC S32 AILCALL AIL_compress_ASI(AILSOUNDINFO const * info, //)
+ char const* filename_ext,
+ void** outdata,
+ U32* outsize,
+ AILLENGTHYCB callback);
+
+DXDEC S32 AILCALL AIL_decompress_ASI(void const* indata, //)
+ U32 insize,
+ char const* filename_ext,
+ void** wav,
+ U32* wavsize,
+ AILLENGTHYCB callback);
+
+DXDEC S32 AILCALL AIL_compress_ADPCM(AILSOUNDINFO const * info,
+ void** outdata, U32* outsize);
+
+DXDEC S32 AILCALL AIL_decompress_ADPCM(AILSOUNDINFO const * info,
+ void** outdata, U32* outsize);
+
+DXDEC S32 AILCALL AIL_compress_DLS(void const* dls,
+ char const* compression_extension,
+ void** mls, U32* mlssize,
+ AILLENGTHYCB callback);
+
+DXDEC S32 AILCALL AIL_merge_DLS_with_XMI(void const* xmi, void const* dls,
+ void** mss, U32* msssize);
+
+DXDEC S32 AILCALL AIL_extract_DLS( void const *source_image, //)
+ U32 source_size,
+ void * *XMI_output_data,
+ U32 *XMI_output_size,
+ void * *DLS_output_data,
+ U32 *DLS_output_size,
+ AILLENGTHYCB callback);
+
+#define AILFILTERDLS_USINGLIST 1
+
+DXDEC S32 AILCALL AIL_filter_DLS_with_XMI(void const* xmi, void const* dls,
+ void** dlsout, U32* dlssize,
+ S32 flags, AILLENGTHYCB callback);
+
+#define AILMIDITOXMI_USINGLIST 1
+#define AILMIDITOXMI_TOLERANT 2
+
+DXDEC S32 AILCALL AIL_MIDI_to_XMI (void const* MIDI,
+ U32 MIDI_size,
+ void* *XMIDI,
+ U32 * XMIDI_size,
+ S32 flags);
+
+#define AILDLSLIST_ARTICULATION 1
+#define AILDLSLIST_DUMP_WAVS 2
+
+#if defined(IS_WIN32) || defined(IS_MAC) || defined(IS_LINUX)
+
+DXDEC S32 AILCALL AIL_list_DLS (void const* DLS,
+ char** lst,
+ U32 * lst_size,
+ S32 flags,
+ C8 * title);
+
+#define AILMIDILIST_ROLANDSYSEX 1
+#define AILMIDILIST_ROLANDUN 2
+#define AILMIDILIST_ROLANDAB 4
+
+DXDEC S32 AILCALL AIL_list_MIDI (void const* MIDI,
+ U32 MIDI_size,
+ char** lst,
+ U32 * lst_size,
+ S32 flags);
+#endif
+
+#define AILFILETYPE_UNKNOWN 0
+#define AILFILETYPE_PCM_WAV 1
+#define AILFILETYPE_ADPCM_WAV 2
+#define AILFILETYPE_OTHER_WAV 3
+#define AILFILETYPE_VOC 4
+#define AILFILETYPE_MIDI 5
+#define AILFILETYPE_XMIDI 6
+#define AILFILETYPE_XMIDI_DLS 7
+#define AILFILETYPE_XMIDI_MLS 8
+#define AILFILETYPE_DLS 9
+#define AILFILETYPE_MLS 10
+#define AILFILETYPE_MPEG_L1_AUDIO 11
+#define AILFILETYPE_MPEG_L2_AUDIO 12
+#define AILFILETYPE_MPEG_L3_AUDIO 13
+#define AILFILETYPE_OTHER_ASI_WAV 14
+#define AILFILETYPE_XBOX_ADPCM_WAV 15
+#define AILFILETYPE_OGG_VORBIS 16
+#define AILFILETYPE_V12_VOICE 17
+#define AILFILETYPE_V24_VOICE 18
+#define AILFILETYPE_V29_VOICE 19
+#define AILFILETYPE_OGG_SPEEX 20
+#define AILFILETYPE_S8_VOICE 21
+#define AILFILETYPE_S16_VOICE 22
+#define AILFILETYPE_S32_VOICE 23
+#define AILFILETYPE_BINKA 24
+
+DXDEC S32 AILCALL AIL_file_type(void const* data, U32 size);
+
+DXDEC S32 AILCALL AIL_file_type_named(void const* data, char const* filename, U32 size);
+
+DXDEC S32 AILCALL AIL_find_DLS (void const* data, U32 size,
+ void** xmi, U32* xmisize,
+ void** dls, U32* dlssize);
+typedef struct
+{
+ //
+ // File-level data accessible to app
+ //
+ // This is valid after AIL_inspect_MP3() is called (even if the file contains no valid frames)
+ //
+
+ U8 *MP3_file_image; // Original MP3_file_image pointer passed to AIL_inspect_MP3()
+ S32 MP3_image_size; // Original MP3_image_size passed to AIL_inspect_MP3()
+
+ U8 *ID3v2; // ID3v2 tag, if not NULL
+ S32 ID3v2_size; // Size of tag in bytes
+
+ U8 *ID3v1; // ID3v1 tag, if not NULL (always 128 bytes long if present)
+
+ U8 *start_MP3_data; // Pointer to start of data area in file (not necessarily first valid frame)
+ U8 *end_MP3_data; // Pointer to last valid byte in MP3 data area (before ID3v1 tag, if any)
+
+ //
+ // Information about current frame being inspected, valid if AIL_enumerate_MP3_frames() returns
+ // TRUE
+ //
+
+ S32 sample_rate; // Sample rate in Hz (normally constant across all frames in file)
+ S32 bit_rate; // Bits/second for current frame
+ S32 channels_per_sample; // 1 or 2
+ S32 samples_per_frame; // Always 576 or 1152 samples in each MP3 frame, depending on rate
+
+ S32 byte_offset; // Offset of frame from start_MP3_data (i.e., suitable for use as loop point)
+ S32 next_frame_expected; // Anticipated offset of next frame to be enumerated, if any
+ S32 average_frame_size; // Average source bytes per frame, determined solely by bit rate and sample rate
+ S32 data_size; // # of data-only bytes in this particular frame
+ S32 header_size; // 4 or 6 bytes, depending on CRC
+ S32 side_info_size; // Valid for layer 3 side info only
+ S32 ngr; // Always 2 for MPEG1, else 1
+ S32 main_data_begin; // Always 0 in files with no bit reservoir
+ S32 hpos; // Current bit position in header/side buffer
+
+ S32 MPEG1; // Data copied directly from frame header, see ISO docs for info...
+ S32 MPEG25;
+ S32 layer;
+ S32 protection_bit;
+ S32 bitrate_index;
+ S32 sampling_frequency;
+ S32 padding_bit;
+ S32 private_bit;
+ S32 mode;
+ S32 mode_extension;
+ S32 copyright;
+ S32 original;
+ S32 emphasis;
+
+ //
+ // LAME/Xing info tag data
+ //
+
+ S32 Xing_valid;
+ S32 Info_valid;
+ U32 header_flags;
+ S32 frame_count;
+ S32 byte_count;
+ S32 VBR_scale;
+ U8 TOC[100];
+ S32 enc_delay;
+ S32 enc_padding;
+
+ //
+ // Private (undocumented) data used during frame enumeration
+ //
+
+ U8 *ptr;
+ S32 bytes_left;
+
+ S32 check_valid;
+ S32 check_MPEG1;
+ S32 check_MPEG25;
+ S32 check_layer;
+ S32 check_protection_bit;
+ S32 check_sampling_frequency;
+ S32 check_mode;
+ S32 check_copyright;
+ S32 check_original;
+}
+MP3_INFO;
+
+DXDEC void AILCALL AIL_inspect_MP3 (MP3_INFO *inspection_state,
+ U8 *MP3_file_image,
+ S32 MP3_image_size);
+
+DXDEC S32 AILCALL AIL_enumerate_MP3_frames (MP3_INFO *inspection_state);
+
+typedef struct
+{
+ //
+ // File-level data accessible to app
+ //
+ // This is valid after AIL_inspect_Ogg() is called (even if the file contains no valid pages)
+ //
+
+ U8 *Ogg_file_image; // Originally passed to AIL_inspect_Ogg()
+ S32 Ogg_image_size; // Originally passed to AIL_inspect_Ogg()
+
+ U8 *start_Ogg_data; // Pointer to start of data area in file
+ U8 *end_Ogg_data; // Pointer to last valid byte in data area
+
+ // Information lifted from the header after AIL_inspect_Ogg() is called.
+ S32 channel_count;
+ S32 sample_rate;
+
+ //
+ // Information about current page being inspected, valid if AIL_enumerate_Ogg_pages() returns
+ // TRUE
+ //
+
+ S32 page_num; // 32-bit page sequence number from OggS header at byte offset 16
+
+ S32 sample_count; // Total # of samples already generated by encoder at the time the current page was written
+
+ S32 byte_offset; // Offset of page from start_Ogg_data (i.e., suitable for use as loop point)
+ S32 next_page_expected; // Anticipated offset of next page to be enumerated, if any
+
+ //
+ // Private (undocumented) data used during page enumeration
+ //
+
+ U8 *ptr;
+ S32 bytes_left;
+}
+OGG_INFO;
+
+DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state,
+ U8 *Ogg_file_image,
+ S32 Ogg_file_size);
+
+DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state);
+
+typedef struct
+{
+ const char* file_image;
+ S32 image_size;
+
+ S32 channel_count;
+ S32 sample_rate;
+
+ S32 total_samples;
+ S32 samples_per_frame;
+
+ const char* current_frame;
+
+ // output data - byte offset for current frame.
+ S32 byte_offset;
+} BINKA_INFO;
+
+DXDEC U32 AILCALL AIL_inspect_BinkA(BINKA_INFO* state, char const* file_image, S32 file_size);
+DXDEC S32 AILCALL AIL_enumerate_BinkA_frames(BINKA_INFO* state);
+
+//
+// RAD room types - currently the same as EAX
+//
+
+enum
+{
+ ENVIRONMENT_GENERIC, // factory default
+ ENVIRONMENT_PADDEDCELL,
+ ENVIRONMENT_ROOM, // standard environments
+ ENVIRONMENT_BATHROOM,
+ ENVIRONMENT_LIVINGROOM,
+ ENVIRONMENT_STONEROOM,
+ ENVIRONMENT_AUDITORIUM,
+ ENVIRONMENT_CONCERTHALL,
+ ENVIRONMENT_CAVE,
+ ENVIRONMENT_ARENA,
+ ENVIRONMENT_HANGAR,
+ ENVIRONMENT_CARPETEDHALLWAY,
+ ENVIRONMENT_HALLWAY,
+ ENVIRONMENT_STONECORRIDOR,
+ ENVIRONMENT_ALLEY,
+ ENVIRONMENT_FOREST,
+ ENVIRONMENT_CITY,
+ ENVIRONMENT_MOUNTAINS,
+ ENVIRONMENT_QUARRY,
+ ENVIRONMENT_PLAIN,
+ ENVIRONMENT_PARKINGLOT,
+ ENVIRONMENT_SEWERPIPE,
+ ENVIRONMENT_UNDERWATER,
+ ENVIRONMENT_DRUGGED,
+ ENVIRONMENT_DIZZY,
+ ENVIRONMENT_PSYCHOTIC,
+
+ ENVIRONMENT_COUNT // total number of environments
+};
+
+//
+// enumerated values for EAX
+//
+
+#ifndef EAX_H_INCLUDED
+
+enum
+{
+ EAX_ENVIRONMENT_GENERIC, // factory default
+ EAX_ENVIRONMENT_PADDEDCELL,
+ EAX_ENVIRONMENT_ROOM, // standard environments
+ EAX_ENVIRONMENT_BATHROOM,
+ EAX_ENVIRONMENT_LIVINGROOM,
+ EAX_ENVIRONMENT_STONEROOM,
+ EAX_ENVIRONMENT_AUDITORIUM,
+ EAX_ENVIRONMENT_CONCERTHALL,
+ EAX_ENVIRONMENT_CAVE,
+ EAX_ENVIRONMENT_ARENA,
+ EAX_ENVIRONMENT_HANGAR,
+ EAX_ENVIRONMENT_CARPETEDHALLWAY,
+ EAX_ENVIRONMENT_HALLWAY,
+ EAX_ENVIRONMENT_STONECORRIDOR,
+ EAX_ENVIRONMENT_ALLEY,
+ EAX_ENVIRONMENT_FOREST,
+ EAX_ENVIRONMENT_CITY,
+ EAX_ENVIRONMENT_MOUNTAINS,
+ EAX_ENVIRONMENT_QUARRY,
+ EAX_ENVIRONMENT_PLAIN,
+ EAX_ENVIRONMENT_PARKINGLOT,
+ EAX_ENVIRONMENT_SEWERPIPE,
+ EAX_ENVIRONMENT_UNDERWATER,
+ EAX_ENVIRONMENT_DRUGGED,
+ EAX_ENVIRONMENT_DIZZY,
+ EAX_ENVIRONMENT_PSYCHOTIC,
+
+ EAX_ENVIRONMENT_COUNT // total number of environments
+};
+
+#define EAX_REVERBMIX_USEDISTANCE (-1.0F)
+
+#endif
+
+#define MSS_BUFFER_HEAD (-1)
+
+//
+// Auxiliary 2D interface calls
+//
+
+DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary);
+
+//
+// 3D-related calls
+//
+
+DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig,
+ S32 bus_index);
+
+DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig,
+ S32 bus_index,
+ S32 room_type);
+
+DXDEC F32 AILCALL AIL_3D_rolloff_factor (HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_set_3D_rolloff_factor (HDIGDRIVER dig,
+ F32 factor);
+
+DXDEC F32 AILCALL AIL_3D_doppler_factor (HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_set_3D_doppler_factor (HDIGDRIVER dig,
+ F32 factor);
+
+DXDEC F32 AILCALL AIL_3D_distance_factor (HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_set_3D_distance_factor (HDIGDRIVER dig,
+ F32 factor);
+
+DXDEC void AILCALL AIL_set_sample_obstruction (HSAMPLE S,
+ F32 obstruction);
+
+DXDEC void AILCALL AIL_set_sample_occlusion (HSAMPLE S,
+ F32 occlusion);
+
+DXDEC void AILCALL AIL_set_sample_exclusion (HSAMPLE S,
+ F32 exclusion);
+
+DXDEC F32 AILCALL AIL_sample_obstruction (HSAMPLE S);
+
+DXDEC F32 AILCALL AIL_sample_occlusion (HSAMPLE S);
+
+DXDEC F32 AILCALL AIL_sample_exclusion (HSAMPLE S);
+
+EXPGROUP(3D Digital Audio Services)
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_volume_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount);
+/*
+ Sets a sample's volume falloff graph.
+
+ $:S Sample to affect
+ $:graph The array of points to use as the graph.
+ $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph.
+
+ This marks a sample as having a volume falloff graph. If a sample has a volume graph, it no
+ longer attenuates as per the default falloff function, and as such, its "minimum distance" no
+ longer has any effect. However, the "max distance" still clamps the sample to full attenuation.
+
+ A graph with only one point is treated as a line, returning graph[0].Y always.
+
+ Otherwise, the graph is evaluated as follows:
+
+
+
+ The distance to the listener is evaluated.
+
+ The two points with X values bounding "distance" are located.
+
+ If the distance is past the last graph point, graph[pointcount-1].Y is returned.
+
+ If either the output tangent type of the previous point, or the input tangent type of the next point are
+ MILES_TANGENT_STEP, previous->Y is returned.
+
+ Otherwise, the segment is evaluated as a hermite curve. ITX and ITY are ignore if ITYpe is MILES_TANGENT_LINEAR,
+ and likewise OTX and OTY are ignored if OType is MILES_TANGENT_LINEAR.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount);
+/*
+ Sets a sample's low pass cutoff falloff graph.
+
+ $:S Sample to affect
+ $:graph The array of points to use as the graph.
+ $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph.
+
+ This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If
+ a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be
+ called otherwise.
+
+ The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount);
+/*
+ Sets a sample's exclusion falloff graph.
+
+ $:S Sample to affect
+ $:graph The array of points to use as the graph.
+ $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph.
+
+ This marks a sample as having an exclusion that varies as a function of distance to the listener. If
+ a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion
+ affects reverb wet level.
+
+ The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount);
+/*
+ Sets a sample's spread falloff graph.
+
+ $:S Sample to affect
+ $:graph The array of points to use as the graph.
+ $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph.
+
+ This marks a sample as having a spread that varies as a function of distance to the listener. See
+ $AIL_set_sample_3D_spread.
+
+ The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECTOR3D* points, S32 point_count);
+/*
+ Sets a sample's position as a series of line segments.
+
+ $:S Sample to affect
+ $:points The 3D points representing the line segments. 0 reverts to classic point based positioning. All
+ segments are connected - N points represents N - 1 chained line segments.
+ $:point_count Size of points array. Minimum 2 (unless removing), max MILES_MAX_SEGMENT_COUNT
+
+ This marks a sample as having a position that is not a single point. When 3D attenuation is computed,
+ the closest point to the listener is found by walking each segment. That position is then used in all
+ other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional
+ source.
+
+ If there is neither spread falloff nor volume falloff specified, spread will be automatically applied
+ when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff
+ and $AIL_set_sample_3D_volume_falloff.
+
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread);
+/*
+ Sets a sample's "spread" value.
+
+ $:S Sample to affect.
+ $:spread The value to set the spread to.
+
+ Spread is how much the directionality of a sample "spreads" to more speakers - emulating
+ the effect a sound has when it occupies more than a point source. For instance, a sound
+ point source that sits directly to the left of the listener would have a very strong left
+ speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be
+ more even, causing the source to feel as though it is coming from an area, rather than
+ a point source.
+
+ A spread of 1 will effectively negate any spatialization effects other than distance attenuation.
+*/
+
+DXDEC void AILCALL AIL_set_sample_3D_distances (HSAMPLE S,
+ F32 max_dist,
+ F32 min_dist,
+ S32 auto_3D_wet_atten);
+
+
+DXDEC void AILCALL AIL_sample_3D_distances (HSAMPLE S,
+ F32 * max_dist,
+ F32 * min_dist,
+ S32 * auto_3D_wet_atten);
+
+DXDEC void AILCALL AIL_set_sample_3D_cone (HSAMPLE S,
+ F32 inner_angle,
+ F32 outer_angle,
+ F32 outer_volume_level);
+
+DXDEC void AILCALL AIL_sample_3D_cone (HSAMPLE S,
+ F32* inner_angle,
+ F32* outer_angle,
+ F32* outer_volume_level);
+
+DXDEC void AILCALL AIL_set_sample_3D_position (HSAMPLE obj,
+ F32 X,
+ F32 Y,
+ F32 Z);
+
+DXDEC void AILCALL AIL_set_sample_3D_velocity (HSAMPLE obj,
+ F32 dX_per_ms,
+ F32 dY_per_ms,
+ F32 dZ_per_ms,
+ F32 magnitude);
+
+DXDEC void AILCALL AIL_set_sample_3D_velocity_vector (HSAMPLE obj,
+ F32 dX_per_ms,
+ F32 dY_per_ms,
+ F32 dZ_per_ms);
+
+DXDEC void AILCALL AIL_set_sample_3D_orientation (HSAMPLE obj,
+ F32 X_face,
+ F32 Y_face,
+ F32 Z_face,
+ F32 X_up,
+ F32 Y_up,
+ F32 Z_up);
+
+DXDEC S32 AILCALL AIL_sample_3D_position (HSAMPLE obj,
+ F32 *X,
+ F32 *Y,
+ F32 *Z);
+
+DXDEC void AILCALL AIL_sample_3D_velocity (HSAMPLE obj,
+ F32 *dX_per_ms,
+ F32 *dY_per_ms,
+ F32 *dZ_per_ms);
+
+DXDEC void AILCALL AIL_sample_3D_orientation (HSAMPLE obj,
+ F32 *X_face,
+ F32 *Y_face,
+ F32 *Z_face,
+ F32 *X_up,
+ F32 *Y_up,
+ F32 *Z_up);
+
+DXDEC void AILCALL AIL_update_sample_3D_position (HSAMPLE obj,
+ F32 dt_milliseconds);
+
+DXDEC void AILCALL AIL_set_listener_3D_position (HDIGDRIVER dig,
+ F32 X,
+ F32 Y,
+ F32 Z);
+
+DXDEC void AILCALL AIL_set_listener_3D_velocity (HDIGDRIVER dig,
+ F32 dX_per_ms,
+ F32 dY_per_ms,
+ F32 dZ_per_ms,
+ F32 magnitude);
+
+DXDEC void AILCALL AIL_set_listener_3D_velocity_vector (HDIGDRIVER dig,
+ F32 dX_per_ms,
+ F32 dY_per_ms,
+ F32 dZ_per_ms);
+
+DXDEC void AILCALL AIL_set_listener_3D_orientation (HDIGDRIVER dig,
+ F32 X_face,
+ F32 Y_face,
+ F32 Z_face,
+ F32 X_up,
+ F32 Y_up,
+ F32 Z_up);
+
+DXDEC void AILCALL AIL_listener_3D_position (HDIGDRIVER dig,
+ F32 *X,
+ F32 *Y,
+ F32 *Z);
+
+DXDEC void AILCALL AIL_listener_3D_velocity (HDIGDRIVER dig,
+ F32 *dX_per_ms,
+ F32 *dY_per_ms,
+ F32 *dZ_per_ms);
+
+DXDEC void AILCALL AIL_listener_3D_orientation (HDIGDRIVER dig,
+ F32 *X_face,
+ F32 *Y_face,
+ F32 *Z_face,
+ F32 *X_up,
+ F32 *Y_up,
+ F32 *Z_up);
+
+DXDEC void AILCALL AIL_update_listener_3D_position (HDIGDRIVER dig,
+ F32 dt_milliseconds);
+
+#if defined( HOST_SPU_PROCESS )
+
+DXDEC S32 AILCALL MilesStartAsyncThread( S32 thread_num, void const * param );
+
+DXDEC S32 AILCALL MilesRequestStopAsyncThread( S32 thread_num );
+
+DXDEC S32 AILCALL MilesWaitStopAsyncThread( S32 thread_num );
+
+#endif
+
+
+//-----------------------------------------------------------------------------
+//
+// MSS 8 Bank API
+//
+//-----------------------------------------------------------------------------
+
+EXPGROUP(Miles High Level Event System)
+
+// misc character maxes.
+#define MSS_MAX_ASSET_NAME_BYTES 512
+#define MSS_MAX_PATH_BYTES 512
+
+#ifdef DOCS_ONLY
+
+EXPTYPE typedef struct MSSSOUNDBANK {};
+/*
+ Internal structure.
+
+ Use $HMSOUNDBANK instead.
+*/
+
+#endif
+
+EXPTYPE typedef struct SoundBank *HMSOUNDBANK;
+/*
+ Describes a handle to an open sound bank.
+
+ This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function.
+*/
+
+EXPGROUP(highlevel_util)
+
+DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_open_soundbank(char const *filename, char const* name);
+/*
+ Open a sound bank. If you are using the event execution engine, use the add soundbank function
+ provided there.
+
+ $:return 0 on fail, or a valid HMSOUNDBANK.
+ $:filename The filename of the soundbank to open.
+
+ Opens a sound bank for use with the MSS8 high level functions. The sound bank must be
+ closed with $AIL_close_soundbank. Use $AIL_add_soundbank if the Miles Event system is used.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank);
+/*
+ Close a soundbank previously opened with $AIL_open_soundbank.
+
+ $:bank Soundbank to close.
+
+ Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from
+ this soundbank are no longer valid.
+*/
+
+DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_filename(HMSOUNDBANK bank);
+/*
+ Return the filename used to open the given soundbank.
+
+ $:bank Soundbank to query.
+
+ $:return A pointer to the filename for the given soundbank, or 0 if bank is invalid.
+
+ Returns a pointer to the filename for a soundbank. This pointer should not be deleted.
+*/
+
+DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank);
+/*
+ Return the name of the given soundbank.
+
+ $:bank Soundbank to query.
+
+ $:return A pointer to the name of the sound bank, or 0 if the bank is invalid.
+
+ The name of the bank is the name used in asset names. This is distinct from the
+ file name of the bank.
+
+ The return value should not be deleted.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank);
+/*
+ Returns the amount of data used by the soundbank management structures.
+
+ $:bank Soundbank to query.
+ $:return Total memory allocated.
+
+ Returns the memory used via AIL_mem_alloc_lock during the creation of this structure.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name);
+/*
+ Enumerate the sound presets stored in a soundbank.
+
+ $:bank Containing soundbank.
+ $:next Enumeration token. Prior to first call, initialize to MSS_FIRST
+ $:list Optional filter. If specified, presets will only enumerate from the given preset sound preset list.
+ $:name The pointer to the currently enumerated preset name. This should not be deleted.
+
+ $:return Returns 0 when enumeration is complete.
+
+ Enumerates the sound presets available inside of a bank file. Example usage:
+
+ ${
+ HMSSENUM Token = MSS_FIRST;
+ const char* PresetName = 0;
+ while (AIL_enumerate_sound_presets(MyBank, &Token, 0, &PresetName))
+ {
+ printf("Found a preset named %s!", PresetName);
+
+ $AIL_apply_sound_preset(MySample, MyBank, PresetName);
+ }
+ $}
+
+ Note that name should NOT be deleted by the caller - this points at memory owned by
+ Miles.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name);
+/*
+ Enumerate the environment presets stored in a soundbank.
+
+ $:bank Containing soundbank.
+ $:next Enumeration token. Prior to first call, initialize to MSS_FIRST
+ $:list Optional filter. If specified, presets will only enumerate from the given environment preset list.
+ $:name The pointer to the currently enumerated preset name. This should not be deleted.
+ $:return Returns 0 when enumeration is complete.
+
+ Enumerates the environment presets available inside of a bank file. Example usage:
+
+ ${
+ HMSSENUM Token = MSS_FIRST;
+ const char* PresetName = 0;
+ while (AIL_enumerate_environment_presets(MyBank, &Token, 0, &PresetName))
+ {
+ printf("Found a preset named %s!", PresetName);
+
+ AIL_apply_environment_preset(MyDriver, MyBank, PresetName);
+ }
+ $}
+
+ Note that name should NOT be deleted by the caller - this points at memory owned by
+ Miles.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* next, char const** name);
+/*
+ Enumerate sounds stored in a soundbank.
+
+ $:bank Containing soundbank.
+ $:next Enumeration token. Prior to first call, initialize to MSS_FIRST
+ $:name The pointer to the currently enumerated sound name. This should not be deleted.
+ $:return Returns 0 when enumeration is complete.
+
+ Enumerates the sounds available inside of a bank file. Example usage:
+
+ ${
+ HMSSENUM Token = MSS_FIRST;
+ const char* SoundName = 0;
+ while (AIL_enumerate_sound_assets(MyBank, &Token, &SoundName))
+ {
+ char filename[MSS_MAX_PATH_BYTES];
+ AIL_sound_asset_filename(MyBank, SoundName, filename);
+
+ printf("Found a sound named %s!", SoundName);
+
+ S32* pData = (S32*)AIL_file_read(filename, FILE_READ_WITH_SIZE);
+ AIL_mem_free_lock(pData);
+ }
+ $}
+
+ Note that name should NOT be deleted by the caller - this points at memory owned by
+ Miles.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name);
+/*
+ Enumerate the events stored in a soundbank.
+
+ $:bank Soundbank to enumerate within.
+ $:next Enumeration token. Prior to first call, initialize to MSS_FIRST
+ $:list Optional filter. If specified, event will only enumerate from the given event list.
+ $:name The pointer to the currently enumerated preset name. This should not be deleted.
+ $:return Returns 0 when enumeration is complete.
+
+ Enumerates the events available inside of a bank file. Example usage:
+
+ ${
+ HMSSENUM Token = MSS_FIRST;
+ const char* EventName = 0;
+ while (AIL_enumerate_events(MyBank, &Token, 0, &EventName))
+ {
+ printf("Found an event named %s!", EventName);
+
+ const U8* EventContents = 0;
+ AIL_get_event_contents(MyBank, EventName, &EventContents);
+
+ AIL_enqueue_event(EventContents, 0, 0, 0, 0);
+ }
+ $}
+
+ Note that name should NOT be deleted by the caller - this points at memory owned by
+ Miles.
+*/
+
+DXDEC EXPAPI void* AILCALL AIL_find_environment_preset(HMSOUNDBANK bank, char const *name);
+/*
+ Returns the raw environment data associated with the given name.
+
+ $:bank The bank to look within
+ $:name The name of the asset to search for, including bank name.
+
+ $:return Raw environment data. This should not be deleted.
+
+ This function is designed to be used with $AIL_apply_raw_environment_preset.
+*/
+
+DXDEC EXPAPI void* AILCALL AIL_find_sound_preset(HMSOUNDBANK bank, char const* name);
+/*
+ Returns the raw preset data associated with the given name.
+
+ $:bank The bank to look within
+ $:name The name of the asset to search for, including bank name.
+
+ $:return Raw preset data. This should not be deleted.
+
+ This function is designed to be used with $AIL_apply_raw_sound_preset.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_apply_raw_sound_preset(HSAMPLE sample, void* preset);
+/*
+ Applies the sound preset to the given sample.
+
+ $:sample The sample to modify.
+ $:preset The raw preset data to apply, returned from $AIL_find_sound_preset
+
+ Updates sample properties based on the desired settings specified in the given preset.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name);
+/*
+ Apply the sound preset to the given sample.
+
+ $:sample The sample that will have its properties updated by the preset.
+ $:bank The sound bank containing the named preset.
+ $:name The name of the preset to apply.
+ $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank.
+
+ This will alter the properties on a given sample, based on the given preset.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset);
+/*
+ Returns the properties altered by the preset to their default state.
+
+ $:sample The sample to update.
+ $:preset The raw preset data to unapply, returned from $AIL_find_sound_preset
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name);
+/*
+ Restore the properties affected by the given preset to defaults.
+
+ $:sample The sample that will have its properties updated by the preset.
+ $:bank The sound bank containing the named preset.
+ $:name The name of the preset to apply.
+ $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank.
+
+ Presets may or may not affect any given property. Only the properties affected by the specified
+ preset will have their values restored to default.
+*/
+
+typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat);
+/*
+ Callback type for resolving variable expressions to values.
+
+ $:context Value passed to AIL_resolve_raw_*_preset().
+ $:exp The string expression to resolve.
+ $:explen Length of exp.
+ $:output Pointer to the memory to receive the result value.
+ $:isfloat nonzero if the output needs to be a float.
+
+ The function callback should convert variable expressions in to an output value of the
+ requested type.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval);
+/*
+ Compute the value of properties for the current value of variables using the given lookup function.
+
+ $:preset The raw preset as returns from $AIL_find_sound_preset.
+ $:context The context to pass in to the resolution function.
+ $:eval A function pointer to use for resolving expressions to values.
+ $:return 0 if the preset is invalid.
+
+ This function converts variable expressions that were stored in the preset in to values
+ that can be used by the event system. The values are stored in the preset itself, all that
+ has to happen is this is called with a valid resolve function prior to calling
+ $AIL_apply_raw_sound_preset.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_environment_preset(void* env, MilesResolveFunc eval);
+/*
+ Compute the value of properties for the current value of variables using the given lookup function.
+
+ $:env The raw preset as returns from $AIL_find_environment_preset.
+ $:context The context to pass in to the resolution function.
+ $:eval A function pointer to use for resolving expressions to values.
+ $:return 0 if the preset is invalid.
+
+ This function converts variable expressions that were stored in the environment in to values
+ that can be used by the event system. The values are stored in the environment itself, all that
+ has to happen is this is called with a valid resolve function prior to calling
+ $AIL_apply_raw_environment_preset.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_apply_raw_environment_preset(HDIGDRIVER dig, void* environment);
+/*
+ Applies the environment to the given driver.
+
+ $:dig The driver to modify.
+ $:environment The raw environment data to apply, returned from $AIL_find_environment_preset
+
+ Updates driver properties based on the desired settings specified in the given environment.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_apply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name);
+/*
+ Apply the environment preset to the given driver.
+
+ $:dig The driver that will have its properties updated by the preset.
+ $:bank The sound bank containing the named preset.
+ $:name The name of the preset to apply.
+ $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank.
+
+ This will alter properties on a given driver, based on the given preset.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_environment_preset(HDIGDRIVER dig, void* environment);
+/*
+ Returns the properties the environment affects to default state.
+
+ $:dig The driver to modify.
+ $:environment The raw environment data to unapply, returned from $AIL_find_environment_preset
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_unapply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name);
+/*
+ Restore the properties affected by the given preset to defaults.
+
+ $:dig The driver that will have its properties updated by the preset.
+ $:bank The sound bank containing the named preset.
+ $:name The name of the preset to apply.
+ $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank.
+
+ Presets may or may not affect any given property. Only the properties affected by the specified
+ preset will have its value restored to default.
+*/
+
+EXPTYPE typedef struct _MILESBANKSOUNDINFO
+{
+ // If this changes at all, compiled banks must be versioned...
+ S32 ChannelCount;
+ U32 ChannelMask;
+ S32 Rate;
+ S32 DataLen;
+ S32 SoundLimit;
+ S32 IsExternal;
+ U32 DurationMs;
+ S32 StreamBufferSize;
+ S32 IsAdpcm;
+ S32 AdpcmBlockSize;
+ F32 MixVolumeDAC;
+} MILESBANKSOUNDINFO;
+/*
+ Structure containing all metadata associated with a sound asset.
+
+ $:ChannelCount The number of channels the sound assets contains.
+ $:ChannelMask The channel mask for the sound asset.
+ $:Rate The sample rate for the sound asset.
+ $:DataLen The byte count the asset requires if fully loaded.
+ $:SoundLimit The maximum number of instances of this sound that is allowed to play at once.
+ $:IsExternal Nonzero if the sound is stored external to the sound bank. See the eventexternal sample.
+ $:DurationMs The length of the sound asset, in milliseconds.
+ $:StreamBufferSize If the sound is played as a stream, this is the buffer to use for this sound.
+ $:IsAdpcm Nonzero if the asset is an adpcm sound, and needs to be initialized as such.
+ $:AdpcmBlockSize The adpcm block size if the asset is adpcm encoded.
+ $:MixVolumeDAC The attenuation to apply to all instances of this sound, as a DAC scalar.
+
+ See $AIL_sound_asset_info.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name, char* out_name, MILESBANKSOUNDINFO* out_info);
+/*
+ Return the meta data associated with a sound assets in a sound bank.
+
+ $:bank The soundbank containing the sound asset.
+ $:name The name of the sound asset to find.
+ $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading.
+ $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset.
+ $:return Returns the byte size of the buffer required for out_name.
+
+ This function must be called in order to resolve the sound asset name to
+ something that can be used by miles. To ensure safe buffer containment, call
+ once with out_name as null to get the size needed.
+
+ For external deployment see the eventexternal example program.
+*/
+
+DXDEC EXPAPI SINTa AILCALL AIL_get_marker_list(HMSOUNDBANK bank, char const* sound_name);
+/*
+ Return an opaque value representing the list of markers attached to a given sound name.
+
+ $:bank The bank containing the sound asset.
+ $:sound_name The name of the sound asset.
+
+ $:return on fail/nonexistent list, or a nonzero opaque value to be passed to $AIL_find_marker_in_list.
+
+ Returns the marker list for a given sound asset. This value should just be passed directly to $AIL_find_marker_in_list
+ to retrieve the offset for a marker by name.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_find_marker_in_list(SINTa marker_list, char const * marker_name, S32* is_samples);
+/*
+ Returns the byte offset into a sample corresponding to the given marker name.
+
+ $:marker_list The marker list returned from $AIL_get_marker_list.
+ $:marker_name The name of the marker to look up.
+ $:is_samples returns whether the marker is at a sample location instead of a byte location.
+
+ $:return -1 if the marker was not found, or the byte offset of the marker.
+
+ Looks up an offset to use in functions such as $AIL_set_sample_position. marker_list can be retrieved with
+ $AIL_get_marker_list.
+*/
+
+// ----------------------------
+// End MSS8 declarations
+// ----------------------------
+
+//
+// Event routines
+//
+typedef struct _MEMDUMP* HMEMDUMP;
+#define HMSSEVENTCONSTRUCT HMEMDUMP
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_create_event", "Creates an empty event to be filled with steps."
+
+ ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory."
+
+ Discussion = "Primarily designed for offline use, this function is the first step in
+ creating an event that can be consumed by the MilesEvent system. Usage is as follows:
+
+ HMSSEVENTCONSTRUCT hEvent = AIL_create_event();
+
+ // misc add functions
+ AIL_add_start_sound_event_step(hEvent, ...);
+ AIL_add_control_sounds_event_step(hEvent, ...);
+ // etc
+
+ char* pEvent = AIL_close_event(hEvent);
+
+ // Do something with the event
+
+ AIL_mem_free_lock(pEvent);
+
+ Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following
+ $AIL_complete_event_queue_processing.
+
+ Events are generally tailored to the MilesEvent system, even though there is nothing preventing you
+ from writing your own event system, or creation ui.
+ "
+ }
+*/
+DXDEC HMSSEVENTCONSTRUCT AILCALL AIL_create_event(void);
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_close_event", "Returns a completed event, ready for enqueueing in to the MilesEvent system."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to complete."
+
+ ReturnType = "char*", "An allocated event string that can be passed to AIL_next_event_step or enqueued in the
+ MilesEvent system via AIL_enqueue_event."
+
+ Discussion = "The returned pointer must be deleted via AIL_mem_free_lock(). Note that if the MilesEvent system
+ is used, the event pointer must remain valid through the following $AIL_complete_event_queue_processing call."
+
+ }
+*/
+DXDEC U8* AILCALL AIL_close_event(HMSSEVENTCONSTRUCT i_Event);
+
+EXPTYPEBEGIN typedef S32 MILES_START_STEP_EVICTION_TYPE;
+#define MILES_START_STEP_PRIORITY 0
+#define MILES_START_STEP_DISTANCE 1
+#define MILES_START_STEP_VOLUME 2
+#define MILES_START_STEP_OLDEST 3
+EXPTYPEEND
+/*
+ Determines the behavior of a sound if it encounters a limit trying to play.
+
+ $:MILES_START_STEP_PRIORITY Evict a sound less than our priority.
+ $:MILES_START_STEP_DISTANCE Evict the farthest sound from the listener.
+ $:MILES_START_STEP_VOLUME Evict the quietest sound after mixing, using the loudest channel as the qualifier.
+ $:MILES_START_STEP_OLDEST Evict the sound that has been playing the longest.
+
+ See also $AIL_add_start_sound_event_step.
+*/
+
+EXPTYPEBEGIN typedef S32 MILES_START_STEP_SELECTION_TYPE;
+#define MILES_START_STEP_RANDOM 0
+#define MILES_START_STEP_NO_REPEATS 1
+#define MILES_START_STEP_IN_ORDER 2
+#define MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT 3
+#define MILES_START_STEP_BLENDED 4
+#define MILES_START_STEP_SELECT_MASK 0x7
+#define MILES_START_STEP_SELECT_BITS 3
+EXPTYPEEND
+/*
+ Determines the usage of the sound names list in the $AIL_add_start_sound_event_step.
+
+ $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same
+ sound to play twice in a row. This is the only selection type that doesn't require
+ a state variable.
+ $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same.
+ $:MILES_START_STEP_IN_ORDER Play the list in order, looping.
+ $:MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT Randomly select from the list, but don't allow duplicates until all sounds have been played.
+ $:MILES_START_STEP_BLENDED Play *all* of the sounds, using the state variable as both the variable name to poll,
+ and the name of the blend function to look up. The blend should have been specified prior to execution of
+ this step in the runtime, see $AIL_add_setblend_event_step.
+ $:MILES_START_STEP_SELECT_MASK Expect a value from the game to determine which sound to play, added in to the other selection type.
+*/
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to."
+ In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from.
+ If there are multiple names listed, the sound will be chosen at random based on the given weights. This
+ string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always
+ terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use
+ an empty string as an entry."
+
+ In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'"
+ In = "U8", "i_PresetIsDynamic", "Nonzero if the preset should poll the value of variables every frame, instead of only when applied."
+ In = "const char*", "i_EventName", "[optional] The name of the event to execute upon completion of the sound, of the form 'PresetList/PresetName'"
+ In = "const char*", "i_StartMarker", "[optional] The name of a marker to use as the loop start point."
+ In = "const char*", "i_EndMarker", "[optional] The name of a marker to use as the loop end point."
+ In = "const char*", "i_StateVar", "[optional] The name of a variable to use for storing state associated with this start sound step."
+ In = "char const*", "i_VarInit", "[optional] A list of variable names, mins, and maxes to use for randomizing the sound instance state."
+ In = "const char*", "i_Labels", "[optional] A comma delimited list of labels to assign to the sound."
+ In = "U32", "i_Streaming", "If nonzero, the sound will be set up and started as a stream."
+ In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch."
+ In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start."
+ In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start."
+ In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound
+ with a priority strictly less than the given priority."
+ In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count."
+ In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset."
+ In = "F32", "i_VolMin", "The min volume value to randomly select for initial volume for the sound. In LinLoud."
+ In = "F32", "i_VolMax", "The max volume value to randomly select for initial volume for the sound. In LinLoud."
+ In = "F32", "i_PitchMin", "The min pitch to randomly select from for initial playback. In sT."
+ In = "F32", "i_PitchMax", "The max pitch to randomly select from for initial playback. In sT."
+ In = "F32", "i_FadeInTime", "The time to fade the sound in over. Interpolation is linear in loudness."
+ In = "U8", "i_EvictionType", "The basis for deciding what sound will get kicked out if a limit is hit when trying to play this sound. See $MILES_START_STEP_EVICTION_TYPE."
+ In = "U8", "i_SelectType", "The method to use for selecting the sound to play from the sound name list. See $MILES_START_SOUND_SELECTION_TYPE."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "Adds an event that can start a sound. If the sound names list contains multiple entries, one will be selected
+ randomly based on the given weights and the selection type. Weights are effectively ratios for likelihood. A sound with 100 weight will be twice as likely
+ as a sound with 50 weight. Some times you may want to have an event that only *might* play a sound. To do this, add a empty sound name
+ with an associated weight.
+ "
+ }
+*/
+DXDEC
+S32
+AILCALL
+AIL_add_start_sound_event_step(
+ HMSSEVENTCONSTRUCT i_Event,
+ const char* i_SoundNames,
+ const char* i_PresetName,
+ U8 i_PresetIsDynamic,
+ const char* i_EventName,
+ const char* i_StartMarker, const char* i_EndMarker,
+ char const* i_StateVar, char const* i_VarInit,
+ const char* i_Labels, U32 i_Streaming, U8 i_CanLoad,
+ U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount,
+ const char* i_StartOffset,
+ F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax,
+ F32 i_FadeInTime,
+ U8 i_EvictionType,
+ U8 i_SelectType
+ );
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_cache_sounds_event_step", "Adds a step to an event to load a list of sounds in to memory for play."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "bankName", "The bank filename containing all of the sounds."
+ In = "const char*", "i_Sounds", "A list of colon separated sounds to load from the bank file."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "In general events are not allowed to hit the disk in order to prevent unexpected hitching during
+ gameplay. In order to facilitate that, sounds need to be preloaded by this event. Each cache step can only
+ load sounds from a single bank file, so for multiple bank files, multiple steps will be needed.
+
+ In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to
+ be called with the same parameters.
+
+ If you are using MilesEvent, the data is refcounted so the sound will not be freed until all
+ samples using it complete."
+ }
+*/
+DXDEC
+S32
+AILCALL
+AIL_add_cache_sounds_event_step(
+ HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds);
+
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_uncache_sounds_event_step", "Adds a step to an event to free a list of sounds previously loaded in to memory for play."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "bankName", "The bank filename containing all of the sounds."
+ In = "const char*", "i_Sounds", "A list of colon separated sounds from the bank file to uncache."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "This event released sounds loaded via AIL_add_cache_sounds_event_step()"
+ }
+*/
+DXDEC
+S32
+AILCALL
+AIL_add_uncache_sounds_event_step(
+ HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds);
+
+
+EXPTYPEBEGIN typedef S32 MILES_CONTROL_STEP_TYPE;
+#define MILES_CONTROL_STEP_STOP 3
+#define MILES_CONTROL_STEP_STOP_NO_EVENTS 4
+#define MILES_CONTROL_STEP_PASS 0
+#define MILES_CONTROL_STEP_PAUSE 1
+#define MILES_CONTROL_STEP_RESUME 2
+#define MILES_CONTROL_STEP_STOP_FADE 5
+
+EXPTYPEEND
+/*
+ Determines how the playhead is adjusted during a $AIL_add_control_sounds_event_step.
+
+ $:MILES_CONTROL_STEP_STOP Stop the affected sounds.
+ $:MILES_CONTROL_STEP_PASS Do not change the playhead.
+ $:MILES_CONTROL_STEP_PAUSE Pause the affected sounds.
+ $:MILES_CONTROL_STEP_RESUME Resume the affected sounds.
+ $:MILES_CONTROL_STEP_STOP_NO_EVENTS Stop the affected sounds, and prevent their completion events from playing.
+ $:MILES_CONTROL_STEP_STOP_FADE Stop the sound after fading the sound out linearly in loudness.
+*/
+
+#define MILES_CONTROL_STEP_IGNORELOOP 255
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_control_sounds_event_step", "Adds a step to an event to control sample playback by label."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "i_Labels", "[optional] A comma seperated list of labels to control."
+ In = "const char*", "i_MarkerStart", "[optional] If exists, sets the loop start to the marker's offset."
+ In = "const char*", "i_MarkerEnd", "[optional] If exists, sets the loop end to the marker's offset."
+ In = "const char*", "i_Position", "[optional] If exists, sets the current playback position to the marker's offset."
+ In = "const char*", "i_PresetName", "[optional] The name of the preset to apply, of the form Bank/PresetList/PresetName."
+ In = "U8", "i_PresetApplyType", "If nonzero, the preset is applied dynamically(the variables are polled every frame)."
+ In = "U8", "i_LoopCount", "If the loop count is not to be affected, pass MILES_CONTROL_STEP_IGNORELOOP. Otherwise, the sample's loop count will be set to this value."
+ In = "U8", "i_Type", "The control type requested. See $MILES_CONTROL_STEP_TYPE."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "Controls playback of current instances. The sounds are matched either on name or label. If
+ i_Labels is null, all sounds will be controlled.
+ "
+ }
+*/
+DXDEC
+S32
+AILCALL
+AIL_add_control_sounds_event_step(
+ HMSSEVENTCONSTRUCT i_Event,
+ const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position,
+ const char* i_PresetName,
+ U8 i_PresetApplyType,
+ F32 i_FadeOutTime,
+ U8 i_LoopCount, U8 i_Type);
+
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_apply_environment_event_step", "Adds a step to an event to apply an environment preset."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "i_EnvName", "The name of the environment preset to apply, of the form EnvList/EnvName."
+ In = "U8", "i_IsDynamic", "If nonzero, any variables in the environment are polled every frame."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "Applies the specified environment preset to the current HDIGDRIVER."
+ }
+*/
+DXDEC S32 AILCALL AIL_add_apply_environment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_EnvName, U8 i_IsDynamic);
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_comment_event_step", "Adds a step that represents a comment to the user of the editing tool."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "i_Comment", "A string to display in the editing tool."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "This event is ignored in the runtime, and only exist for editing convenience."
+ }
+*/
+DXDEC S32 AILCALL AIL_add_comment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_Comment);
+
+EXPTYPEBEGIN typedef S32 MILES_RAMP_TYPE;
+#define MILES_RAMPTYPE_VOLUME 0
+#define MILES_RAMPTYPE_WET 1
+#define MILES_RAMPTYPE_LOWPASS 2
+#define MILES_RAMPTYPE_RATE 3
+EXPTYPEEND
+/*
+ The different values the ramps can affect.
+
+ $:MILES_RAMPTYPE_VOLUME The ramp will adjust the sample's volume, and will interpolate in loudness level. Target is in dB.
+ $:MILES_RAMPTYPE_WET The ramp will affect the sample's reverb wet level, and will interpolate in loudness. Target is in dB.
+ $:MILES_RAMPTYPE_LOWPASS The ramp will affect the sample's low pass cutoff. Interpolation and target are in Hz.
+ $:MILES_RAMPTYPE_RATE The ramp will affect the sample's playback rate. Interpolation and target are in sT.
+*/
+
+EXPTYPEBEGIN typedef S32 MILES_INTERP_TYPE;
+#define MILES_INTERP_LINEAR 0
+#define MILES_INTERP_EXP 1
+#define MILES_INTERP_SCURVE 2
+EXPTYPEEND
+/*
+ The different ways the interpolation occurs for a ramp.
+
+ $:MILES_INTERP_LINEAR The ramp will lerp between the current value and the target.
+ $:MILES_INTERP_EXP The ramp will move toward the target slowly at first, then faster as it closes on its total time.
+ $:MILES_INTERP_SCURVE The ramp will quickly move to about halfway, then slowly move, then move more quickly as it ends.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_ramp_event_step(
+ HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Labels,
+ F32 i_Time, char const* i_Target, U8 i_Type, U8 i_ApplyToNew, U8 i_InterpolationType);
+/*
+ Add an event step that updates or creates a new ramp in the runtime.
+
+ $:i_Event The event to add the step to.
+ $:i_Name The name of the ramp. If this name already exists, the ramp will shift its target to the new value.
+ $:i_Labels The label query determining the sounds the ramp will affect.
+ $:i_Time The length the time in seconds the ramp will take to reach its target.
+ $:i_Target The target value, or a variable expression representing the target value. The target's type is
+ dependent on i_Type.
+ $:i_Type One of the $MILES_RAMP_TYPE values.
+ $:i_ApplyToNew If 1, the ramp will affect sounds that start after the ramp is created. If not, it will only affect sounds that
+ are playing when the ramp is created. This value can not be changed once the ramp has been created.
+ $:i_InterpolationType The method the ramp will affect the target values. One of $MILES_INTERP_TYPE values.
+
+ Ramps are means of interpolating aspects of samples. They are removed from the system if they are targeted to
+ a value for their type that is a non-op - meaning 0 dB, 0 sT, or >24000 Hz.
+
+ Ramps use the current value as the start point for the interpolation. They stay at the target point,
+ so you can use the same ramp name to adjust a sound's volume down, and later ramp it back up.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event,
+ char const* i_Name, S32 i_SoundCount, F32 const* i_InMin, F32 const* i_InMax,
+ F32 const* i_OutMin, F32 const* i_OutMax, F32 const* i_MinP, F32 const* i_MaxP);
+/*
+ Defines a named blend function to be referenced by a blended sound later.
+
+ $:i_Event The event to add the step to.
+ $:i_Name The name of the blend. This is the name that will be
+ referenced by the state variable in start sound, as well as the variable name
+ to set by the game to update the blend for an instance.
+ $:i_SoundCount The number of sounds this blend will affect. Max 10.
+ $:i_InMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade in.
+ $:i_InMax Array of length i_SoundCount representing the value of the blend variable the sound will reach full volume.
+ $:i_OutMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade out.
+ $:i_OutMax Array of length i_SoundCount representing the value of the blend variable the sound will cease to be audible.
+ $:i_MinP Array of length i_SoundCount representing the pitch of the sound when it starts to fade in.
+ $:i_MaxP Array of length i_SoundCount representing the pitch of the sound when it has completed fading out.
+
+ This step only sets up the lookup for when a blended sound is actually started. When a blended sound plays, every frame it
+ polls its state variable, then searches for a blend of the same name. If it finds both, then it uses its index in
+ the start sounds list to find its relevant values from the blended sound definition.
+
+ Once it has the correct values, it uses them to affect the sample as stated in the parameter docs above.
+*/
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_sound_limit_event_step", "Adds a step that defines the maximum number of playing sounds per label."
+
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "i_SoundLimits", "A string of the form `"label count:anotherlabel count`"."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "Defines limits for instances of sounds on a per label basis. Sounds with multiple labels
+ must fit under the limits for all of their labels. By default sounds are not limited other than the
+ Miles max sample count."
+ }
+*/
+DXDEC S32 AILCALL
+AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits);
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_add_persist_preset_event_step", "Adds a preset that applies to current sound instances, and continues to be applied to new sounds as they are started."
+ In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to."
+ In = "const char*", "i_PresetName", "The name of the preset, of the form PresetList/PresetName. See discussion."
+ In = "const char*", "i_PersistName", "The name of this persisted preset, for future removal."
+ In = "const char*", "i_Labels", "The labels to apply this preset to."
+ In = "U8", "i_IsDynamic", "If nonzero, the preset polls its variables every frame."
+
+ ReturnType = "S32", "Returns 1 on success."
+
+ Discussion = "Defines a preset by name that remains in the system, testing against all started sounds for label match. If a
+ match occurs, then the preset is applied to the new sound, before the preset specified in the startsound step itself.
+
+ In order to remove a persisted preset, refer to it by name, but leave all other parameters null.
+
+ Example:
+
+ // Persist a preset for players.
+ AIL_add_persist_preset_event_step(hEvent, , `"Bank/PlayerEffects/Underwater`", `"Underwater`", `"player`");
+
+ // Remove the above preset.
+ AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);"
+ }
+*/
+DXDEC S32 AILCALL
+AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName,
+ const char* i_Labels, U8 i_IsDynamic
+ );
+
+DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * name, U8 const** event);
+/*
+ Return the event data for an event, by name.
+
+ $:bank Soundbank containing the event.
+ $:name Name of the event to retrieve.
+ $:event Returns an output pointer to the event contents. Note that this string isn't null terminated, and
+ thus shouldn't be checked via strlen, etc.
+ $:return Returns 0 on fail.
+
+ Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event,
+ rather than inspected directly.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event);
+/*
+ Clears all persistent state in the runtime.
+
+ $:i_Event The event to add the step to.
+
+ This removes all state that can stick around after an event in done executing. Ramps, Blends, Persisted
+ Preset, etc.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_exec_event_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_EventName);
+/*
+ Adds a step to run another named event.
+
+ $:i_Event The event to add the step to.
+ $:i_EventName The name of the event, of the form "Bank/Path/To/Event".
+
+ When this step is encountered, the event is enqueued, so it will be executed the following frame (currently). It has the same parent
+ event mechanics as a completion event, so the QueuedId for a sound started by it will be for the event
+ that fired this step.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName);
+/*
+ Adds a step to set the currently active limit.
+
+ $:i_Event The event to add the step to.
+ $:i_EventName The name of the limit, as defined by a set_limits event.
+
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO);
+/*
+ Adds a step to define a variable that oscillates over time.
+
+ $:i_Event The event to add the step to.
+ $:i_Name The nane of the variable to oscillate.
+ $:i_Base The value to oscillate around, or a variable name to use as the base.
+ $:i_Amp The maximum value to reach, or a variable name to use as the amplitude.
+ $:i_Freq The rate at which the oscillation occurs, or a variable name to use as the rate. Rate should not exceed game tick rate / 2.
+ $:i_Invert Whether the waveform should be inverted.
+ $:i_Polarity Bipolar (1) or Unipolar (0) - whether the waveform goes around the base or only above it.
+ $:i_Waveform Sine wave (0), Triangle (1), Saw (2), or Square(3)
+ $:i_DutyCycle Only valid for square, determines what percent of the wave is "on". (0-100)
+ $:i_IsLFO If zero, Base is the default value to assign the variable when the settings are applied, and the rest of the parameters are ignored.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]);
+/*
+ Adds a step to set and move a variable over time on a curve.
+
+ $:i_Event The event to add the step to.
+ $:i_Name The variable to move.
+ $:i_Times The midpoint and final times for the curves
+ $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3)
+ $:i_Values The initial, midpoint, and final values for the variable.
+
+ The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done.
+
+ If an existing move var exists when the new one is added, the old one is replaced.
+*/
+
+enum EVENT_STEPTYPE
+{
+ EVENT_STEPTYPE_STARTSOUND = 1,
+ EVENT_STEPTYPE_CONTROLSOUNDS,
+ EVENT_STEPTYPE_APPLYENV,
+ EVENT_STEPTYPE_COMMENT,
+ EVENT_STEPTYPE_CACHESOUNDS,
+ EVENT_STEPTYPE_PURGESOUNDS,
+ EVENT_STEPTYPE_SETLIMITS,
+ EVENT_STEPTYPE_PERSIST,
+ EVENT_STEPTYPE_VERSION,
+ EVENT_STEPTYPE_RAMP,
+ EVENT_STEPTYPE_SETBLEND,
+ EVENT_STEPTYPE_CLEARSTATE,
+ EVENT_STEPTYPE_EXECEVENT,
+ EVENT_STEPTYPE_ENABLELIMIT,
+ EVENT_STEPTYPE_SETLFO,
+ EVENT_STEPTYPE_MOVEVAR
+};
+
+//! Represents an immutable string that is not null terminated, and shouldn't be deleted.
+struct _MSSSTRINGC
+{
+ const char* str;
+ S32 len;
+};
+typedef struct _MSSSTRINGC MSSSTRINGC;
+
+
+/*!
+ Represents a single step that needs to be executed for an event.
+
+ All of the members in the structures share the same definition as
+ their counterpart params in the functions that added them during
+ event construction.
+*/
+struct EVENT_STEP_INFO
+{
+ //! type controls which struct in the union is accessed.
+ enum EVENT_STEPTYPE type;
+ union
+ {
+ struct
+ {
+ MSSSTRINGC soundname;
+ MSSSTRINGC presetname;
+ MSSSTRINGC eventname;
+ MSSSTRINGC labels;
+ MSSSTRINGC markerstart;
+ MSSSTRINGC markerend;
+ MSSSTRINGC startoffset;
+ MSSSTRINGC statevar;
+ MSSSTRINGC varinit;
+ U32 stream;
+ F32 volmin,volmax,pitchmin,pitchmax;
+ F32 fadeintime;
+ U16 delaymin;
+ U16 delaymax;
+ U8 canload;
+ U8 priority;
+ U8 loopcount;
+ U8 evictiontype;
+ U8 selecttype;
+ U8 presetisdynamic;
+ } start;
+
+ struct
+ {
+ MSSSTRINGC labels;
+ MSSSTRINGC markerstart;
+ MSSSTRINGC markerend;
+ MSSSTRINGC position;
+ MSSSTRINGC presetname;
+ F32 fadeouttime;
+ U8 presetapplytype;
+ U8 loopcount;
+ U8 type;
+ } control;
+
+ struct
+ {
+ MSSSTRINGC envname;
+ U8 isdynamic;
+ } env;
+
+ struct
+ {
+ MSSSTRINGC comment;
+ } comment;
+
+ struct
+ {
+ MSSSTRINGC lib;
+ const char** namelist;
+ S32 namecount;
+ } load;
+
+ struct
+ {
+ MSSSTRINGC limits;
+ MSSSTRINGC name;
+ } limits;
+
+ struct
+ {
+ MSSSTRINGC name;
+ MSSSTRINGC presetname;
+ MSSSTRINGC labels;
+ U8 isdynamic;
+ } persist;
+
+ struct
+ {
+ MSSSTRINGC name;
+ MSSSTRINGC labels;
+ MSSSTRINGC target;
+ F32 time;
+ U8 type;
+ U8 apply_to_new;
+ U8 interpolate_type;
+ } ramp;
+
+ struct
+ {
+ MSSSTRINGC name;
+ F32 inmin[10];
+ F32 inmax[10];
+ F32 outmin[10];
+ F32 outmax[10];
+ F32 minp[10];
+ F32 maxp[10];
+ U8 count;
+ } blend;
+
+ struct
+ {
+ MSSSTRINGC eventname;
+ } exec;
+
+ struct
+ {
+ MSSSTRINGC limitname;
+ } enablelimit;
+
+ struct
+ {
+ MSSSTRINGC name;
+ MSSSTRINGC base;
+ MSSSTRINGC amplitude;
+ MSSSTRINGC freq;
+ S32 invert;
+ S32 polarity;
+ S32 waveform;
+ S32 dutycycle;
+ S32 islfo;
+ } setlfo;
+
+ struct
+ {
+ MSSSTRINGC name;
+ F32 time[2];
+ S32 interpolate_type[2];
+ F32 value[3];
+ } movevar;
+ };
+};
+
+/*!
+ function
+ {
+ ExcludeOn = 1
+
+ Name = "AIL_next_event_step", "Retrieves the next step in the event buffer, parsing it in to a provided buffer."
+
+ In = "const U8*", "i_EventString", "The event returned by $AIL_close_event, or a previous call to $AIL_next_event_step"
+ Out = "const EVENT_STEP_INFO*", "o_Step", "A pointer to the step struct will be stored here."
+ In = "void*", "i_Buffer", "A working buffer for the function to use for parsing."
+ In = "S32", "i_BufferSize", "The size in bytes of the working buffer."
+
+ ReturnType = "U8 char*", "Returns 0 on fail or when the event string has been exhausted of steps. Otherwise, returns
+ the string location of the next event step in the buffer."
+
+ Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be
+ used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the
+ next step. In this manner it can be used in a loop:
+
+ // Create an event to stop all sounds.
+ HMSSEVENTCONSTRUCT hEvent = AIL_create_event();
+ AIL_add_control_sound_event_step(hEvent, 0, 0, 0, 0, 0, 0, 255, 3);
+ char* pEvent = AIL_close_event(hEvent);
+
+ char EventBuffer[4096];
+ EVENT_STEP_INFO* pStep = 0;
+ char* pCurrentStep = pEvent;
+
+ while (pCurrentStep)
+ {
+ pStep = 0;
+ pCurrentStep = AIL_next_event_step(pCurrentStep, &pStep, EventBuffer, 4096);
+ if (pStep == 0)
+ {
+ // Error, or an empty event. If $AIL_last_error is an empty string, then it was an empty event.
+ break;
+ }
+
+ // Handle event step.
+ switch (pStep->type)
+ {
+ default: break;
+ }
+ }
+
+ AIL_mem_free_lock(pEvent);
+ "
+ }
+*/
+DXDEC const U8* AILCALL AIL_next_event_step(const U8* i_EventString, struct EVENT_STEP_INFO** o_Step, void* i_Buffer, S32 i_BufferSize);
+
+
+// Old style names.
+#define AIL_find_event MilesFindEvent
+#define AIL_clear_event_queue MilesClearEventQueue
+#define AIL_register_random MilesRegisterRand
+#define AIL_enumerate_sound_instances MilesEnumerateSoundInstances
+#define AIL_enumerate_preset_persists MilesEnumeratePresetPersists
+#define AIL_enqueue_event MilesEnqueueEvent
+#define AIL_enqueue_event_system MilesEnqueueEventContext
+#define AIL_enqueue_event_by_name MilesEnqueueEventByName
+#define AIL_begin_event_queue_processing MilesBeginEventQueueProcessing
+#define AIL_complete_event_queue_processing MilesCompleteEventQueueProcessing
+#define AIL_startup_event_system MilesStartupEventSystem
+#define AIL_shutdown_event_system MilesShutdownEventSystem
+#define AIL_add_soundbank MilesAddSoundBank
+#define AIL_release_soundbank MilesReleaseSoundBank
+#define AIL_set_sound_label_limits MilesSetSoundLabelLimits
+#define AIL_text_dump_event_system MilesTextDumpEventSystem
+#define AIL_event_system_state MilesGetEventSystemState
+#define AIL_get_event_length MilesGetEventLength
+#define AIL_stop_sound_instances MilesStopSoundInstances
+#define AIL_pause_sound_instances MilesPauseSoundInstances
+#define AIL_resume_sound_instances MilesResumeSoundInstances
+#define AIL_start_sound_instance MilesStartSoundInstance
+#define AIL_set_event_error_callback MilesSetEventErrorCallback
+#define AIL_set_event_bank_functions MilesSetBankFunctions
+#define AIL_get_event_bank_functions MilesGetBankFunctions
+
+#define AIL_set_variable_int MilesSetVarI
+#define AIL_set_variable_float MilesSetVarF
+#define AIL_variable_int MilesGetVarI
+#define AIL_variable_float MilesGetVarF
+
+#define AIL_set_sound_start_offset MilesSetSoundStartOffset
+#define AIL_requeue_failed_asyncs MilesRequeueAsyncs
+#define AIL_add_event_system MilesAddEventSystem
+
+#define AIL_audition_local_host MilesAuditionLocalHost
+#define AIL_audition_connect MilesAuditionConnect
+#define AIL_audition_startup MilesAuditionStartup
+#define AIL_audition_shutdown MilesAuditionShutdown
+EXPGROUP(Miles High Level Event System)
+
+EXPTYPE typedef void* HEVENTSYSTEM;
+/*
+ The type used to distinguish between running event systems.
+
+ Only used if multiple event systems are running. See the eventmultiple example.
+*/
+
+DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len);
+/*
+ Initializes the Miles Event system and associates it with an open digital driver.
+
+ $:dig The digital sound driver that this event system should use.
+ $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K).
+ $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations.
+ Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data.
+ Use 0 to let Miles to allocate this buffer itself.
+ $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will
+ allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K).
+ $:return Returns 0 on startup failure.
+
+ This function starts up the Miles Event System, which is used to trigger events throughout your game.
+ You call it after $AIL_open_digital_driver.
+*/
+
+DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig);
+/*
+ Creates an additional event system attached to a different driver, in the event that you need to trigger events
+ tied to different sound devices.
+
+ $:dig The digital sound driver to attach the new event system to.
+ $:return A handle to the event system to use in various high level functions.
+
+ Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called.
+
+ To enqueue events to the new system, use $AIL_enqueue_event_system.
+
+ To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances.
+
+ To access or set global variables for the new system, pass the $HEVENTSYSTEM as the context in the variable access functions.
+
+ See also the <i>eventmultiple.cpp</i> example program.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void );
+/*
+ Shuts down the Miles event system.
+
+ This function will closes everything in the event system - it ignores reference counts. It will free
+ all event memory, sound banks, and samples used by the system.
+*/
+
+DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char const* name);
+/*
+ Open and add a sound bank for use with the event system.
+
+ $:filename Filename of the bank to load.
+ $:name The name of the soundbank to load - this is only used for auditioning.
+ $:return The handle to the newly loaded soundbank (zero on failure).
+
+ This function opens the sound bank and makes it available to the event system. The filename
+ is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio.
+ You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp',
+ and while using the name 'gamebank' for authoring and auditioning.
+
+ Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds
+ is played, or a sound requiring it plays.
+
+ This function will access the disc, so you will usually call it at level load time.
+
+ If you are using the Auditioner, $AIL_audition_startup and $AIL_audition_connect must be called prior
+ to this function.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank);
+/*
+ Releases a sound bank from the event system.
+
+ $:bank The bank to close.
+ $:return Returns non-zero for success (zero on failure).
+
+ This function closes a given soundbank. Any data references in the event system need to be removed beforehand - with
+ $AIL_enqueue_event_by_name usage this should only be pending sounds with completion events.
+
+ Any other data references still existing (queued events, persisted presets, etc) will report errors when used,
+ but will not crash.
+
+ Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed
+ via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the
+ sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work.
+
+ This is different from Miles 8, which would maintain a reference count for all data.
+*/
+
+DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name);
+/*
+ (EXPAPI removed to prevent release in docs)
+
+ Searches for an event by name in the event system.
+
+ $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case).
+ $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name".
+ $:return A pointer to the event contents (or 0, if the event isn't found).
+
+ This function is normally used as the event parameter for $AIL_enqueue_event. It
+ searches one or all open soundbanks for a particular event name.
+
+ <b>This is deprecated</b>. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with
+ MILESEVENT_ENQUEUE_BY_NAME.
+
+ Events that are not enqueued by name can not be tracked by the Auditioner.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID );
+/*
+ Enqueue an event to a specific system. Used only if you have multiple event systems running.
+
+ $:system The event system to attach the event to.
+ $:return See $AIL_enqueue_event for return description.
+
+ For full information on the parameters, see $AIL_enqueue_event.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name);
+/*
+ Enqueue an event by name.
+
+ $:name The full name of the event, eg "soundbank/path/to/event".
+ $:return See $AIL_enqueue_event for return description.
+
+ This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner.
+
+ For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent
+ to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name)
+
+ For introduction to the auditioning system, see $integrating_events.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start();
+/*
+ Start assembling a packet to use for enqueuing an event.
+
+ $:return A token used for passing to functions that add data to the event.
+
+ This is used to pass more data to an event that will be executed. For instance, if
+ an event is going to spatialize a sound, but there's no need to move the sound over the course of
+ its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a
+ sound is started it will use that for its initial position, and there is no need to do any
+ game object <-> event id tracking.
+
+ ${
+ // Start the enqueue.
+ S32 enqueue_token = AIL_enqueue_event_start();
+
+ // Tell all sounds started by the event to position at (100, 100, 100)
+ AIL_enqueue_event_position(&enqueue_token, 100, 100, 100);
+
+ // Complete the token and enqueue the event to the command buffer.
+ AIL_enqueue_event_end_named(enqueue_token);
+ $}
+
+ The enqueue process is still completely thread safe. No locks are used, however only 8
+ enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start
+ will yield the thread until a slot is open.
+
+ The ONLY time that should happen is if events enqueues are started but never ended:
+
+ ${
+ // Start the enqueue
+ S32 enqueue_token = AIL_enqueue_event_start();
+
+ // Try to get the game position
+ Vector3* position = GetPositionOfSomething(my_game_object);
+ if (position == 0)
+ return; // OOPS! enqueue_token was leaked here, never to be reclaimed.
+
+ $}
+
+ Each event has a limit to the amount of data that can be attached to it. Currently this
+ amount is 512 bytes - which should cover all use cases. If any enqueue functions return 0,
+ then this amount has been reached. The ErrorHandler will be called as well, with $AIL_last_error
+ reporting that the enqueue buffer was filled.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_enqueue_event_cancel(S32 token);
+/*
+ Clears a enqueue token without passing it to the command buffer
+
+ $:token A token created with $AIL_enqueue_event_start.
+
+ Used to handle the case where you decided to not actually enqueue the event you've assembled.
+
+ In general it's better to handle anything that can fail before actually starting
+ to create the enqueue.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_position(S32* token, F32 x, F32 y, F32 z);
+/*
+ Pass an initial position to an event to use for sound spatialization.
+
+ $:token A token created with $AIL_enqueue_event_start.
+ $:return 0 if the enqueue buffer is full
+
+ If the event queued starts a sound, the sound's position will be set to the given coordinates.
+
+ Setting the position of a sample automatically enables 3D spatialization.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_velocity(S32* token, F32 vx, F32 vy, F32 vz, F32 mag);
+/*
+ Pass an initial velocity to an event to use for sound spatialization.
+
+ $:token A token created with $AIL_enqueue_event_start.
+ $:return 0 if the enqueue buffer is full
+
+ If the event queued starts a sound, the sound's velocity will be set to the given vector.
+
+ Setting the velocity of a sample does NOT automatically enable 3D spatialization.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, S32 user_buffer_len, S32 user_buffer_is_ptr);
+/*
+ Attaches a user buffer to the event.
+
+ $:token A token created with $AIL_enqueue_event_start.
+ $:user_buffer Pointer to a user buffer to pass with the event. If user_buffer_is_ptr is 1, the pointer is copied
+ directly and user_buffer_len is ignored.
+ $:user_buffer_len The size of the user_buffer to attach to the event.
+ $:user_buffer_is_ptr If 1, the pointer is copied and user_buffer_len is ignored.
+ $:return 0 if the enqueue buffer is full
+
+ User buffers are helpful for bridging the gap between game objects and sound objects.
+
+ There are two use cases available in this function
+
+ $* <b>Pointer</b> If user_buffer_is_ptr is 1, then the value passed to user_buffer is copied directly as the
+ user buffer contents, and then exposed during sound enumeration. This is equivalent in spirit to
+ the void* value that often accompanies callbacks. In this case, user_buffer_len is ignored, as
+ user_buffer is never dereferenced.
+ $* <b>Buffer</b> If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and
+ carried with the event. During sound enumeration this buffer is made available, and you never have to
+ worry about memory management.
+ $-
+
+ Pointer-
+ ${
+ struct useful_data
+ {
+ S32 game_stat;
+ S32 needed_info;
+ };
+
+ useful_data* data = (useful_data*)malloc(sizeof(useful_data));
+ data->game_stat = 1;
+ data->needed_info = 2;
+
+ // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound
+ // completes and we're done using it in the enumeration loop.
+ S32 ptr_token = AIL_enqueue_event_start();
+ AIL_enqueue_event_buffer(&ptr_token, data, 0, 1);
+ AIL_enqueue_event_end_named(ptr_token, "mybank/myevent");
+ $}
+
+ Buffer-
+ ${
+ struct useful_data
+ {
+ S32 game_stat;
+ S32 needed_info;
+ };
+
+ useful_data data;
+ data.game_stat = 1;
+ data.needed_info = 2;
+
+ // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use
+ // a stack variable like this
+ S32 buf_token = AIL_enqueue_event_start();
+ AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0);
+ AIL_enqueue_event_end_named(buf_token, "mybank/myevent");
+ $}
+
+ As noted in $AIL_enqueue_event_start(), there's only 512 bytes available to an enqueue, so that
+ places an upper limit on the amount of data you can pass along. If the data is huge, then you
+ should use user_buffer_is_ptr.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* name, F32 value);
+/*
+ Attaches a variable's value to the event enqueue.
+
+ $:token A token created with $AIL_enqueue_event_start
+ $:name The variable name to set.
+ $:value The value of the variable to set.
+ $:return 0 if the enqueue buffer is full
+
+ When a sound starts, the given variable will be set to the given value prior to any possible
+ references being used by presets.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID);
+/*
+ Limits the effects of the event to sounds started by the given ID.
+
+ $:token A token created with $AIL_enqueue_event_start
+ $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an
+ event, it will apply to all sounds started by the event, and any events queued by that event.
+ $:return 0 if the enqueue buffer is full
+
+ IDs are assigned to events and sounds - for events, it is returned via the $AIL_enqueue_event_end_named function
+ (or any other enqueue function). For sounds, you can access the assigned id during the enumeration process.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_context(S32* token, HEVENTSYSTEM system);
+/*
+ Causes the event to run on a separate running event system.
+
+ $:token A token created with $AIL_enqueue_event_start
+ $:system An event system $AIL_add_event_system
+ $:return 0 if the enqueue buffer is full
+
+ If you are running multiple event systems, this is required to get events
+ to queue on the additional event systems.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection);
+/*
+ Passes in a selection value for start sound events to use for picking sounds.
+
+ $:token A token created with $AIL_enqueue_event_start.
+ $:selection The value to use for selecting the sound to play.
+ $:return 0 if the enqueue buffer is full
+
+ The selection index is used to programatically select a sound from the
+ loaded banks. The index passed in replaces any numeric value at the end
+ of the sound name existing in any start sound event step. For example, if
+ a start sound event plays "mybank/sound1", and the event is queued with
+ a selection, then the selection will replace the "1" with the number passed in:
+
+ ${
+ // Enqueue with a selection of 5
+ S32 token = AIL_enqueue_event_start();
+ AIL_enqueue_event_selection(&token, 50;
+ AIL_enqueue_event_end_named(token, "mybank/myevent");
+ $}
+
+ Assuming mybank/myevent starts sound "mybank/sound1", the sound
+ that will actually be played will be "mybank/sound5". If the sound does
+ not exist, it is treated the same as if any other sound was not found.
+
+ The selection process replaces ALL trailing numbers with a representation
+ of the selection index using the same number of digits, meaning in the above
+ example, "mybank/sound123" would have become "mybank/sound005".
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* event_name);
+/*
+ Completes assembling the event and queues it to the command buffer to be run during next tick.
+
+ $:token A token created with $AIL_enqueue_event_start.
+ $:event_name The name of the event to run.
+ $:return A unique ID for the event that can be used to identify sounds started by this event,
+ or for filtering future events to the sounds started by this event.
+
+ This function takes all of the data accumulated via the various enqueue functions and assembles
+ it in to the command buffer to be run during the next $AIL_begin_event_queue_processing.
+
+ As with all of the enqueue functions it is completely thread-safe.
+
+ Upon completion of this function, the enqueue slot is release and available for another
+ $AIL_enqueue_event_start.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID );
+/*
+ Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function.
+
+ $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue.
+ If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing.
+ If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags.
+ $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance.
+ This data is then accessible later, when enumerating the instances.
+ $:user_buffer_len Size of the buffer pointed to by user_buffer.
+ $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0).
+ $:apply_to_ID Optional value that is used for events that affect sound instances. Normally,
+ when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if
+ you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you
+ execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event.
+ InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances.
+ $:return On success, returns QueuedID value that is unique to this queued event for the rest of this
+ program run (you can use this ID to uniquely identify sounds triggered from this event).
+
+ This function enqueues an event to be triggered - this is how you begin execution of an event. First, you
+ queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to
+ execute an event.
+
+ This function is very lightweight. It does nothing more than post the event and data to a
+ command buffer that gets executed via $AIL_begin_event_queue_processing.
+
+ The user_buffer parameter can be used in different ways. If no flags are passed in, then
+ Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with
+ the queued sound - you can then free the user_buffer data completely! This lets Miles keep track
+ of all your sound related memory directly and is the normal way to use the system (it is very
+ convenient once you get used to it).
+
+ If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will
+ simply be associated with each sound that this event may start. In this case, user_buffer_len
+ is ignored.
+
+ In both cases, when you later enumerate the sound instances, you can access your sound data
+ with the $(MILESEVENTSOUNDINFO::UserBuffer) field.
+
+ You can call this function from any number threads - it's designed to be called from anywhere in your game.
+
+ If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done
+ by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and
+ passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events.
+*/
+
+EXPTYPEBEGIN typedef S32 MILESEVENTENQUEUEFLAGS;
+#define MILESEVENT_ENQUEUE_BUFFER_PTR 0x1
+#define MILESEVENT_ENQUEUE_FREE_EVENT 0x2
+#define MILESEVENT_ENQUEUE_BY_NAME 0x4
+// 0x8 can't be used, internal.
+EXPTYPEEND
+/*
+ The available flags to pass in $AIL_enqueue_event or $AIL_enqueue_event_system.
+
+ $:MILESEVENT_ENQUEUE_BUFFER_PTR The user_buffer parameter passed in should not be duplicated, and instead
+ should just tranparently pass the pointer on to the event, so that the $(MILESEVENTSOUNDINFO::UserBuffer)
+ during sound iteration is just the same pointer. user_buffer_len is ignored in this case.
+
+ $:MILESEVENT_ENQUEUE_FREE_EVENT The ownership of the memory for the event is passed to the event system. If this
+ is present, once the event completes $AIL_mem_free_lock will be called on the raw pointer passed in to $AIL_enqueue_event or
+ $AIL_enqueue_event_system. This is rarely used.
+
+ $:MILESEVENT_ENQUEUE_BY_NAME The event passed in is actually a string. The event system will then look for this event
+ in the loaded sound banks during queue processing.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void );
+/*
+ Begin execution of all of the enqueued events.
+
+ $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events
+ (out of memory, bank file not found, bad data, etc). You can get the specific error by
+ calling $AIL_last_error.
+
+ This function executes all the events currently in the queue. This is where all major
+ processing takes place in the event system.
+
+ Once you execute this functions, then sound instances will be in one of three states:
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were
+ created by events that had a "Start Sound Step". Note that these instances aren't audible yet,
+ so that you have a chance to modify game driven properties (like the 3D position)
+ on the sound before Miles begins to play it.
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously
+ started and are continuing to play (you might update the 3D position for these, for example).
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing
+ since the last this frame (you might use this status to free any game related memory, for example).
+
+ You will normally enumerate the active sound instances in-between calls to $AIL_begin_event_queue_processing
+ and $AIL_complete_event_queue_processing with $AIL_enumerate_sound_instances.
+
+ $AIL_complete_event_queue_processing must be called after this function to commit
+ all the changes.
+
+ Example usage:
+${
+ // enqueue an event
+ $AIL_enqueue_event( EventThatStartsSounds, game_data_ptr, 0, MILESEVENT_ENQUEUE_BUFFER_PTR, 0 );
+
+ // now process that event
+ $AIL_begin_event_queue_processing( );
+
+ // next, enumerate the pending and complete sounds for game processing
+ MILESEVENTSOUNDINFO Info;
+
+ HMSSENUM SoundEnum = MSS_FIRST;
+ while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) )
+ {
+ game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue
+
+ if ( Info.Status == MILESEVENT_SOUND_STATUS_PENDING )
+ {
+ // setup initial state
+ AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_data->z );
+ }
+ else if ( Info.Status == MILESEVENT_SOUND_STATUS_COMPLETE )
+ {
+ // Free some state we have associated with the sound now that its done.
+ game_free( game_data );
+ }
+ }
+
+ $AIL_complete_event_queue_processing( );
+ $}
+
+ Note that if any event step drastically fails, the rest of the command queue is
+ skipped, and this function returns 0! For this reason, you shouldn't assume
+ that a start sound event will always result in a completed sound later.
+
+ Therefore, you should allocate memory that you want associated with a sound instance
+ during the enumeration loop, rather than at enqueue time. Otherwise, you
+ need to detect that the sound didn't start and then free the memory (which can be complicated).
+*/
+
+// Returned by AIL_enumerate_sound_instances()
+EXPTYPE typedef struct _MILESEVENTSOUNDINFO
+{
+ U64 QueuedID;
+ U64 InstanceID;
+ U64 EventID;
+ HSAMPLE Sample;
+ HSTREAM Stream;
+ void* UserBuffer;
+ S32 UserBufferLen;
+ S32 Status;
+ U32 Flags;
+ S32 UsedDelay;
+ F32 UsedVolume;
+ F32 UsedPitch;
+ char const* UsedSound;
+ S32 HasCompletionEvent;
+} MILESEVENTSOUNDINFO;
+/*
+ Sound instance data that is associated with each active sound instance.
+
+ $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event.
+ $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound
+ was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from
+ $AIL_enqueue_event, and EventID represents the completion event.
+ $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs).
+ $:Sample The $HSAMPLE for this playing sound.
+ $:Stream The $HSTREAM for this playing sound (if it is being streamed, zero otherwise).
+ $:UserBuffer A pointer to the user data for this sound instance.
+ $:UserBufferLen The length in bytes of the user data (if known by Miles).
+ $:Status One of the $MILESEVENTSOUNDSTATUS status values.
+ $:Flags One or more of the $MILESEVENTSOUNDFLAG flags.
+ $:UsedDelay The value actually used as a result of the randomization of delay for this instance
+ $:UsedVolume The value actually used as a result of the randomization of pitch for this instance
+ $:UsedPitch The value actually used as a result of the randomization of volume for this instance
+ $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted
+ and is only valid for the until the next call in to Miles.
+ $:HasCompletionEvent Nonzero if the sound will fire an event upon completion.
+
+ This structure is returned by the $AIL_enumerate_sound_instances function. It
+ returns information about an active sound instance.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, S32 value);
+/*
+ Sets a named variable that the designer can reference in the tool.
+
+ $:context The context the variable is set for. Can be either a $HEVENTSYSTEM
+ to set a global variable for a specific system, 0 to set a global variable
+ for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances.
+ $:name The name of the variable to set.
+ $:value The value of the variable to set.
+
+ Variables are tracked per sound instance and globally, and when a variable is needed
+ by an event, it will check the relevant sound instance first, before falling back to
+ the global variable list:
+
+ ${
+ $HMSSENUM FirstSound = MSS_FIRST;
+ $MILESEVENTSOUNDINFO Info;
+
+ // Grab the first sound, whatever it is.
+ $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info);
+
+ // Set a variable on that sound.
+ $AIL_set_variable_int(FirstSound, "MyVar", 10);
+
+ // Set a global variable by the same name.
+ $AIL_set_variable_int(0, "MyVar", 20);
+
+ // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will
+ // get 20.
+ $}
+
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value);
+/*
+ Sets a named variable that the designer can reference in the tool.
+
+ $:context The context the variable is set for. Can be either a $HEVENTSYSTEM
+ to set a global variable for a specific system, 0 to set a global variable
+ for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances.
+ $:name The name of the variable to set.
+ $:value The value of the variable to set.
+
+ Variables are tracked per sound instance and globally, and when a variable is needed
+ by an event, it will check the relevant sound instance first, before falling back to
+ the global variable list.
+
+ ${
+ $HMSSENUM FirstSound = MSS_FIRST;
+ $MILESEVENTSOUNDINFO Info;
+
+ // Grab the first sound, whatever it is.
+ $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info);
+
+ // Set a variable on that sound.
+ $AIL_set_variable_float(FirstSound, "MyVar", 10.0);
+
+ // Set a global variable by the same name.
+ $AIL_set_variable_float(0, "MyVar", 20.0);
+
+ // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will
+ // get 20.
+ $}
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_variable_int(UINTa context, char const* name, S32* value);
+/*
+ Retrieves a named variable.
+
+ $:context The context to start the lookup at, same as $AIL_set_variable_int.
+ $:name The name to look up.
+ $:value Pointer to an int to store the value in.
+ $:return 1 if the variable was found, 0 otherwise.
+
+ This function follows the same lookup pattern as the runtime - if the context is a
+ sound instance, it checks the instance before falling back to global variables.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_variable_float(UINTa context, char const* name, F32* value);
+/*
+ Retrieves a named variable.
+
+ $:context The context to start the lookup at, same as $AIL_set_variable_float.
+ $:name The name to look up.
+ $:value Pointer to a float to store the value in.
+ $:return 1 if the variable was found, 0 otherwise.
+
+ This function follows the same lookup pattern as the runtime - if the context is a
+ sound instance, it checks the instance before falling back to global variables.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_requeue_failed_asyncs();
+/*
+ Requeues any failed asynchronous loads for sound sources.
+
+ Use this function when a disc error causes a slew of failed caches. Any sound source that
+ has failed due to asynchronous load will get retried.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, S32 isms);
+/*
+ Specify the starting position for a pending sound.
+
+ $:sound The enumeration from $AIL_enumerate_sound_instances representing the desired sound.
+ The sound must be in the pending state.
+ $:offset The offset to use for the starting position of the sound.
+ $:isms If nonzero, the offset is in milliseconds, otherwise bytes.
+
+ Use this function instead of manipulating the sample position directly via low level Miles calls prior to
+ the sound starting. Generally you don't need to do this manually, since the sound designer should do
+ this, however if you need to restart a sound that stopped - for example a stream that went to error -
+ you will have to set the start position via code.
+
+ However, since there can be a delay between the time the sound is first seen in the sound iteration and
+ the time it gets set to the data, start positions set via the low level miles calls can get lost, so
+ use this.
+
+ See the <i>eventstreamerror.cpp</i> example program for usage.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSSENUM* next, S32 statuses, char const* label_query, U64 search_for_ID, EXPOUT MILESEVENTSOUNDINFO* info);
+/*
+ Enumerated the active sound instances managed by the event system.
+
+ $:next Enumeration token - initialize to MSS_FIRST before the first call. You can pass 0 here, if you just want the first instance that matches.
+ $:statuses Or-ed list of status values to enumerate. Use 0 for all status types.
+ $:label_query A query to match sound instance labels against. Use 0 to skip label matching.
+ $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching.
+ $:info Returns the data for each sound instance.
+ $:return Returns 0 when enumeration is complete.
+
+ Enumerates the sound instances. This will generally be used between
+ calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to
+ manage the sound instances.
+
+ The label_query is a list of labels to match, separated by commas. By default, comma-separated
+ values only have to match at least one label. So, if you used "level1, wind", then all sound instances
+ that had either "level1" <i>or</i> "wind" would match. If you want to match <i>all</i> labels,
+ then use the + sign first (for example, "+level1, +wind" would only match sound instances that
+ had <i>both</i> "level1" and "wind"). You can also use the - sign before a label to <i>not</i>
+ match that label (so, "level1, -wind" would match all "level1" labeled sound instances that didn't have
+ a "wind" label). Finally, you can also use * and ? to match wildcard style labels (so, "gun*"
+ would match any sound instance with a label that starts with "gun").
+
+ Valid status flags are:
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were
+ created by events that had a "Start Sound Step". Note that these instances aren't audible yet,
+ so that you have a chance to modify game driven properties (like the 3D position)
+ on the sound before Miles begins to play it.
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously
+ started and are continuing to play (you might update the 3D position for these, for example).
+
+ $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing
+ since the last this frame (you might use this status to free any game related memory, for example).
+
+ Example Usage:
+${
+ HMSSENUM SoundEnum = MSS_FIRST;
+ MILESEVENTSOUNDINFO Info;
+
+ while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) )
+ {
+ if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE )
+ {
+ game_SoundState* game_data= (game_SoundState*)( Info.UserBuffer );
+ $AIL_set_sample_is_3D( Info.Sample, 1 );
+ $AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_date->z );
+ }
+ }
+
+$}
+*/
+
+EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS;
+#define MILESEVENT_SOUND_STATUS_PENDING 0x1
+#define MILESEVENT_SOUND_STATUS_PLAYING 0x2
+#define MILESEVENT_SOUND_STATUS_COMPLETE 0x4
+EXPTYPEEND
+/*
+ Specifies the status of a sound instance.
+
+ $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were
+ created by events that had a "Start Sound Step". Note that these instances aren't audible yet,
+ so that you have a chance to modify game driven properties (like the 3D position)
+ on the sound before Miles begins to play it.
+
+ $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously
+ started and are continuing to play (you might update the 3D position for these, for example).
+
+ $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing
+ since the last this frame (you might use this status to free any game related memory, for example).
+
+ These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them.
+*/
+
+EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG;
+#define MILESEVENT_SOUND_FLAG_MISSING_SOUND 0x1
+#define MILESEVENT_SOUND_FLAG_EVICTED 0x2
+#define MILESEVENT_SOUND_FLAG_WAITING_ASYNC 0x4
+#define MILESEVENT_SOUND_FLAG_PENDING_ASYNC 0x8
+#define MILESEVENT_SOUND_FLAG_FAILED_HITCH 0x10
+#define MILESEVENT_SOUND_FLAG_FAILED_ASYNC 0x20
+EXPTYPEEND
+/*
+ Specifies the status of a sound instance.
+
+ $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event
+ and couldn't find anything in the loaded banks.
+ $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected
+ as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit,
+ or a limit on the sound itself.
+ $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded.
+ The sound will start when sufficient data has been loaded to hopefully avoid a skip.
+ $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible
+ that the sound playback will catch up to the read position under poor I/O conditions.
+ $:MILESEVENT_SOUND_FLAG_FAILED_HITCH The sound meta data was found, but the sound was not in memory, and the Start Sound event
+ was marked as "Must Be Cached". To prevent this, either clear the flag in the event, which will cause a start delay as the
+ sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it.
+ $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media
+ was removed during load, or the file was not found.
+
+ These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances
+ may have more than one flag, logically 'or'ed together.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void );
+/*
+ Completes the queue processing (which is started with $AIL_begin_event_queue_processing ).
+
+ $:return Returns 0 on failure.
+
+ This function must be called as a pair with $AIL_begin_event_queue_processing.
+
+ In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't
+ started playing yet. Old sound instances that have finished playing are still valid - they
+ haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances
+ and frees the completed ones - it's the 2nd half of the event processing.
+
+ Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound
+ instances.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID);
+/*
+ Allows the programmer to manually enqueue a stop sound event into the event system.
+
+ $:label_query A query to match sound instance labels against. Use 0 to skip label matching.
+ $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that
+ tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value.
+ $:return Returns a non-zero queue ID on success.
+
+ Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances
+ for a description of the label_query format).
+
+ Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds,
+ however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped,
+ this function accomplishes that, and is captured by the auditioner for replay.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID);
+/*
+ Allows the programmer to manually enqueue a pause sound event into the event system.
+
+ $:label_query A query to match sound instance labels against. Use 0 to skip label matching.
+ $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that
+ tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value.
+ $:return Returns a non-zero queue ID on success.
+
+ Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances
+ for a description of the label_query format).
+
+ Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds,
+ however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused,
+ this function accomplishes that, and is captured by the auditioner for replay.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID);
+/*
+ Allows the programmer to manually enqueue a resume sound event into the event system.
+
+ $:label_query A query to match sound instance labels against. Use 0 to skip label matching.
+ $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that
+ tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value.
+ $:return Returns a non-zero enqueue ID on success.
+
+ Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances
+ for a description of the label_query format).
+
+ Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds,
+ however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed,
+ this function accomplishes that, and is captured by the auditioner for replay.
+*/
+
+DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count,
+ S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags );
+/*
+ Allows the programmer to manually enqueue a start sound event into the event system.
+
+ $:bank The bank containing the sound to start.
+ $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName"
+ $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop.
+ $:stream Non-zero if the sound playback should stream off the disc.
+ $:labels An optional comma-delimited list of labels to assign to the sound playback.
+ $:user_buffer See the user_buffer description in $AIL_enqueue_event.
+ $:user_buffer_len See the user_buffer_len description in $AIL_enqueue_event.
+ $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event.
+ $:return Returns a non-zero EnqueueID on success.
+
+ Enqueues an event to start the specified sound asset.
+
+ Usually the programmer should trigger an event that the sound designer has specifically
+ create to start the appropriate sounds, but this function gives the programmer
+ manual control, if necessary. <b>This function is not captured by the auditioner.</b>
+*/
+
+DXDEC EXPAPI void AILCALL AIL_clear_event_queue( void );
+/*
+ Removes all pending events that you have enqueued.
+
+ This function will clears the list of all events that you have previously enqueued.
+*/
+
+
+DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char const* sound_limits);
+/*
+ Sets the maximum number of sounds that matches a particular label.
+
+ $:sound_limits A string that defines one or more limits on a label by label basis. The string should
+ be of the form "label1name label1count:label2name label2count".
+ $:return Returns 0 on failure (usually a bad limit string).
+
+ Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based
+ on the settings in the event step).
+
+ Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime.
+ Note that this replaces those events, it does not supplement.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSSENUM* next, EXPOUT char const ** name);
+/*
+ Enumerates the current persisted presets that active in the system.
+
+ $:system The system to enumerate the persists for, or 0 to use the default system.
+ $:next Enumeration token - initialize to MSS_FIRST before the first call.
+ $:name Pointer to a char* that receives the name of the persist. NOTE
+ that this pointer can change frame to frame and should be immediately copied to a client-allocated
+ buffer if persistence is desired.
+ $:return Returns 0 when enumeration is complete.
+
+ This function lets you enumerate all the persisting presets that are currently active in the system. It
+ is mostly a debugging aid.
+*/
+
+DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void);
+/*
+ Returns a big string describing the current state of the event system.
+
+ $:return String description of current systems state.
+
+ This function is a debugging aid - it can be used to show all of the active allocations,
+ active sounds, etc.
+
+ You must delete the pointer returned from this function with $AIL_mem_free_lock.
+*/
+
+EXPTYPE typedef struct _MILESEVENTSTATE
+{
+ S32 CommandBufferSize;
+ S32 HeapSize;
+ S32 HeapRemaining;
+ S32 LoadedSoundCount;
+ S32 PlayingSoundCount;
+ S32 LoadedBankCount;
+ S32 PersistCount;
+
+ S32 SoundBankManagementMemory;
+ S32 SoundDataMemory;
+} MILESEVENTSTATE;
+/*
+ returns the current state of the Miles Event System.
+
+ $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system.
+ $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes.
+ $:HeapRemaining The number of bytes in HeapSize that is remaining.
+ $:LoadedSoundCount The number of sounds loaded and ready to play via cache event steps.
+ $:PlayingSoundCount The number of sounds currently playing via start sound event steps.
+ $:LoadedBankCount The number of sound banks loaded in the system via cache event steps, or AIL_add_soundbank.
+ $:PersistCount The number of presets persisted via the persist event step.
+ $:SoundBankManagementMemory The number of bytes used for the management of the loaded sound banks.
+ $:SoundDataMemory The number of bytes used in file sizes - remember this is not included in HeapSize. Streaming overhead is not included in this number, only fully loaded sounds.
+
+ This structure returns debugging info about the event system. It is used with $AIL_event_system_state.
+*/
+
+EXPGROUP(Miles High Level Callbacks)
+
+EXPAPI typedef void AILCALLBACK MilesBankFreeAll( void );
+/*
+ callback to free all user managed bank memory.
+*/
+
+EXPAPI typedef void * AILCALLBACK MilesBankGetPreset( char const * name );
+/*
+ callback to retrieve a sound preset.
+*/
+
+EXPAPI typedef void * AILCALLBACK MilesBankGetEnvironment( char const * name );
+/*
+ callback to retrieve an environment preset.
+*/
+EXPAPI typedef S32 AILCALLBACK MilesBankGetSound(char const* SoundAssetName, char* SoundFileName, MILESBANKSOUNDINFO* o_SoundInfo );
+/*
+ callback to return whether the sound asset is in the bank, and, if so, what the final data filename is.
+
+ In order to externally deploy sound files, you will need to register your own GetSound callback. This is detailed in the
+ eventexternal example program.
+
+ This returns the len of the buffer required for the output file name if SoundFileName is zero.
+*/
+
+EXPAPI typedef void * AILCALLBACK MilesBankGetEvent( char const * name );
+/*
+ callback to retrieve an event.
+*/
+
+EXPAPI typedef void * AILCALLBACK MilesBankGetMarkerList( char const * name );
+/*
+ callback to retrieve a sound marker list.
+*/
+
+EXPAPI typedef S32 AILCALLBACK MilesBankGetLoadedCount( void );
+/*
+ callback to retrieve the number of loaded sound banks.
+*/
+
+EXPAPI typedef S32 AILCALLBACK MilesBankGetMemUsage( void );
+/*
+ callback to retrieve the total memory in use.
+*/
+
+EXPAPI typedef char const * AILCALLBACK MilesBankGetLoadedName( S32 index );
+/*
+ callback to retrieve the file name of a sound index.
+*/
+
+
+EXPTYPE typedef struct _MILESBANKFUNCTIONS
+{
+ MilesBankFreeAll * FreeAll;
+ MilesBankGetPreset * GetPreset;
+ MilesBankGetEnvironment * GetEnvironment;
+ MilesBankGetSound * GetSound;
+ MilesBankGetEvent * GetEvent;
+ MilesBankGetMarkerList * GetMarkerList;
+ MilesBankGetLoadedCount * GetLoadedCount;
+ MilesBankGetMemUsage * GetMemUsage;
+ MilesBankGetLoadedName * GetLoadedName;
+} MILESBANKFUNCTIONS;
+/*
+ specifies callbacks for each of the Miles event system.
+
+ $:FreeAll Callback that tells you to free all user-side bank memory.
+ $:GetPreset Callback to retrieve a sound preset.
+ $:GetEnvironment Callback to retrieve an environment preset.
+ $:GetSound Callback to return the actual filename of a sound asset.
+ $:GetEvent Callback to retrieve a sound event.
+ $:GetMarkerList Callback to retrieve a sound marker list.
+ $:GetLoadedCount Callback to retrieve a count of loaded sound banks.
+ $:GetMemUsage Callback to retrieve the amount of memory in use.
+ $:GetLoadedName Callback to retrieve the filename for a sound asset index.
+
+ This structure is used to provide overrides for all of the high-level loading
+ functionality.
+*/
+
+EXPGROUP(Miles High Level Event System)
+
+DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleCallback)(char const* SoundName, char const* SoundFileName, HDIGDRIVER dig, void* UserBuffer, S32 UserBufferLen), void (*ReleaseSampleCallback)(HSAMPLE));
+/*
+ Allows you to manage sound data availability and sample handles.
+
+ $:CreateSampleCallback Function that will be called when a sample handle is needed.
+ $:ReleaseSampleCallback Function that will be called when a sample is no longer needed.
+
+ A created sample is required to have all data pointers necessary to play - e.g.
+ the event system needs to be able to just do a AIL_start_sample() on the returned
+ handle and have it work.
+
+ In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName
+ is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions).
+
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions);
+/*
+ Allows you to override the internal bank file resource management..
+
+ $:Functions A pointer to a structure containing all the callback functions.
+
+ This function is used to completely override the high-level resource management system.
+ It's not for overriding the IO - it's when you need much higher-level of control. Primarily
+ targeted internally for the Auditioner to use, it also is used when deploying sound files
+ externally.
+*/
+
+DXDEC EXPAPI MILESBANKFUNCTIONS const* AILCALL AIL_get_event_bank_functions();
+/*
+ Returns the current functions used to retrieve and poll bank assets.
+*/
+
+
+typedef S32 AILCALLBACK AuditionStatus();
+typedef S32 AILCALLBACK AuditionPump();
+typedef void* AILCALLBACK AuditionOpenBank(char const* i_FileName);
+typedef S32 AILCALLBACK AuditionOpenComplete(void* i_Bank);
+typedef void AILCALLBACK AuditionCloseBank(void* i_Bank);
+
+typedef void AILCALLBACK AuditionSuppress(S32 i_IsSuppressed);
+typedef void AILCALLBACK AuditionFrameStart();
+typedef void AILCALLBACK AuditionFrameEnd();
+typedef void AILCALLBACK AuditionDefragStart();
+typedef void AILCALLBACK AuditionSetBlend(U64 i_EventId, char const* i_Name);
+typedef void AILCALLBACK AuditionSetPersist(U64 i_EventId, char const* i_Name, char const* i_Preset);
+typedef void AILCALLBACK AuditionEvent(char const* i_EventName, U64 i_EventId, U64 i_Filter, S32 i_Exists, void* i_InitBlock, S32 i_InitBlockLen);
+typedef void AILCALLBACK AuditionSound(U64 i_EventId, U64 i_SoundId, char const* i_Sound, char const* i_Labels, float i_Volume, S32 i_Delay, float i_Pitch);
+typedef void AILCALLBACK AuditionSoundComplete(U64 i_SoundId);
+typedef void AILCALLBACK AuditionSoundPlaying(U64 i_SoundId);
+typedef void AILCALLBACK AuditionSoundFlags(U64 i_SoundId, S32 i_Flags);
+typedef void AILCALLBACK AuditionSoundLimited(U64 i_SoundId, char const* i_Label);
+typedef void AILCALLBACK AuditionSoundEvicted(U64 i_SoundId, U64 i_ForSound, S32 i_Reason);
+typedef void AILCALLBACK AuditionControl(U64 i_EventId, char const* i_Labels, U8 i_ControlType, U64 i_Filter);
+typedef void AILCALLBACK AuditionSoundBus(U64 i_SoundId, U8 i_BusIndex);
+
+typedef void AILCALLBACK AuditionError(U64 i_Id, char const* i_Details);
+
+typedef void AILCALLBACK AuditionAsyncQueued(U64 i_RelevantId, S32 i_AsyncId, char const* i_Asset);
+typedef void AILCALLBACK AuditionAsyncLoad(S32 i_AsyncId, S32 i_ExpectedData);
+typedef void AILCALLBACK AuditionAsyncError(S32 i_AsyncId);
+typedef void AILCALLBACK AuditionAsyncComplete(S32 i_AsyncId, S32 i_DataLoaded);
+typedef void AILCALLBACK AuditionAsyncCancel(S32 i_AsyncId);
+typedef void AILCALLBACK AuditionListenerPosition(float x, float y, float z);
+typedef void AILCALLBACK AuditionSoundPosition(U64 i_Sound, float x, float y, float z);
+typedef void AILCALLBACK AuditionSendCPU(HDIGDRIVER i_Driver);
+typedef void AILCALLBACK AuditionUpdateDataCount(S32 i_CurrentDataLoaded);
+typedef void AILCALLBACK AuditionSendCount(S32 i_Count);
+typedef void AILCALLBACK AuditionHandleSystemLoad(S32 i_Avail, S32 i_Total);
+typedef void AILCALLBACK AuditionVarState(char const* i_Var, U64 i_SoundId, S32 i_Int, void* i_4ByteValue);
+typedef void AILCALLBACK AuditionRampState(char const* i_Ramp, U64 i_SoundId, S32 i_Type, float i_Current);
+typedef void AILCALLBACK AuditionSoundState(U64 i_SoundId, float i_FinalVol, float i_3DVol, float i_BlendVol, float i_BlendPitch, float i_RampVol, float i_RampWet, float i_RampLp, float i_RampRate);
+
+typedef void AILCALLBACK AuditionClearState();
+typedef void AILCALLBACK AuditionCompletionEvent(U64 i_CompletionEventId, U64 i_ParentSoundId);
+typedef void AILCALLBACK AuditionAddRamp(U64 i_ParentSoundId, S32 i_Type, char const* i_Name, char const* i_Query, U64 i_EventId);
+
+typedef struct _MILESAUDITIONFUNCTIONS
+{
+ AuditionStatus* Status;
+ AuditionPump* Pump;
+ AuditionOpenBank* OpenBank;
+ AuditionOpenComplete* OpenComplete;
+ AuditionCloseBank* CloseBank;
+
+ AuditionSuppress* Suppress;
+ AuditionFrameStart* FrameStart;
+ AuditionFrameEnd* FrameEnd;
+ AuditionDefragStart* DefragStart;
+ AuditionSetBlend* SetBlend;
+ AuditionSetPersist* SetPersist;
+ AuditionEvent* Event;
+ AuditionSound* Sound;
+ AuditionSoundComplete* SoundComplete;
+ AuditionSoundPlaying* SoundPlaying;
+ AuditionSoundFlags* SoundFlags;
+ AuditionSoundLimited* SoundLimited;
+ AuditionSoundEvicted* SoundEvicted;
+ AuditionControl* Control;
+ AuditionSoundBus* SoundBus;
+
+ AuditionError* Error;
+
+ AuditionAsyncQueued* AsyncQueued;
+ AuditionAsyncLoad* AsyncLoad;
+ AuditionAsyncError* AsyncError;
+ AuditionAsyncComplete* AsyncComplete;
+ AuditionAsyncCancel* AsyncCancel;
+ AuditionListenerPosition* ListenerPosition;
+ AuditionSoundPosition* SoundPosition;
+ AuditionSendCPU* SendCPU;
+ AuditionSendCount* SendCount;
+ AuditionUpdateDataCount* UpdateDataCount;
+ AuditionHandleSystemLoad* HandleSystemLoad;
+ AuditionVarState* VarState;
+ AuditionRampState* RampState;
+ AuditionSoundState* SoundState;
+
+ AuditionClearState* ClearState;
+ AuditionCompletionEvent* CompletionEvent;
+ AuditionAddRamp* AddRamp;
+} MILESAUDITIONFUNCTIONS;
+
+DXDEC void AILCALL MilesEventSetAuditionFunctions(MILESAUDITIONFUNCTIONS const* i_Functions);
+
+// Auditioner lib functions.
+EXPGROUP(auditioning)
+
+EXPTYPEBEGIN typedef S32 MILESAUDITIONCONNECTRESULT;
+#define MILES_CONNECTED 0
+#define MILES_CONNECT_FAILED 1
+#define MILES_HOST_NOT_FOUND 2
+#define MILES_SERVER_ERROR 3
+EXPTYPEEND
+/*
+ Return values for $AIL_audition_connect.
+
+ $:MILES_CONNECTED The Auditioner connected and successfully executed the handshake.
+ $:MILES_CONNECT_FAILED The Auditioner couldn't connect - either the IP wasn't valid, or Miles Sound Studio wasn't accepting connections.
+ $:MILES_HOST_NOT_FOUND The given host name could not be resolved to an IP.
+ $:MILES_SERVER_ERROR We connected, but the server was either another app on the same port, or the server version was incorrect.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_audition_connect(char const* i_Address);
+/*
+ Connect to a currently running Miles Sound Studio.
+
+ $:i_Address The IP or host name of the computer running Miles Sound Studio. Use $AIL_audition_local_host to connect to the same machine as the runtime.
+ $:return One of $MILESAUDITIONCONNECTRESULT
+
+ The is a synchronous connection attempt to Miles Sound Studio - it will not return until it is happy with the connection
+ and the server, or a failure occurs.
+
+ This must be called before any $AIL_add_soundbank calls.
+*/
+
+DXDEC EXPAPI char const* AILCALL AIL_audition_local_host();
+/*
+ Return the host name of the local machine.
+*/
+
+// Defines - must match values in studio/Common.h
+EXPTYPEBEGIN typedef S32 MILESAUDITIONLANG;
+#define MILES_LANG_ENGLISH 1
+#define MILES_LANG_FRENCH 2
+#define MILES_LANG_GERMAN 3
+#define MILES_LANG_SPANISH 4
+#define MILES_LANG_ITALIAN 5
+#define MILES_LANG_JAPANESE 6
+#define MILES_LANG_KOREAN 7
+#define MILES_LANG_CHINESE 8
+#define MILES_LANG_RUSSIAN 9
+EXPTYPEEND
+/*
+ Values representing the various languages the high level tool allows.
+
+ $:MILES_LANG_ENGLISH English
+ $:MILES_LANG_FRENCH French
+ $:MILES_LANG_GERMAN German
+ $:MILES_LANG_SPANISH Spanish
+ $:MILES_LANG_ITALIAN Italian
+ $:MILES_LANG_JAPANESE Japanese
+ $:MILES_LANG_KOREAN Korean
+ $:MILES_LANG_CHINESE Chinese
+ $:MILES_LANG_RUSSIAN Russian
+
+ Values representing the various languages the high level tool allows.
+*/
+
+EXPTYPEBEGIN typedef S32 MILESAUDITIONPLAT;
+#define MILES_PLAT_WIN 1
+#define MILES_PLAT_MAC 2
+#define MILES_PLAT_PS3 3
+#define MILES_PLAT_360 4
+#define MILES_PLAT_3DS 5
+#define MILES_PLAT_PSP 6
+#define MILES_PLAT_IPHONE 7
+#define MILES_PLAT_LINUX 8
+#define MILES_PLAT_WII 9
+#define MILES_PLAT_PSP2 10
+#define MILES_PLAT_WIIU 11
+#define MILES_PLAT_SEKRIT 12
+#define MILES_PLAT_SEKRIT2 13
+#define MILES_PLAT_WIN64 14
+#define MILES_PLAT_LINUX64 15
+#define MILES_PLAT_MAC64 16
+#define MILES_PLAT_WINRT32 17
+#define MILES_PLAT_WINRT64 18
+#define MILES_PLAT_WINPH32 19
+#define MILES_PLAT_ANDROID 20
+
+EXPTYPEEND
+/*
+ Values representing the various platforms the high level tool allows.
+
+ $:MILES_PLAT_WIN Microsoft Win32/64
+ $:MILES_PLAT_MAC Apple OSX
+ $:MILES_PLAT_PS3 Sony PS3
+ $:MILES_PLAT_360 Microsoft XBox360
+ $:MILES_PLAT_3DS Nintendo 3DS
+ $:MILES_PLAT_PSP Sony PSP
+ $:MILES_PLAT_IPHONE Apple iDevices
+ $:MILES_PLAT_LINUX Linux Flavors
+ $:MILES_PLAT_WII Nintendo Wii
+ $:MILES_PLAT_PSP2 Sony NGP
+
+ Values representing the various platforms the high level tool allows.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_audition_startup(S32 i_ProfileOnly, S32 i_Language, S32 i_Platform);
+/*
+ Binds the Auditioner to the Miles Event Runtime.
+
+ $:i_ProfileOnly Specify 0 to use assets from the connected Miles Sound Studio, and 1 to use assets from disc.
+ $:i_Language One of $MILESAUDITIONLANG, or zero to use Default assets. See comments below.
+ $:i_Platform One of $MILESAUDITIONPLAT, or zero to use the current platform. See comments below.
+
+ The Auditioner can run in one of two modes - the first is standard mode, where all assets
+ are loaded from the server, and profiling data is sent back to the server. The second is
+ Profiling mode, where the assets are loaded exactly as they would be under normal execution,
+ but all of the profiling data is sent to the server.
+
+ The $(AIL_audition_startup::i_Language) and the $(AIL_audition_startup::i_Platform) are used to determine what assets Miles Sound Studio sends
+ the Auditioner, and as a result are not used in Profiling Mode. Otherwise these are equivalent to
+ the options selected for compiling banks.
+
+ This must be called before any $AIL_add_soundbank calls.
+*/
+
+DXDEC EXPAPI void AILCALL AIL_audition_shutdown();
+/*
+ Removes the Auditioner from the Miles Event Runtime.
+*/
+
+EXPGROUP(Miles High Level Event System)
+
+DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state);
+/*
+ Returns an information structure about the current state of the Miles Event System.
+
+ $:system The system to retrieve information for, or zero for the default system.
+ $:state A pointer to a structure to receive the state information.
+
+ This function is a debugging aid - it returns information for the event system.
+*/
+
+DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining();
+/*
+ Returns the number of bytes remaining in the command buffer.
+
+ This can be invalid for a number of reasons - first, if the
+ command buffer will need to wrap for the next queue, the effective
+ bytes remaining will be lower. Second, if an enqueue occurs on another
+ thread in the interim, the value will be outdated.
+*/
+
+DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName);
+/*
+ Returns the length of the first sound referenced in the named event, in milliseconds.
+
+ $:i_EventName The name of an event that starts a sound.
+ $:return The length in milliseconds, or 0 if there is an error, or the event has no sound references, or the sound was not found.
+
+ This looks up the given event and searches for the first Start Sound event step, then
+ uses the first sound name in its list to look up the length. As such, if the start sound
+ step has multiple sounds, the rest will be ignored.
+*/
+
+// Callback for the error handler.
+EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource);
+/*
+ The function prototype to use for a callback that will be made when the event system
+ encounters an unrecoverable error.
+
+ $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID.
+ $:i_Resource A string representing the name of the resource the error is in regards to, or 0 if unknown.
+
+ The error description can be retrieved via $AIL_last_error.
+*/
+
+
+
+EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void );
+/*
+ The function definition to use when defining your own random function.
+
+ You can define a function with this prototype and pass it to $AIL_register_random
+ if you want to tie the Miles random calls in with your game's (for logging and such).
+*/
+
+DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_ErrorCallback);
+/*
+ Set the error handler for the event system.
+
+ $:i_ErrorHandler The function to call when an error is encountered.
+
+ Generally the event system handles errors gracefully - the only noticeable effect
+ is that a given sound won't play, or a preset doesn't get set. As a result, the errors
+ can sometimes be somewhat invisible. This function allows you to see what went wrong,
+ when it went wrong.
+
+ The basic usage is to have the callback check $AIL_last_error() for the overall category of
+ failure. The parameter passed to the callback might provide some context, but it can and will
+ be zero on occasion. Generally it will represent the resource string that is being worked on when the error
+ occurred.
+
+ Note that there are two out of memory errors - one is the event system ran out of memory - meaning
+ the value passed in to $AIL_startup_event_system was insufficient for the current load, and
+ the other is the memory used for sound data - allocated via $AIL_mem_alloc_lock - ran out.
+*/
+
+
+DXDEC EXPAPI void AILCALL AIL_register_random(MSS_USER_RAND * rand_func);
+/*
+ Sets the function that Miles will call to obtain a random number.
+
+ Use this function to set your own random function that the Miles Event System will call when it needs a random number.
+ This lets you control the determinism of the event system.
+*/
+
+
+
+
+#ifdef MSS_FLT_SUPPORTED
+
+//
+// Filter result codes
+//
+
+typedef SINTa FLTRESULT;
+
+#define FLT_NOERR 0 // Success -- no error
+#define FLT_NOT_ENABLED 1 // FLT not enabled
+#define FLT_ALREADY_STARTED 2 // FLT already started
+#define FLT_INVALID_PARAM 3 // Invalid parameters used
+#define FLT_INTERNAL_ERR 4 // Internal error in FLT driver
+#define FLT_OUT_OF_MEM 5 // Out of system RAM
+#define FLT_ERR_NOT_IMPLEMENTED 6 // Feature not implemented
+#define FLT_NOT_FOUND 7 // FLT supported device not found
+#define FLT_NOT_INIT 8 // FLT not initialized
+#define FLT_CLOSE_ERR 9 // FLT not closed correctly
+
+//############################################################################
+//## ##
+//## Interface "MSS pipeline filter" (some functions shared by ##
+//## "MSS voice filter") ##
+//## ##
+//############################################################################
+
+typedef FLTRESULT (AILCALL *FLT_STARTUP)(void);
+
+typedef FLTRESULT (AILCALL *FLT_SHUTDOWN)(void);
+
+typedef C8 * (AILCALL *FLT_ERROR)(void);
+
+typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc,
+ MSS_FREE_TYPE * pfree,
+ UINTa user,
+ HDIGDRIVER dig, void * memory);
+
+typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state);
+
+typedef void (AILCALL *FLT_PREMIX_PROCESS) (HDRIVERSTATE driver);
+
+typedef S32 (AILCALL *FLT_POSTMIX_PROCESS) (HDRIVERSTATE driver, void *output_buffer);
+
+//############################################################################
+//## ##
+//## Interface "Pipeline filter sample services" ##
+//## ##
+//############################################################################
+
+typedef HSAMPLESTATE (AILCALL * FLTSMP_OPEN_SAMPLE) (HDRIVERSTATE driver,
+ HSAMPLE S,
+ void * memory);
+
+typedef FLTRESULT (AILCALL * FLTSMP_CLOSE_SAMPLE) (HSAMPLESTATE state);
+
+typedef void (AILCALL * FLTSMP_SAMPLE_PROCESS) (HSAMPLESTATE state,
+ void * source_buffer,
+ void * dest_buffer, // may be the same as src
+ S32 n_samples,
+ S32 is_stereo );
+
+typedef S32 (AILCALL * FLTSMP_SAMPLE_PROPERTY) (HSAMPLESTATE state,
+ HPROPERTY property,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+//############################################################################
+//## ##
+//## Interface "MSS output filter" ##
+//## ##
+//############################################################################
+
+typedef S32 (AILCALL * VFLT_ASSIGN_SAMPLE_VOICE) (HDRIVERSTATE driver,
+ HSAMPLE S);
+
+typedef void (AILCALL * VFLT_RELEASE_SAMPLE_VOICE) (HDRIVERSTATE driver,
+ HSAMPLE S);
+
+typedef S32 (AILCALL * VFLT_START_SAMPLE_VOICE) (HDRIVERSTATE driver,
+ HSAMPLE S);
+
+//############################################################################
+//## ##
+//## Interface "Voice filter driver services" ##
+//## ##
+//############################################################################
+
+typedef S32 (AILCALL * VDRV_DRIVER_PROPERTY) (HDRIVERSTATE driver,
+ HPROPERTY property,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+typedef S32 (AILCALL * VDRV_FORCE_UPDATE) (HDRIVERSTATE driver);
+
+//############################################################################
+//## ##
+//## Interface "Voice filter sample services" ##
+//## ##
+//############################################################################
+
+typedef S32 (AILCALL * VSMP_SAMPLE_PROPERTY) (HSAMPLE S,
+ HPROPERTY property,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+//
+// Pipeline filter calls
+//
+
+DXDEC HPROVIDER AILCALL AIL_digital_output_filter (HDIGDRIVER dig);
+
+DXDEC S32 AILCALL AIL_enumerate_filters (HMSSENUM *next,
+ HPROVIDER *dest,
+ C8 * *name);
+DXDEC HDRIVERSTATE
+ AILCALL AIL_open_filter (HPROVIDER lib,
+ HDIGDRIVER dig);
+
+DXDEC void AILCALL AIL_close_filter (HDRIVERSTATE filter);
+
+DXDEC S32 AILCALL AIL_find_filter (C8 const *name,
+ HPROVIDER *ret);
+
+DXDEC S32 AILCALL AIL_enumerate_filter_properties
+ (HPROVIDER lib,
+ HMSSENUM * next,
+ RIB_INTERFACE_ENTRY * dest);
+
+DXDEC S32 AILCALL AIL_filter_property (HPROVIDER lib,
+ C8 const* name,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+DXDEC S32 AILCALL AIL_enumerate_output_filter_driver_properties
+ (HPROVIDER lib,
+ HMSSENUM * next,
+ RIB_INTERFACE_ENTRY * dest);
+
+DXDEC S32 AILCALL AIL_output_filter_driver_property
+ (HDIGDRIVER dig,
+ C8 const * name,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+DXDEC S32 AILCALL AIL_enumerate_output_filter_sample_properties
+ (HPROVIDER lib,
+ HMSSENUM * next,
+ RIB_INTERFACE_ENTRY * dest);
+
+DXDEC S32 AILCALL AIL_enumerate_filter_sample_properties
+ (HPROVIDER lib,
+ HMSSENUM * next,
+ RIB_INTERFACE_ENTRY * dest);
+
+DXDEC S32 AILCALL AIL_enumerate_sample_stage_properties
+ (HSAMPLE S,
+ SAMPLESTAGE stage,
+ HMSSENUM * next,
+ RIB_INTERFACE_ENTRY * dest);
+
+DXDEC S32 AILCALL AIL_sample_stage_property
+ (HSAMPLE S,
+ SAMPLESTAGE stage,
+ C8 const * name,
+ S32 channel,
+ void* before_value,
+ void const* new_value,
+ void* after_value
+ );
+
+#define AIL_filter_sample_property(S,name,beforev,newv,afterv) AIL_sample_stage_property((S),SP_FILTER_0,(name),-1,(beforev),(newv),(afterv))
+
+typedef struct _FLTPROVIDER
+{
+ S32 provider_flags;
+ S32 driver_size;
+ S32 sample_size;
+
+ PROVIDER_PROPERTY PROVIDER_property;
+
+ FLT_STARTUP startup;
+ FLT_ERROR error;
+ FLT_SHUTDOWN shutdown;
+ FLT_OPEN_DRIVER open_driver;
+ FLT_CLOSE_DRIVER close_driver;
+ FLT_PREMIX_PROCESS premix_process;
+ FLT_POSTMIX_PROCESS postmix_process;
+
+ FLTSMP_OPEN_SAMPLE open_sample;
+ FLTSMP_CLOSE_SAMPLE close_sample;
+ FLTSMP_SAMPLE_PROCESS sample_process;
+ FLTSMP_SAMPLE_PROPERTY sample_property;
+
+ VFLT_ASSIGN_SAMPLE_VOICE assign_sample_voice;
+ VFLT_RELEASE_SAMPLE_VOICE release_sample_voice;
+ VFLT_START_SAMPLE_VOICE start_sample_voice;
+
+ VDRV_DRIVER_PROPERTY driver_property;
+ VDRV_FORCE_UPDATE force_update;
+
+ VSMP_SAMPLE_PROPERTY output_sample_property;
+
+ HDIGDRIVER dig;
+ HPROVIDER provider;
+ HDRIVERSTATE driver_state;
+
+ struct _FLTPROVIDER *next;
+} FLTPROVIDER;
+
+//
+// Values for "Flags" property exported by all MSS Pipeline Filter and MSS Output Filter
+// providers
+//
+
+#define FPROV_ON_SAMPLES 0x0001 // Pipeline filter that operates on input samples (and is enumerated by AIL_enumerate_filters)
+#define FPROV_ON_POSTMIX 0x0002 // Pipeline filter that operates on the post mixed output (capture filter)
+#define FPROV_MATRIX 0x0004 // This is a matrix output filter (e.g., SRS/Dolby)
+#define FPROV_VOICE 0x0008 // This is a per-voice output filter (e.g., DirectSound 3D)
+#define FPROV_3D 0x0010 // Output filter uses S3D substructure for positioning
+#define FPROV_OCCLUSION 0x0020 // Output filter supports occlusion (doesn't need per-sample lowpass)
+#define FPROV_EAX 0x0040 // Output filter supports EAX-compatible environmental reverb
+#define FPROV_SIDECHAIN 0x0080 // Filter has an "Input" property on the 3rd index for side chaining.
+
+#define FPROV_SPU_MASK 0xff0000 // Mask here the SPU INDEX STARTS
+#define FPROV_SPU_INDEX( val ) ( ( val >> 16 ) & 0xff )
+#define FPROV_MAKE_SPU_INDEX( val ) ( val << 16 )
+
+
+
+#ifdef IS_WIN32
+
+#define MSS_EAX_AUTO_GAIN 1
+#define MSS_EAX_AUTOWAH 2
+#define MSS_EAX_CHORUS 3
+#define MSS_EAX_DISTORTION 4
+#define MSS_EAX_ECHO 5
+#define MSS_EAX_EQUALIZER 6
+#define MSS_EAX_FLANGER 7
+#define MSS_EAX_FSHIFTER 8
+#define MSS_EAX_VMORPHER 9
+#define MSS_EAX_PSHIFTER 10
+#define MSS_EAX_RMODULATOR 11
+#define MSS_EAX_REVERB 12
+
+typedef struct EAX_SAMPLE_SLOT_VOLUME
+{
+ S32 Slot; // 0, 1, 2, 3
+ S32 Send;
+ S32 SendHF;
+ S32 Occlusion;
+ F32 OcclusionLFRatio;
+ F32 OcclusionRoomRatio;
+ F32 OcclusionDirectRatio;
+} EAX_SAMPLE_SLOT_VOLUME;
+
+typedef struct EAX_SAMPLE_SLOT_VOLUMES
+{
+ U32 NumVolumes; // 0, 1, or 2
+ EAX_SAMPLE_SLOT_VOLUME volumes[ 2 ];
+} EAX_SAMPLE_SLOT_VOLUMES;
+
+// Use this structure for EAX REVERB
+typedef struct EAX_REVERB
+{
+ S32 Effect; // set to MSS_EAX_REVERB
+ S32 Volume; // -10000 to 0
+ U32 Environment; // one of the ENVIRONMENT_ enums
+ F32 EnvironmentSize; // environment size in meters
+ F32 EnvironmentDiffusion; // environment diffusion
+ S32 Room; // room effect level (at mid frequencies)
+ S32 RoomHF; // relative room effect level at high frequencies
+ S32 RoomLF; // relative room effect level at low frequencies
+ F32 DecayTime; // reverberation decay time at mid frequencies
+ F32 DecayHFRatio; // high-frequency to mid-frequency decay time ratio
+ F32 DecayLFRatio; // low-frequency to mid-frequency decay time ratio
+ S32 Reflections; // early reflections level relative to room effect
+ F32 ReflectionsDelay; // initial reflection delay time
+ F32 ReflectionsPanX; // early reflections panning vector
+ F32 ReflectionsPanY; // early reflections panning vector
+ F32 ReflectionsPanZ; // early reflections panning vector
+ S32 Reverb; // late reverberation level relative to room effect
+ F32 ReverbDelay; // late reverberation delay time relative to initial reflection
+ F32 ReverbPanX; // late reverberation panning vector
+ F32 ReverbPanY; // late reverberation panning vector
+ F32 ReverbPanZ; // late reverberation panning vector
+ F32 EchoTime; // echo time
+ F32 EchoDepth; // echo depth
+ F32 ModulationTime; // modulation time
+ F32 ModulationDepth; // modulation depth
+ F32 AirAbsorptionHF; // change in level per meter at high frequencies
+ F32 HFReference; // reference high frequency
+ F32 LFReference; // reference low frequency
+ F32 RoomRolloffFactor; // like DS3D flRolloffFactor but for room effect
+ U32 Flags; // modifies the behavior of properties
+} EAX_REVERB;
+
+// Use this structure for EAX AUTOGAIN
+typedef struct EAX_AUTOGAIN
+{
+ S32 Effect; // set to MSS_EAX_AUTO_GAIN
+ S32 Volume; // -10000 to 0
+ U32 OnOff; // Switch Compressor on or off (1 or 0)
+} EAX_AUTOGAIN;
+
+// Use this structure for EAX AUTOWAH
+typedef struct EAX_AUTOWAH
+{
+ S32 Effect; // set to MSS_EAX_AUTOWAH
+ S32 Volume; // -10000 to 0
+ F32 AttackTime; // Attack time (seconds)
+ F32 ReleaseTime; // Release time (seconds)
+ S32 Resonance; // Resonance (mB)
+ S32 PeakLevel; // Peak level (mB)
+} EAX_AUTOWAH;
+
+// Use this structure for EAX CHORUS
+typedef struct EAX_CHORUS
+{
+ S32 Effect; // set to MSS_EAX_CHORUS
+ S32 Volume; // -10000 to 0
+ U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle
+ S32 Phase; // Phase (Degrees)
+ F32 Rate; // Rate (Hz)
+ F32 Depth; // Depth (0 to 1)
+ F32 Feedback; // Feedback (-1 to 1)
+ F32 Delay; // Delay (seconds)
+} EAX_CHORUS;
+
+// Use this structure for EAX DISTORTION
+typedef struct EAX_DISTORTION
+{
+ S32 Effect; // set to MSS_EAX_DISTORTION
+ S32 Volume; // -10000 to 0
+ F32 Edge; // Controls the shape of the distortion (0 to 1)
+ S32 Gain; // Controls the post distortion gain (mB)
+ F32 LowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz)
+ F32 EQCenter; // Controls the center frequency of the EQ post-distortion (Hz)
+ F32 EQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz)
+} EAX_DISTORTION;
+
+// Use this structure for EAX ECHO
+typedef struct EAX_ECHO
+{
+ S32 Effect; // set to MSS_EAX_ECHO
+ S32 Volume; // -10000 to 0
+ F32 Delay; // Controls the initial delay time (seconds)
+ F32 LRDelay; // Controls the delay time between the first and second taps (seconds)
+ F32 Damping; // Controls a low-pass filter that dampens the echoes (0 to 1)
+ F32 Feedback; // Controls the duration of echo repetition (0 to 1)
+ F32 Spread; // Controls the left-right spread of the echoes
+} EAX_ECHO;
+
+// Use this structure for EAXEQUALIZER_ALLPARAMETERS
+typedef struct EAX_EQUALIZER
+{
+ S32 Effect; // set to MSS_EAX_EQUALIZER
+ S32 Volume; // -10000 to 0
+ S32 LowGain; // (mB)
+ F32 LowCutOff; // (Hz)
+ S32 Mid1Gain; // (mB)
+ F32 Mid1Center; // (Hz)
+ F32 Mid1Width; // (octaves)
+ F32 Mid2Gain; // (mB)
+ F32 Mid2Center; // (Hz)
+ F32 Mid2Width; // (octaves)
+ S32 HighGain; // (mB)
+ F32 HighCutOff; // (Hz)
+} EAX_EQUALIZER;
+
+// Use this structure for EAX FLANGER
+typedef struct EAX_FLANGER
+{
+ S32 Effect; // set to MSS_EAX_FLANGER
+ S32 Volume; // -10000 to 0
+ U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle
+ S32 Phase; // Phase (Degrees)
+ F32 Rate; // Rate (Hz)
+ F32 Depth; // Depth (0 to 1)
+ F32 Feedback; // Feedback (0 to 1)
+ F32 Delay; // Delay (seconds)
+} EAX_FLANGER;
+
+
+// Use this structure for EAX FREQUENCY SHIFTER
+typedef struct EAX_FSHIFTER
+{
+ S32 Effect; // set to MSS_EAX_FSHIFTER
+ S32 Volume; // -10000 to 0
+ F32 Frequency; // (Hz)
+ U32 LeftDirection; // direction - 0 = down, 1 = up, 2 = off
+ U32 RightDirection; // direction - 0 = down, 1 = up, 2 = off
+} EAX_FSHIFTER;
+
+// Use this structure for EAX VOCAL MORPHER
+typedef struct EAX_VMORPHER
+{
+ S32 Effect; // set to MSS_EAX_VMORPHER
+ S32 Volume; // -10000 to 0
+ U32 PhonemeA; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z
+ S32 PhonemeACoarseTuning; // (semitones)
+ U32 PhonemeB; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z
+ S32 PhonemeBCoarseTuning; // (semitones)
+ U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth
+ F32 Rate; // (Hz)
+} EAX_VMORPHER;
+
+
+// Use this structure for EAX PITCH SHIFTER
+typedef struct EAX_PSHIFTER
+{
+ S32 Effect; // set to MSS_EAX_PSHIFTER
+ S32 Volume; // -10000 to 0
+ S32 CoarseTune; // Amount of pitch shift (semitones)
+ S32 FineTune; // Amount of pitch shift (cents)
+} EAX_PSHIFTER;
+
+// Use this structure for EAX RING MODULATOR
+typedef struct EAX_RMODULATOR
+{
+ S32 Effect; // set to MSS_EAX_RMODULATOR
+ S32 Volume; // -10000 to 0
+ F32 Frequency; // Frequency of modulation (Hz)
+ F32 HighPassCutOff; // Cut-off frequency of high-pass filter (Hz)
+ U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth
+} EAX_RMODULATOR;
+
+#endif
+
+#else // MSS_FLT_SUPPORTED
+
+typedef struct _FLTPROVIDER
+{
+ U32 junk;
+} FLTPROVIDER;
+
+#endif // MSS_FLT_SUPPORTED
+
+#endif // MSS_BASIC
+
+RADDEFEND
+
+#endif // MSS_H
diff --git a/Minecraft.Client/Durango/Miles/include/rrCore.h b/Minecraft.Client/Durango/Miles/include/rrCore.h
new file mode 100644
index 00000000..e88b5f8c
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/include/rrCore.h
@@ -0,0 +1,2322 @@
+/// ========================================================================
+// (C) Copyright 1994- 2014 RAD Game Tools, Inc. Global types header file
+// ========================================================================
+
+#ifndef __RADRR_COREH__
+#define __RADRR_COREH__
+#define RADCOPYRIGHT "Copyright (C) 1994-2014, RAD Game Tools, Inc."
+
+// __RAD16__ means 16 bit code (Win16)
+// __RAD32__ means 32 bit code (DOS, Win386, Win32s, Mac AND Win64)
+// __RAD64__ means 64 bit code (x64)
+
+// Note oddness - __RAD32__ essentially means "at *least* 32-bit code".
+// So, on 64-bit systems, both __RAD32__ and __RAD64__ will be defined.
+
+// __RADDOS__ means DOS code (16 or 32 bit)
+// __RADWIN__ means Windows API (Win16, Win386, Win32s, Win64, Xbox, Xenon)
+// __RADWINEXT__ means Windows 386 extender (Win386)
+// __RADNT__ means Win32 or Win64 code
+// __RADWINRTAPI__ means Windows RT API (Win 8, Win Phone, ARM, Durango)
+// __RADMAC__ means Macintosh
+// __RADCARBON__ means Carbon
+// __RADMACH__ means MachO
+// __RADXBOX__ means the XBox console
+// __RADXENON__ means the Xenon console
+// __RADDURANGO__ or __RADXBOXONE__ means Xbox One
+// __RADNGC__ means the Nintendo GameCube
+// __RADWII__ means the Nintendo Wii
+// __RADWIIU__ means the Nintendo Wii U
+// __RADNDS__ means the Nintendo DS
+// __RADTWL__ means the Nintendo DSi (__RADNDS__ also defined)
+// __RAD3DS__ means the Nintendo 3DS
+// __RADPS2__ means the Sony PlayStation 2
+// __RADPSP__ means the Sony PlayStation Portable
+// __RADPS3__ means the Sony PlayStation 3
+// __RADPS4__ means the Sony PlayStation 4
+// __RADANDROID__ means Android NDK
+// __RADNACL__ means Native Client SDK
+// __RADNTBUILDLINUX__ means building Linux on NT
+// __RADLINUX__ means actually building on Linux (most likely with GCC)
+// __RADPSP2__ means NGP
+// __RADBSD__ means a BSD-style UNIX (OS X, FreeBSD, OpenBSD, NetBSD)
+// __RADPOSIX__ means POSIX-compliant
+// __RADQNX__ means QNX
+// __RADIPHONE__ means iphone
+// __RADIPHONESIM__ means iphone simulator
+
+// __RADX86__ means Intel x86
+// __RADMMX__ means Intel x86 MMX instructions are allowed
+// __RADX64__ means Intel/AMD x64 (NOT IA64=Itanium)
+// __RAD68K__ means 68K
+// __RADPPC__ means PowerPC
+// __RADMIPS__ means Mips (only R5900 right now)
+// __RADARM__ mean ARM processors
+
+// __RADLITTLEENDIAN__ means processor is little-endian (x86)
+// __RADBIGENDIAN__ means processor is big-endian (680x0, PPC)
+
+// __RADNOVARARGMACROS__ means #defines can't use ...
+
+ #ifdef WINAPI_FAMILY
+ // If this is #defined, we might be in a Windows Store App. But
+ // VC++ by default #defines this to a symbolic name, not an integer
+ // value, and those names are defined in "winapifamily.h". So if
+ // WINAPI_FAMILY is #defined, #include the header so we can parse it.
+ #include <winapifamily.h>
+ #define RAD_WINAPI_IS_APP (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
+ #else
+ #define RAD_WINAPI_IS_APP 0
+ #endif
+
+ #ifndef __RADRES__
+ // Theoretically, this is to pad structs on platforms that don't support pragma pack or do it poorly. (PS3, PS2)
+ // In general it is assumed that your padding is set via pragma, so this is just a struct.
+ #define RADSTRUCT struct
+
+ #ifdef __GNUC_MINOR__
+ // make a combined GCC version for testing :
+
+ #define __RAD_GCC_VERSION__ (__GNUC__ * 10000 \
+ + __GNUC_MINOR__ * 100 \
+ + __GNUC_PATCHLEVEL__)
+
+ /* Test for GCC > 3.2.0 */
+ // #if GCC_VERSION > 30200
+ #endif
+
+ #if defined(__RADX32__)
+
+ #define __RADX86__
+ #define __RADMMX__
+ #define __RAD32__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ // known platforms under the RAD generic build type
+ #if defined(_WIN32) || defined(_Windows) || defined(WIN32) || defined(__WINDOWS__) || defined(_WINDOWS)
+ #define __RADNT__
+ #define __RADWIN__
+ #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__)
+ #define __RADMAC__
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+ #elif defined(__linux__)
+ #define __RADLINUX__
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+ #endif
+
+#elif defined(ANDROID)
+ #define __RADANDROID__
+ #define __RAD32__
+ #define __RADLITTLEENDIAN__
+ #ifdef __i386__
+ #define __RADX86__
+ #else
+ #define __RADARM__
+ #endif
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+#elif defined(__QNX__)
+ #define __RAD32__
+ #define __RADQNX__
+
+#ifdef __arm__
+ #define __RADARM__
+#elif defined __i386__
+ #define __RADX86__
+#else
+ #error Unknown processor
+#endif
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+#elif defined(__linux__) && defined(__arm__) //This should pull in Raspberry Pi as well
+
+ #define __RAD32__
+ #define __RADLINUX__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+#elif defined(__native_client__)
+ #define __RADNACL__
+ #define __RAD32__
+ #define __RADLITTLEENDIAN__
+ #define __RADX86__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #elif defined(_DURANGO) || defined(_SEKRIT) || defined(_SEKRIT1) || defined(_XBOX_ONE)
+
+ #define __RADDURANGO__ 1
+ #define __RADXBOXONE__ 1
+ #if !defined(__RADSEKRIT__) // keep sekrit around for a bit for compat
+ #define __RADSEKRIT__ 1
+ #endif
+
+ #define __RADWIN__
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX64__
+ #define __RADMMX__
+ #define __RADX86__
+ #define __RAD64REGS__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE __inline
+ #define RADRESTRICT __restrict
+ #define __RADWINRTAPI__
+
+ #elif defined(__ORBIS__)
+
+ #define __RADPS4__
+ #if !defined(__RADSEKRIT2__) // keep sekrit2 around for a bit for compat
+ #define __RADSEKRIT2__ 1
+ #endif
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX64__
+ #define __RADMMX__
+ #define __RADX86__
+ #define __RAD64REGS__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #elif defined(WINAPI_FAMILY) && RAD_WINAPI_IS_APP
+
+ #define __RADWINRTAPI__
+ #define __RADWIN__
+ #define RADINLINE __inline
+ #define RADRESTRICT __restrict
+
+ #if defined(_M_IX86) // WinRT on x86
+
+ #define __RAD32__
+ #define __RADX86__
+ #define __RADMMX__
+ #define __RADLITTLEENDIAN__
+
+ #elif defined(_M_X64) // WinRT on x64
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX86__
+ #define __RADX64__
+ #define __RADMMX__
+ #define __RAD64REGS__
+ #define __RADLITTLEENDIAN__
+
+ #elif defined(_M_ARM) // WinRT on ARM
+
+ #define __RAD32__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+
+ #else
+
+ #error Unrecognized WinRT platform!
+
+ #endif
+
+ #elif defined(_WIN64)
+
+ #define __RADWIN__
+ #define __RADNT__
+ // See note at top for why both __RAD32__ and __RAD64__ are defined.
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX64__
+ #define __RADMMX__
+ #define __RADX86__
+ #define __RAD64REGS__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE __inline
+ #define RADRESTRICT __restrict
+
+ #elif defined(GENERIC_ARM)
+
+ #define __RAD32__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+ #define __RADFIXEDPOINT__
+ #define RADINLINE inline
+ #if (defined(__GCC__) || defined(__GNUC__))
+ #define RADRESTRICT __restrict
+ #else
+ #define RADRESTRICT // __restrict not supported on cw
+ #endif
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it
+
+ #define __RADWIIU__
+ #define __RAD32__
+ #define __RADPPC__
+ #define __RADBIGENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+
+ #elif defined(HOLLYWOOD_REV) || defined(REVOLUTION)
+
+ #define __RADWII__
+ #define __RAD32__
+ #define __RADPPC__
+ #define __RADBIGENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #elif defined(NN_PLATFORM_CTR)
+
+ #define __RAD3DS__
+ #define __RAD32__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #elif defined(GEKKO)
+
+ #define __RADNGC__
+ #define __RAD32__
+ #define __RADPPC__
+ #define __RADBIGENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT // __restrict not supported on cw
+
+ #elif defined(SDK_ARM9) || defined(SDK_TWL) || (defined(__arm) && defined(__MWERKS__))
+
+ #define __RADNDS__
+ #define __RAD32__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+ #define __RADFIXEDPOINT__
+ #define RADINLINE inline
+ #if (defined(__GCC__) || defined(__GNUC__))
+ #define RADRESTRICT __restrict
+ #else
+ #define RADRESTRICT // __restrict not supported on cw
+ #endif
+
+ #if defined(SDK_TWL)
+ #define __RADTWL__
+ #endif
+
+ #elif defined(R5900)
+
+ #define __RADPS2__
+ #define __RAD32__
+ #define __RADMIPS__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #define __RAD64REGS__
+ #define U128 u_long128
+
+ #if !defined(__MWERKS__)
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+ #endif
+
+ #elif defined(__psp__)
+
+ #define __RADPSP__
+ #define __RAD32__
+ #define __RADMIPS__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #elif defined(__psp2__)
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #define __RADPSP2__
+ #define __RAD32__
+ #define __RADARM__
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ // need packed attribute for struct with snc?
+ #elif defined(__CELLOS_LV2__)
+
+ // CB change : 10-29-10 : RAD64REGS on PPU but NOT SPU
+
+ #ifdef __SPU__
+ #define __RADSPU__
+ #define __RAD32__
+ #define __RADCELL__
+ #define __RADBIGENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #else
+ #define __RAD64REGS__
+ #define __RADPS3__
+ #define __RADPPC__
+ #define __RAD32__
+ #define __RADCELL__
+ #define __RADBIGENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #define __RADALTIVEC__
+ #endif
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #ifndef __LP32__
+ #error "PS3 32bit ABI support only"
+ #endif
+ #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__)
+ #ifdef __APPLE__
+ #include "TargetConditionals.h"
+ #endif
+
+ #if ((defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR))
+
+ // iPhone/iPad/iOS
+ #define __RADIPHONE__
+ #define __RADMACAPI__
+
+ #define __RAD32__
+ #if defined(__x86_64__)
+ #define __RAD64__
+ #endif
+
+ #define __RADLITTLEENDIAN__
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+ #define __RADMACH__
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
+ #if defined( __x86_64__)
+ #define __RADX64__
+ #else
+ #define __RADX86__
+ #endif
+ #define __RADIPHONESIM__
+ #elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+ #define __RADARM__
+ #endif
+ #else
+
+ // An actual MacOSX machine
+ #define __RADMAC__
+ #define __RADMACAPI__
+
+ #if defined(powerc) || defined(__powerc) || defined(__ppc__)
+ #define __RADPPC__
+ #define __RADBIGENDIAN__
+ #define __RADALTIVEC__
+ #define RADRESTRICT
+ #elif defined(__i386__)
+ #define __RADX86__
+ #define __RADMMX__
+ #define __RADLITTLEENDIAN__
+ #define RADRESTRICT __restrict
+ #elif defined(__x86_64__)
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX86__
+ #define __RADX64__
+ #define __RAD64REGS__
+ #define __RADMMX__
+ #define __RADLITTLEENDIAN__
+ #define RADRESTRICT __restrict
+ #else
+ #define __RAD68K__
+ #define __RADBIGENDIAN__
+ #define __RADALTIVEC__
+ #define RADRESTRICT
+ #endif
+
+ #define __RAD32__
+
+ #if defined(__MWERKS__)
+ #if (defined(__cplusplus) || ! __option(only_std_keywords))
+ #define RADINLINE inline
+ #endif
+ #ifdef __MACH__
+ #define __RADMACH__
+ #endif
+ #elif defined(__MRC__)
+ #if defined(__cplusplus)
+ #define RADINLINE inline
+ #endif
+ #elif defined(__GNUC__) || defined(__GNUG__) || defined(__MACH__)
+ #define RADINLINE inline
+ #define __RADMACH__
+
+ #undef RADRESTRICT /* could have been defined above... */
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+ #endif
+
+ #ifdef __RADX86__
+ #ifndef __RADCARBON__
+ #define __RADCARBON__
+ #endif
+ #endif
+
+ #ifdef TARGET_API_MAC_CARBON
+ #if TARGET_API_MAC_CARBON
+ #ifndef __RADCARBON__
+ #define __RADCARBON__
+ #endif
+ #endif
+ #endif
+ #endif
+ #elif defined(__linux__)
+
+ #define __RADLINUX__
+ #define __RADMMX__
+ #define __RADLITTLEENDIAN__
+ #define __RADX86__
+ #ifdef __x86_64
+ #define __RAD32__
+ #define __RAD64__
+ #define __RADX64__
+ #define __RAD64REGS__
+ #else
+ #define __RAD32__
+ #endif
+ #define RADINLINE inline
+ #define RADRESTRICT __restrict
+
+ #undef RADSTRUCT
+ #define RADSTRUCT struct __attribute__((__packed__))
+
+ #else
+
+ #if _MSC_VER >= 1400
+ #undef RADRESTRICT
+ #define RADRESTRICT __restrict
+ #else
+ #define RADRESTRICT
+ #define __RADNOVARARGMACROS__
+ #endif
+
+ #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) )
+ // Remember that Xenon also defines _XBOX
+ #define __RADPPC__
+ #define __RADBIGENDIAN__
+ #define __RADALTIVEC__
+ #else
+ #define __RADX86__
+ #define __RADMMX__
+ #define __RADLITTLEENDIAN__
+ #endif
+
+ #ifdef __MWERKS__
+ #define _WIN32
+ #endif
+
+ #ifdef __DOS__
+ #define __RADDOS__
+ #define S64_DEFINED // turn off these types
+ #define U64_DEFINED
+ #define S64 double //should error
+ #define U64 double //should error
+ #define __RADNOVARARGMACROS__
+ #endif
+
+ #ifdef __386__
+ #define __RAD32__
+ #endif
+
+ #ifdef _Windows //For Borland
+ #ifdef __WIN32__
+ #define WIN32
+ #else
+ #define __WINDOWS__
+ #endif
+ #endif
+
+ #ifdef _WINDOWS //For MS
+ #ifndef _WIN32
+ #define __WINDOWS__
+ #endif
+ #endif
+
+ #ifdef _WIN32
+ #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) )
+ // Remember that Xenon also defines _XBOX
+ #define __RADXENON__
+ #define __RAD64REGS__
+ #elif defined(_XBOX)
+ #define __RADXBOX__
+ #elif !defined(__RADWINRTAPI__)
+ #define __RADNT__
+ #endif
+ #define __RADWIN__
+ #define __RAD32__
+ #else
+ #ifdef __NT__
+ #if defined(_XENON) || (_XBOX_VER == 200)
+ // Remember that Xenon also defines _XBOX
+ #define __RADXENON__
+ #define __RAD64REGS__
+ #elif defined(_XBOX)
+ #define __RADXBOX__
+ #else
+ #define __RADNT__
+ #endif
+ #define __RADWIN__
+ #define __RAD32__
+ #else
+ #ifdef __WINDOWS_386__
+ #define __RADWIN__
+ #define __RADWINEXT__
+ #define __RAD32__
+ #define S64_DEFINED // turn off these types
+ #define U64_DEFINED
+ #define S64 double //should error
+ #define U64 double //should error
+ #else
+ #ifdef __WINDOWS__
+ #define __RADWIN__
+ #define __RAD16__
+ #else
+ #ifdef WIN32
+ #if defined(_XENON) || (_XBOX_VER == 200)
+ // Remember that Xenon also defines _XBOX
+ #define __RADXENON__
+ #elif defined(_XBOX)
+ #define __RADXBOX__
+ #else
+ #define __RADNT__
+ #endif
+ #define __RADWIN__
+ #define __RAD32__
+ #endif
+ #endif
+ #endif
+ #endif
+ #endif
+
+ #ifdef __WATCOMC__
+ #define RADINLINE
+ #else
+ #define RADINLINE __inline
+ #endif
+ #endif
+
+ #if defined __RADMAC__ || defined __RADIPHONE__
+ #define __RADBSD__
+ #endif
+
+ #if defined __RADBSD__ || defined __RADLINUX__
+ #define __RADPOSIX__
+ #endif
+
+ #if (!defined(__RADDOS__) && !defined(__RADWIN__) && !defined(__RADMAC__) && \
+ !defined(__RADNGC__) && !defined(__RADNDS__) && !defined(__RADXBOX__) && \
+ !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADPS4__) && !defined(__RADLINUX__) && !defined(__RADPS2__) && \
+ !defined(__RADPSP__) && !defined(__RADPSP2__) && !defined(__RADPS3__) && !defined(__RADSPU__) && \
+ !defined(__RADWII__) && !defined(__RADIPHONE__) && !defined(__RADX32__) && !defined(__RADARM__) && \
+ !defined(__RADWIIU__) && !defined(__RADANDROID__) && !defined(__RADNACL__) && !defined (__RADQNX__) )
+ #error "RAD.H did not detect your platform. Define DOS, WINDOWS, WIN32, macintosh, powerpc, or appropriate console."
+ #endif
+
+
+ #ifdef __RADFINAL__
+ #define RADTODO(str) { char __str[0]=str; }
+ #else
+ #define RADTODO(str)
+ #endif
+
+ #ifdef __RADX32__
+ #if defined(_MSC_VER)
+ #define RADLINK __stdcall
+ #define RADEXPLINK __stdcall
+ #else
+ #define RADLINK __attribute__((stdcall))
+ #define RADEXPLINK __attribute__((stdcall))
+ #endif
+ #define RADEXPFUNC RADDEFFUNC
+
+ #elif (defined(__RADNGC__) || defined(__RADWII__) || defined( __RADPS2__) || \
+ defined(__RADPSP__) || defined(__RADPSP2__) || defined(__RADPS3__) || \
+ defined(__RADSPU__) || defined(__RADNDS__) || defined(__RADIPHONE__) || \
+ (defined(__RADARM__) && !defined(__RADWINRTAPI__)) || defined(__RADWIIU__) || defined(__RADPS4__) )
+
+ #define RADLINK
+ #define RADEXPLINK
+ #define RADEXPFUNC RADDEFFUNC
+ #define RADASMLINK
+
+ #elif defined(__RADANDROID__)
+ #define RADLINK
+ #define RADEXPLINK
+ #define RADEXPFUNC RADDEFFUNC
+ #define RADASMLINK
+ #elif defined(__RADNACL__)
+ #define RADLINK
+ #define RADEXPLINK
+ #define RADEXPFUNC RADDEFFUNC
+ #define RADASMLINK
+ #elif defined(__RADLINUX__) || defined (__RADQNX__)
+
+ #ifdef __RAD64__
+ #define RADLINK
+ #define RADEXPLINK
+ #else
+ #define RADLINK __attribute__((cdecl))
+ #define RADEXPLINK __attribute__((cdecl))
+ #endif
+
+ #define RADEXPFUNC RADDEFFUNC
+ #define RADASMLINK
+
+ #elif defined(__RADMAC__)
+
+ // this define is for CodeWarrior 11's stupid new libs (even though
+ // we don't use longlong's).
+
+ #define __MSL_LONGLONG_SUPPORT__
+
+ #define RADLINK
+ #define RADEXPLINK
+
+ #if defined(__CFM68K__) || defined(__MWERKS__)
+ #ifdef __RADINDLL__
+ #define RADEXPFUNC RADDEFFUNC __declspec(export)
+ #else
+ #define RADEXPFUNC RADDEFFUNC __declspec(import)
+ #endif
+ #else
+ #if defined(__RADMACH__) && !defined(__MWERKS__)
+ #ifdef __RADINDLL__
+ #define RADEXPFUNC RADDEFFUNC __attribute__((visibility("default")))
+ #else
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+ #else
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+ #endif
+ #define RADASMLINK
+
+ #else
+
+ #ifdef __RADNT__
+ #ifndef _WIN32
+ #define _WIN32
+ #endif
+ #ifndef WIN32
+ #define WIN32
+ #endif
+ #endif
+
+ #ifdef __RADWIN__
+ #ifdef __RAD32__
+
+ #ifdef __RADXBOX__
+
+ #define RADLINK __stdcall
+ #define RADEXPLINK __stdcall
+ #define RADEXPFUNC RADDEFFUNC
+
+ #elif defined(__RADXENON__) || defined(__RADDURANGO__)
+
+ #define RADLINK __stdcall
+ #define RADEXPLINK __stdcall
+
+ #define RADEXPFUNC RADDEFFUNC
+
+ #elif defined(__RADWINRTAPI__)
+
+ #define RADLINK __stdcall
+ #define RADEXPLINK __stdcall
+
+ #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) )
+ #define RADEXPFUNC RADDEFFUNC
+ #else
+ #ifndef __RADINDLL__
+ #define RADEXPFUNC RADDEFFUNC __declspec(dllimport)
+ #else
+ #define RADEXPFUNC RADDEFFUNC __declspec(dllexport)
+ #endif
+ #endif
+
+ #elif defined(__RADNTBUILDLINUX__)
+
+ #define RADLINK __cdecl
+ #define RADEXPLINK __cdecl
+ #define RADEXPFUNC RADDEFFUNC
+
+ #else
+ #ifdef __RADNT__
+
+ #define RADLINK __stdcall
+ #define RADEXPLINK __stdcall
+
+ #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) )
+ #define RADEXPFUNC RADDEFFUNC
+ #else
+ #ifndef __RADINDLL__
+ #define RADEXPFUNC RADDEFFUNC __declspec(dllimport)
+ #ifdef __BORLANDC__
+ #if __BORLANDC__<=0x460
+ #undef RADEXPFUNC
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+ #endif
+ #else
+ #define RADEXPFUNC RADDEFFUNC __declspec(dllexport)
+ #endif
+ #endif
+ #else
+ #define RADLINK __pascal
+ #define RADEXPLINK __far __pascal
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+ #endif
+ #else
+ #define RADLINK __pascal
+ #define RADEXPLINK __far __pascal __export
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+ #else
+ #define RADLINK __pascal
+ #define RADEXPLINK __pascal
+ #define RADEXPFUNC RADDEFFUNC
+ #endif
+
+ #define RADASMLINK __cdecl
+
+ #endif
+
+ #if !defined(__RADXBOX__) && !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADXBOXONE__)
+ #ifdef __RADWIN__
+ #ifndef _WINDOWS
+ #define _WINDOWS
+ #endif
+ #endif
+ #endif
+
+ #ifdef __RADLITTLEENDIAN__
+ #ifdef __RADBIGENDIAN__
+ #error both endians !?
+ #endif
+ #endif
+
+ #if !defined(__RADLITTLEENDIAN__) && !defined(__RADBIGENDIAN__)
+ #error neither endian!
+ #endif
+
+
+ //-----------------------------------------------------------------
+
+ #ifndef RADDEFFUNC
+
+ #ifdef __cplusplus
+ #define RADDEFFUNC extern "C"
+ #define RADDEFSTART extern "C" {
+ #define RADDEFEND }
+ #define RADDEFINEDATA extern "C"
+ #define RADDECLAREDATA extern "C"
+ #define RADDEFAULT( val ) =val
+
+ #define RR_NAMESPACE rr
+ #define RR_NAMESPACE_START namespace RR_NAMESPACE {
+ #define RR_NAMESPACE_END };
+ #define RR_NAMESPACE_USE using namespace RR_NAMESPACE;
+
+ #else
+ #define RADDEFFUNC
+ #define RADDEFSTART
+ #define RADDEFEND
+ #define RADDEFINEDATA
+ #define RADDECLAREDATA extern
+ #define RADDEFAULT( val )
+
+ #define RR_NAMESPACE
+ #define RR_NAMESPACE_START
+ #define RR_NAMESPACE_END
+ #define RR_NAMESPACE_USE
+
+ #endif
+
+ #endif
+
+ // probably s.b: RAD_DECLARE_ALIGNED(type, name, alignment)
+ #if (defined(__RADWII__) || defined(__RADWIIU__) || defined(__RADPSP__) || defined(__RADPSP2__) || \
+ defined(__RADPS3__) || defined(__RADSPU__) || defined(__RADPS4__) || \
+ defined(__RADLINUX__) || defined(__RADMAC__)) || defined(__RADNDS__) || defined(__RAD3DS__) || \
+ defined(__RADIPHONE__) || defined(__RADANDROID__) || defined (__RADQNX__)
+ #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var
+ #elif (defined(__RADNGC__) || defined(__RADPS2__))
+ #define RAD_ALIGN(type,var,num) __attribute__ ((aligned (num))) type var
+ #elif (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__RADWINRTAPI__)
+ #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var
+ #else
+ // NOTE: / / is a guaranteed parse error in C/C++.
+ #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / /
+ #endif
+
+ // WARNING : RAD_TLS should really only be used for debug/tools stuff
+ // it's not reliable because even if we are built as a lib, our lib can
+ // be put into a DLL and then it doesn't work
+ #if defined(__RADNT__) || defined(__RADXENON__)
+ #ifndef __RADINDLL__
+ // note that you can't use this in windows DLLs
+ #define RAD_TLS(type,var) __declspec(thread) type var
+ #endif
+ #elif defined(__RADPS3__) || defined(__RADLINUX__) || defined(__RADMAC__)
+ // works on PS3/gcc I believe :
+ #define RAD_TLS(type,var) __thread type var
+ #else
+ // RAD_TLS not defined
+ #endif
+
+ // Note that __RAD16__/__RAD32__/__RAD64__ refers to the size of a pointer.
+ // The size of integers is specified explicitly in the code, i.e. u32 or whatever.
+
+ #define RAD_S8 signed char
+ #define RAD_U8 unsigned char
+
+ #if defined(__RAD64__)
+ // Remember that __RAD32__ will also be defined!
+ #if defined(__RADX64__)
+ // x64 still has 32-bit ints!
+ #define RAD_U32 unsigned int
+ #define RAD_S32 signed int
+ // But pointers are 64 bits.
+ #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 )
+ #define RAD_SINTa __w64 signed __int64
+ #define RAD_UINTa __w64 unsigned __int64
+ #else // non-vc.net compiler or /Wp64 turned off
+ #define RAD_UINTa unsigned long long
+ #define RAD_SINTa signed long long
+ #endif
+ #else
+ #error Unknown 64-bit processor (see radbase.h)
+ #endif
+ #elif defined(__RAD32__)
+ #define RAD_U32 unsigned int
+ #define RAD_S32 signed int
+ // Pointers are 32 bits.
+
+ #if ( ( defined(_MSC_VER) && (_MSC_VER >= 1300 ) ) && ( defined(_Wp64) && ( _Wp64 ) ) )
+ #define RAD_SINTa __w64 signed long
+ #define RAD_UINTa __w64 unsigned long
+ #else // non-vc.net compiler or /Wp64 turned off
+ #ifdef _Wp64
+ #define RAD_SINTa signed long
+ #define RAD_UINTa unsigned long
+ #else
+ #define RAD_SINTa signed int
+ #define RAD_UINTa unsigned int
+ #endif
+ #endif
+ #else
+ #define RAD_U32 unsigned long
+ #define RAD_S32 signed long
+ // Pointers in 16-bit land are still 32 bits.
+ #define RAD_UINTa unsigned long
+ #define RAD_SINTa signed long
+ #endif
+
+ #define RAD_F32 float
+ #if defined(__RADPS2__) || defined(__RADPSP__)
+ typedef RADSTRUCT RAD_F64 // do this so that we don't accidentally use doubles
+ { // while using the same space
+ RAD_U32 vals[ 2 ];
+ } RAD_F64;
+ #define RAD_F64_OR_32 float // type is F64 if available, otherwise F32
+ #else
+ #define RAD_F64 double
+ #define RAD_F64_OR_32 double // type is F64 if available, otherwise F32
+ #endif
+
+ #if (defined(__RADMAC__) || defined(__MRC__) || defined( __RADNGC__ ) || \
+ defined(__RADLINUX__) || defined( __RADWII__ ) || defined(__RADWIIU__) || \
+ defined(__RADNDS__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADPS4__) || \
+ defined(__RADSPU__) || defined(__RADIPHONE__) || defined(__RADNACL__) || defined( __RADANDROID__) || defined( __RADQNX__ ) )
+ #define RAD_U64 unsigned long long
+ #define RAD_S64 signed long long
+ #elif defined(__RADPS2__)
+ #define RAD_U64 unsigned long
+ #define RAD_S64 signed long
+ #elif defined(__RADARM__)
+ #define RAD_U64 unsigned long long
+ #define RAD_S64 signed long long
+ #elif defined(__RADX64__) || defined(__RAD32__)
+ #define RAD_U64 unsigned __int64
+ #define RAD_S64 signed __int64
+ #else
+ // 16-bit
+ typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s
+ { // while using the same space
+ RAD_U32 vals[ 2 ];
+ } RAD_U64;
+ typedef RADSTRUCT RAD_S64 // do this so that we don't accidentally use S64s
+ { // while using the same space
+ RAD_S32 vals[ 2 ];
+ } RAD_S64;
+ #endif
+
+ #if defined(__RAD32__)
+ #define PTR4
+ #define RAD_U16 unsigned short
+ #define RAD_S16 signed short
+ #else
+ #define PTR4 __far
+ #define RAD_U16 unsigned int
+ #define RAD_S16 signed int
+ #endif
+
+ //-------------------------------------------------
+ // RAD_PTRBITS and such defined here without using sizeof()
+ // so that they can be used in align() and other macros
+
+ #ifdef __RAD64__
+
+ #define RAD_PTRBITS 64
+ #define RAD_PTRBYTES 8
+ #define RAD_TWOPTRBYTES 16
+
+ #else
+
+ #define RAD_PTRBITS 32
+ #define RAD_PTRBYTES 4
+ #define RAD_TWOPTRBYTES 8
+
+ #endif
+
+
+ //-------------------------------------------------
+ // UINTr = int the size of a register
+
+ #ifdef __RAD64REGS__
+
+ #define RAD_UINTr RAD_U64
+ #define RAD_SINTr RAD_S64
+
+ #else
+
+ #define RAD_UINTr RAD_U32
+ #define RAD_SINTr RAD_S32
+
+ #endif
+
+ //===========================================================================
+
+ /*
+ // CB : meh this is enough of a mess that it's probably best to just let each
+ #if defined(__RADX86__) && defined(_MSC_VER) && _MSC_VER >= 1300
+ #define __RADX86INTRIN2003__
+ #endif
+ */
+
+ // RADASSUME(expr) tells the compiler that expr is always true
+ // RADUNREACHABLE must never be reachable - even in event of error
+ // eg. it's okay for compiler to generate completely invalid code after RADUNREACHABLE
+
+ #ifdef _MSC_VER
+ #define RADFORCEINLINE __forceinline
+ #if _MSC_VER >= 1300
+ #define RADNOINLINE __declspec(noinline)
+ #else
+ #define RADNOINLINE
+ #endif
+ #define RADUNREACHABLE __assume(0)
+ #define RADASSUME(exp) __assume(exp)
+ #elif defined(__clang__)
+ #ifdef _DEBUG
+ #define RADFORCEINLINE inline
+ #else
+ #define RADFORCEINLINE inline __attribute((always_inline))
+ #endif
+ #define RADNOINLINE __attribute__((noinline))
+
+ #define RADUNREACHABLE __builtin_unreachable()
+
+ #if __has_builtin(__builtin_assume)
+ #define RADASSUME(exp) __builtin_assume(exp)
+ #else
+ #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); )
+ #endif
+ #elif (defined(__GCC__) || defined(__GNUC__)) || defined(ANDROID)
+ #ifdef _DEBUG
+ #define RADFORCEINLINE inline
+ #else
+ #define RADFORCEINLINE inline __attribute((always_inline))
+ #endif
+ #define RADNOINLINE __attribute__((noinline))
+
+ #if __RAD_GCC_VERSION__ >= 40500
+ #define RADUNREACHABLE __builtin_unreachable()
+ #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); )
+ #else
+ #define RADUNREACHABLE RAD_INFINITE_LOOP( RR_BREAK(); )
+ #define RADASSUME(exp)
+ #endif
+ #elif defined(__CWCC__)
+ #define RADFORCEINLINE inline
+ #define RADNOINLINE __attribute__((never_inline))
+ #define RADUNREACHABLE
+ #define RADASSUME(x) (void)0
+ #else
+ // ? #define RADFORCEINLINE ?
+ #define RADFORCEINLINE inline
+ #define RADNOINLINE
+ #define RADASSUME(x) (void)0
+ #endif
+
+ //===========================================================================
+
+ // RAD_ALIGN_HINT tells the compiler how a given pointer is aligned
+ // it *must* be true, but the compiler may or may not use that information
+ // it is not for cases where the pointer is to an inherently aligned data type,
+ // it's when the compiler cannot tell the alignment but you have extra information.
+ // eg :
+ // U8 * ptr = rrMallocAligned(256,16);
+ // RAD_ALIGN_HINT(ptr,16,0);
+
+ #ifdef __RADSPU__
+ #define RAD_ALIGN_HINT(ptr,alignment,offset) __align_hint(ptr,alignment,offset); RR_ASSERT( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) )
+ #else
+ #define RAD_ALIGN_HINT(ptr,alignment,offset) RADASSUME( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) )
+ #endif
+
+ //===========================================================================
+
+ // RAD_EXPECT is to tell the compiler the *likely* value of an expression
+ // different than RADASSUME in that expr might not have that value
+ // it's use for branch code layout and static branch prediction
+ // condition can technically be a variable but should usually be 0 or 1
+
+ #if (defined(__GCC__) || defined(__GNUC__)) || defined(__clang__)
+
+ // __builtin_expect returns value of expr
+ #define RAD_EXPECT(expr,cond) __builtin_expect(expr,cond)
+
+ #else
+
+ #define RAD_EXPECT(expr,cond) (expr)
+
+ #endif
+
+ // helpers for doing an if ( ) with expect :
+ // if ( RAD_LIKELY(expr) ) { ... }
+
+ #define RAD_LIKELY(expr) RAD_EXPECT(expr,1)
+ #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0)
+
+ //===========================================================================
+
+ // __RADX86ASM__ means you can use __asm {} style inline assembly
+ #if defined(__RADX86__) && !defined(__RADX64__) && defined(_MSC_VER)
+ #define __RADX86ASM__
+ #endif
+
+ //-------------------------------------------------
+ // typedefs :
+
+ #ifndef RADNOTYPEDEFS
+
+ #ifndef S8_DEFINED
+ #define S8_DEFINED
+ typedef RAD_S8 S8;
+ #endif
+
+ #ifndef U8_DEFINED
+ #define U8_DEFINED
+ typedef RAD_U8 U8;
+ #endif
+
+ #ifndef S16_DEFINED
+ #define S16_DEFINED
+ typedef RAD_S16 S16;
+ #endif
+
+ #ifndef U16_DEFINED
+ #define U16_DEFINED
+ typedef RAD_U16 U16;
+ #endif
+
+ #ifndef S32_DEFINED
+ #define S32_DEFINED
+ typedef RAD_S32 S32;
+ #endif
+
+ #ifndef U32_DEFINED
+ #define U32_DEFINED
+ typedef RAD_U32 U32;
+ #endif
+
+ #ifndef S64_DEFINED
+ #define S64_DEFINED
+ typedef RAD_S64 S64;
+ #endif
+
+ #ifndef U64_DEFINED
+ #define U64_DEFINED
+ typedef RAD_U64 U64;
+ #endif
+
+ #ifndef F32_DEFINED
+ #define F32_DEFINED
+ typedef RAD_F32 F32;
+ #endif
+
+ #ifndef F64_DEFINED
+ #define F64_DEFINED
+ typedef RAD_F64 F64;
+ #endif
+
+ #ifndef F64_OR_32_DEFINED
+ #define F64_OR_32_DEFINED
+ typedef RAD_F64_OR_32 F64_OR_32;
+ #endif
+
+ // UINTa and SINTa are the ints big enough for an address
+
+ #ifndef SINTa_DEFINED
+ #define SINTa_DEFINED
+ typedef RAD_SINTa SINTa;
+ #endif
+
+ #ifndef UINTa_DEFINED
+ #define UINTa_DEFINED
+ typedef RAD_UINTa UINTa;
+ #endif
+
+ #ifndef UINTr_DEFINED
+ #define UINTr_DEFINED
+ typedef RAD_UINTr UINTr;
+ #endif
+
+ #ifndef SINTr_DEFINED
+ #define SINTr_DEFINED
+ typedef RAD_SINTr SINTr;
+ #endif
+
+ #elif !defined(RADNOTYPEDEFINES)
+
+ #ifndef S8_DEFINED
+ #define S8_DEFINED
+ #define S8 RAD_S8
+ #endif
+
+ #ifndef U8_DEFINED
+ #define U8_DEFINED
+ #define U8 RAD_U8
+ #endif
+
+ #ifndef S16_DEFINED
+ #define S16_DEFINED
+ #define S16 RAD_S16
+ #endif
+
+ #ifndef U16_DEFINED
+ #define U16_DEFINED
+ #define U16 RAD_U16
+ #endif
+
+ #ifndef S32_DEFINED
+ #define S32_DEFINED
+ #define S32 RAD_S32
+ #endif
+
+ #ifndef U32_DEFINED
+ #define U32_DEFINED
+ #define U32 RAD_U32
+ #endif
+
+ #ifndef S64_DEFINED
+ #define S64_DEFINED
+ #define S64 RAD_S64
+ #endif
+
+ #ifndef U64_DEFINED
+ #define U64_DEFINED
+ #define U64 RAD_U64
+ #endif
+
+ #ifndef F32_DEFINED
+ #define F32_DEFINED
+ #define F32 RAD_F32
+ #endif
+
+ #ifndef F64_DEFINED
+ #define F64_DEFINED
+ #define F64 RAD_F64
+ #endif
+
+ #ifndef F64_OR_32_DEFINED
+ #define F64_OR_32_DEFINED
+ #define F64_OR_32 RAD_F64_OR_32
+ #endif
+
+ // UINTa and SINTa are the ints big enough for an address (pointer)
+ #ifndef SINTa_DEFINED
+ #define SINTa_DEFINED
+ #define SINTa RAD_SINTa
+ #endif
+
+ #ifndef UINTa_DEFINED
+ #define UINTa_DEFINED
+ #define UINTa RAD_UINTa
+ #endif
+
+ #ifndef UINTr_DEFINED
+ #define UINTr_DEFINED
+ #define UINTr RAD_UINTr
+ #endif
+
+ #ifndef SINTr_DEFINED
+ #define SINTr_DEFINED
+ #define SINTr RAD_SINTr
+ #endif
+
+ #endif
+
+ /// Some error-checking.
+ #if defined(__RAD64__) && !defined(__RAD32__)
+ // See top of file for why this is.
+ #error __RAD64__ must not be defined without __RAD32__ (see radbase.h)
+ #endif
+
+#ifdef _MSC_VER
+ // microsoft compilers
+
+ #if _MSC_VER >= 1400
+ #define RAD_STATEMENT_START \
+ do {
+
+ #define RAD_STATEMENT_END_FALSE \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ } while(0) \
+ __pragma(warning(pop))
+
+ #define RAD_STATEMENT_END_TRUE \
+ __pragma(warning(push)) \
+ __pragma(warning(disable:4127)) \
+ } while(1) \
+ __pragma(warning(pop))
+
+ #else
+ #define RAD_USE_STANDARD_LOOP_CONSTRUCT
+ #endif
+#else
+ #define RAD_USE_STANDARD_LOOP_CONSTRUCT
+#endif
+
+#ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT
+ #define RAD_STATEMENT_START \
+ do {
+
+ #define RAD_STATEMENT_END_FALSE \
+ } while ( (void)0,0 )
+
+ #define RAD_STATEMENT_END_TRUE \
+ } while ( (void)1,1 )
+
+#endif
+
+#define RAD_STATEMENT_WRAPPER( code ) \
+ RAD_STATEMENT_START \
+ code \
+ RAD_STATEMENT_END_FALSE
+
+#define RAD_INFINITE_LOOP( code ) \
+ RAD_STATEMENT_START \
+ code \
+ RAD_STATEMENT_END_TRUE
+
+
+// Must be placed after variable declarations for code compiled as .c
+#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later
+# define RR_UNUSED_VARIABLE(x) (void) x
+#else
+# define RR_UNUSED_VARIABLE(x) (void)(sizeof(x))
+#endif
+
+//-----------------------------------------------
+// RR_UINT3264 is a U64 in 64-bit code and a U32 in 32-bit code
+// eg. it's pointer sized and the same type as a U32/U64 of the same size
+//
+// @@ CB 05/21/2012 : I think RR_UINT3264 may be deprecated
+// it was useful back when UINTa was /Wp64
+// but since we removed that maybe it's not anymore ?
+//
+
+#ifdef __RAD64__
+#define RR_UINT3264 U64
+#else
+#define RR_UINT3264 U32
+#endif
+
+//RR_COMPILER_ASSERT( sizeof(RR_UINT3264) == sizeof(UINTa) );
+
+//--------------------------------------------------
+
+// RR_LINESTRING is the current line number as a string
+#define RR_STRINGIZE( L ) #L
+#define RR_DO_MACRO( M, X ) M(X)
+#define RR_STRINGIZE_DELAY( X ) RR_DO_MACRO( RR_STRINGIZE, X )
+#define RR_LINESTRING RR_STRINGIZE_DELAY( __LINE__ )
+
+#define RR_CAT(X,Y) X ## Y
+
+// RR_STRING_JOIN joins strings in the preprocessor and works with LINESTRING
+#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2)
+#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2)
+#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2
+
+// RR_NUMBERNAME is a macro to make a name unique, so that you can use it to declare
+// variable names and they won't conflict with each other
+// using __LINE__ is broken in MSVC with /ZI , but __COUNTER__ is an MSVC extension that works
+
+#ifdef _MSC_VER
+ #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__)
+#else
+ #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__)
+#endif
+
+//--------------------------------------------------
+// current plan is to use "rrbool" with plain old "true" and "false"
+// if true and false give us trouble we might have to go to rrtrue and rrfalse
+// BTW there's a danger for evil bugs here !! If you're checking == true
+// then the rrbool must be set to exactly "1" not just "not zero" !!
+
+#ifndef RADNOTYPEDEFS
+ #ifndef RRBOOL_DEFINED
+ #define RRBOOL_DEFINED
+ typedef S32 rrbool;
+ typedef S32 RRBOOL;
+ #endif
+#elif !defined(RADNOTYPEDEFINES)
+ #ifndef RRBOOL_DEFINED
+ #define RRBOOL_DEFINED
+ #define rrbool S32
+ #define RRBOOL S32
+ #endif
+#endif
+
+//--------------------------------------------------
+// Range macros
+
+ #ifndef RR_MIN
+ #define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) )
+ #endif
+
+ #ifndef RR_MAX
+ #define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) )
+ #endif
+
+ #ifndef RR_ABS
+ #define RR_ABS(a) ( ((a) < 0) ? -(a) : (a) )
+ #endif
+
+ #ifndef RR_CLAMP
+ #define RR_CLAMP(val,lo,hi) RR_MAX( RR_MIN(val,hi), lo )
+ #endif
+
+//--------------------------------------------------
+// Data layout macros
+
+ #define RR_ARRAY_SIZE(array) ( sizeof(array)/sizeof(array[0]) )
+
+ // MEMBER_OFFSET tells you the offset of a member in a type
+ #ifdef __RAD3DS__
+ #define RR_MEMBER_OFFSET(type,member) (unsigned int)(( (char *) &(((type *)0)->member) - (char *) 0 ))
+ #elif defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADSPU__)
+ // offsetof() gets mucked with by system headers on android, making things dependent on #include order.
+ #define RR_MEMBER_OFFSET(type,member) __builtin_offsetof(type, member)
+ #elif defined(__RADLINUX__)
+ #define RR_MEMBER_OFFSET(type,member) (offsetof(type, member))
+ #else
+ #define RR_MEMBER_OFFSET(type,member) ( (size_t) (UINTa) &(((type *)0)->member) )
+ #endif
+
+ // MEMBER_SIZE tells you the size of a member in a type
+ #define RR_MEMBER_SIZE(type,member) ( sizeof( ((type *) 0)->member) )
+
+ // just to make gcc shut up about derefing null :
+ #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) )
+ #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) )
+
+ // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object
+ // you should then RR_ASSERT( &(ret->member) == ptr );
+ #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) )
+
+//--------------------------------------------------
+// Cache / prefetch macros :
+
+// RR_PREFETCH for various platforms :
+//
+// RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan
+// platforms that automatically prefetch sequential (eg. PC) should be a no-op here
+// RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined
+// (may be a no-op, may be a normal prefetch, may zero memory)
+// warning : RR_PREFETCH_WRITE_INVALIDATE may write memory so don't do it past the end of buffers
+
+#ifdef __RADX86__
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // nop
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop
+
+#elif defined(__RADXENON__)
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((int)(offset),(void *)(ptr))
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz128((int)(offset),(void *)(ptr))
+
+#elif defined(__RADPS3__)
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((char *)(ptr) + (int)(offset))
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz((char *)(ptr) + (int)(offset))
+
+#elif defined(__RADSPU__)
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop
+
+#elif defined(__RADWII__) || defined(__RADWIIU__)
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP for now
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop
+
+#elif defined(__RAD3DS__)
+
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __pld((char *)(ptr) + (int)(offset))
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __pldw((char *)(ptr) + (int)(offset))
+
+#else
+
+// other platform
+#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // need_prefetch // compile error
+#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // need_writezero // error
+
+#endif
+
+//--------------------------------------------------
+// LIGHTWEIGHT ASSERTS without rrAssert.h
+
+RADDEFSTART
+
+// set up RR_BREAK :
+
+ #ifdef __RADNGC__
+
+ #define RR_BREAK() asm(" .long 0x00000001")
+ #define RR_CACHE_LINE_SIZE xxx
+
+ #elif defined(__RADWII__)
+
+ #define RR_BREAK() __asm__ volatile("trap")
+ #define RR_CACHE_LINE_SIZE 32
+
+ #elif defined(__RADWIIU__)
+
+ #define RR_BREAK() asm("trap")
+ #define RR_CACHE_LINE_SIZE 32
+
+ #elif defined(__RAD3DS__)
+
+ #define RR_BREAK() *((int volatile*)0)=0
+ #define RR_CACHE_LINE_SIZE 32
+
+ #elif defined(__RADNDS__)
+
+ #define RR_BREAK() asm("BKPT 0")
+ #define RR_CACHE_LINE_SIZE xxx
+
+ #elif defined(__RADPS2__)
+
+ #define RR_BREAK() __asm__ volatile("break")
+ #define RR_CACHE_LINE_SIZE 64
+
+ #elif defined(__RADPSP__)
+
+ #define RR_BREAK() __asm__("break 0")
+ #define RR_CACHE_LINE_SIZE 64
+
+ #elif defined(__RADPSP2__)
+
+ #define RR_BREAK() { __asm__ volatile("bkpt 0x0000"); }
+ #define RR_CACHE_LINE_SIZE 32
+
+ #elif defined (__RADQNX__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 32
+ #elif defined (__RADARM__) && defined (__RADLINUX__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 32
+ #elif defined(__RADSPU__)
+
+ #define RR_BREAK() __asm volatile ("stopd 0,1,1")
+ #define RR_CACHE_LINE_SIZE 128
+
+ #elif defined(__RADPS3__)
+
+ // #ifdef snPause // in LibSN.h
+ // snPause
+ // __asm__ volatile ( "tw 31,1,1" )
+
+ #define RR_BREAK() __asm__ volatile ( "tw 31,1,1" )
+ //#define RR_BREAK() __asm__ volatile("trap");
+
+ #define RR_CACHE_LINE_SIZE 128
+
+ #elif defined(__RADMAC__)
+
+ #if defined(__GNUG__) || defined(__GNUC__)
+ #ifdef __RADX86__
+ #define RR_BREAK() __asm__ volatile ( "int $3" )
+ #else
+ #define RR_BREAK() __builtin_trap()
+ #endif
+ #else
+ #ifdef __RADMACH__
+ void DebugStr(unsigned char const *);
+ #else
+ void pascal DebugStr(unsigned char const *);
+ #endif
+ #define RR_BREAK() DebugStr("\pRR_BREAK() was called")
+ #endif
+
+ #define RR_CACHE_LINE_SIZE 64
+
+ #elif defined(__RADIPHONE__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 32
+ #elif defined(__RADXENON__)
+ #define RR_BREAK() __debugbreak()
+ #define RR_CACHE_LINE_SIZE 128
+ #elif defined(__RADANDROID__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 32
+ #elif defined(__RADPS4__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 64
+ #elif defined(__RADNACL__)
+ #define RR_BREAK() __builtin_trap()
+ #define RR_CACHE_LINE_SIZE 64
+ #else
+ // x86 :
+ #define RR_CACHE_LINE_SIZE 64
+
+ #ifdef __RADLINUX__
+ #define RR_BREAK() __asm__ volatile ( "int $3" )
+ #elif defined(__WATCOMC__)
+
+ void RR_BREAK( void );
+ #pragma aux RR_BREAK = "int 0x3";
+
+ #elif defined(__RADWIN__) && defined(_MSC_VER) && _MSC_VER >= 1300
+
+ #define RR_BREAK __debugbreak
+
+ #else
+
+ #define RR_BREAK() RAD_STATEMENT_WRAPPER( __asm {int 3} )
+
+ #endif
+
+ #endif
+
+// simple RR_ASSERT :
+
+// CB 5-27-10 : use RR_DO_ASSERTS to toggle asserts on and off :
+#if (defined(_DEBUG) && !defined(NDEBUG)) || defined(ASSERT_IN_RELEASE)
+ #define RR_DO_ASSERTS
+#endif
+
+/*********
+
+rrAsserts :
+
+RR_ASSERT(exp) - the normal assert thing, toggled with RR_DO_ASSERTS
+RR_ASSERT_ALWAYS(exp) - assert that you want to test even in ALL builds (including final!)
+RR_ASSERT_RELEASE(exp) - assert that you want to test even in release builds (not for final!)
+RR_ASSERT_LITE(exp) - normal assert is not safe from threads or inside malloc; use this instead
+RR_DURING_ASSERT(exp) - wrap operations that compute stuff for assert in here
+RR_DO_ASSERTS - toggle tells you if asserts are enabled or not
+
+RR_BREAK() - generate a debug break - always !
+RR_ASSERT_BREAK() - RR_BREAK for asserts ; disable with RAD_NO_BREAK
+
+RR_ASSERT_FAILURE(str) - just break with a messsage; like assert with no condition
+RR_ASSERT_FAILURE_ALWAYS(str) - RR_ASSERT_FAILURE in release builds too
+RR_CANT_GET_HERE() - put in spots execution should never go
+RR_COMPILER_ASSERT(exp) - checks constant conditions at compile time
+
+RADTODO - note to search for nonfinal stuff
+RR_PRAGMA_MESSAGE - message dealy, use with #pragma in MSVC
+
+*************/
+
+//-----------------------------------------------------------
+
+
+#if defined(__GNUG__) || defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER > 1200)
+ #define RR_FUNCTION_NAME __FUNCTION__
+#else
+ #define RR_FUNCTION_NAME 0
+
+ // __func__ is in the C99 standard
+#endif
+
+//-----------------------------------------------------------
+
+// rrDisplayAssertion might just log, or it might pop a message box, depending on settings
+// rrDisplayAssertion returns whether you should break or not
+typedef rrbool (RADLINK fp_rrDisplayAssertion)(int * Ignored, const char * fileName,const int line,const char * function,const char * message);
+
+extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion;
+
+// if I have func pointer, call it, else true ; true = do int 3
+#define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 )
+
+//-----------------------------------------------------------
+
+// RAD_NO_BREAK : option if you don't like your assert to break
+// CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional
+#ifdef RAD_NO_BREAK
+#define RR_ASSERT_BREAK() 0
+#else
+#define RR_ASSERT_BREAK() RR_BREAK()
+#endif
+
+// assert_always is on FINAL !
+#define RR_ASSERT_ALWAYS(exp) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( ! (exp) ) { if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,#exp) ) RR_ASSERT_BREAK(); } )
+
+// RR_ASSERT_FAILURE is like an assert without a condition - if you hit it, you're bad
+#define RR_ASSERT_FAILURE_ALWAYS(str) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,str) ) RR_ASSERT_BREAK(); )
+
+#define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } )
+
+//-----------------------------------
+#ifdef RR_DO_ASSERTS
+
+#define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp)
+#define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp)
+#define RR_ASSERT_NO_ASSUME(exp) RR_ASSERT_ALWAYS(exp)
+// RR_DURING_ASSERT is to set up expressions or declare variables that are only used in asserts
+#define RR_DURING_ASSERT(exp) exp
+
+#define RR_ASSERT_FAILURE(str) RR_ASSERT_FAILURE_ALWAYS(str)
+
+// RR_CANT_GET_HERE is for like defaults in switches that should never be hit
+#define RR_CANT_GET_HERE() RAD_STATEMENT_WRAPPER( RR_ASSERT_FAILURE("can't get here"); RADUNREACHABLE; )
+
+
+#else // RR_DO_ASSERTS //-----------------------------------
+
+#define RR_ASSERT(exp) (void)0
+#define RR_ASSERT_LITE(exp) (void)0
+#define RR_ASSERT_NO_ASSUME(exp) (void)0
+
+#define RR_DURING_ASSERT(exp) (void)0
+
+#define RR_ASSERT_FAILURE(str) (void)0
+
+#define RR_CANT_GET_HERE() RADUNREACHABLE
+
+#endif // RR_DO_ASSERTS //-----------------------------------
+
+//=================================================================
+
+// RR_ASSERT_RELEASE is on in release build, but not final
+
+#ifndef __RADFINAL__
+
+#define RR_ASSERT_RELEASE(exp) RR_ASSERT_ALWAYS(exp)
+#define RR_ASSERT_LITE_RELEASE(exp) RR_ASSERT_LITE_ALWAYS(exp)
+
+#else
+
+#define RR_ASSERT_RELEASE(exp) (void)0
+#define RR_ASSERT_LITE_RELEASE(exp) (void)0
+
+#endif
+
+// BH: This never gets compiled away except for __RADFINAL__
+#define RR_ASSERT_ALWAYS_NO_SHIP RR_ASSERT_RELEASE
+
+#define rrAssert RR_ASSERT
+#define rrassert RR_ASSERT
+
+#ifdef _MSC_VER
+ // without this, our assert errors...
+ #if _MSC_VER >= 1300
+ #pragma warning( disable : 4127) // conditional expression is constant
+ #endif
+#endif
+
+//---------------------------------------
+// Get/Put from memory in little or big endian :
+//
+// val = RR_GET32_BE(ptr)
+// RR_PUT32_BE(ptr,val)
+//
+// available here :
+// RR_[GET/PUT][16/32]_[BE/LE][_UNALIGNED][_OFFSET]
+//
+// if you don't specify _UNALIGNED , then ptr & offset shoud both be aligned to type size
+// _OFFSET is in *bytes* !
+
+// you can #define RR_GET_RESTRICT to make all RR_GETs be RESTRICT
+// if you set nothing they are not
+
+#ifdef RR_GET_RESTRICT
+#define RR_GET_PTR_POST RADRESTRICT
+#endif
+#ifndef RR_GET_PTR_POST
+#define RR_GET_PTR_POST
+#endif
+
+// native version of get/put is always trivial :
+
+#define RR_GET16_NATIVE(ptr) *((const U16 * RR_GET_PTR_POST)(ptr))
+#define RR_PUT16_NATIVE(ptr,val) *((U16 * RR_GET_PTR_POST)(ptr)) = (val)
+
+// offset is in bytes
+#define RR_U16_PTR_OFFSET(ptr,offset) ((U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+#define RR_GET16_NATIVE_OFFSET(ptr,offset) *( RR_U16_PTR_OFFSET((ptr),offset) )
+#define RR_PUT16_NATIVE_OFFSET(ptr,val,offset) *( RR_U16_PTR_OFFSET((ptr),offset)) = (val)
+
+#define RR_GET32_NATIVE(ptr) *((const U32 * RR_GET_PTR_POST)(ptr))
+#define RR_PUT32_NATIVE(ptr,val) *((U32 * RR_GET_PTR_POST)(ptr)) = (val)
+
+// offset is in bytes
+#define RR_U32_PTR_OFFSET(ptr,offset) ((U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+#define RR_GET32_NATIVE_OFFSET(ptr,offset) *( RR_U32_PTR_OFFSET((ptr),offset) )
+#define RR_PUT32_NATIVE_OFFSET(ptr,val,offset) *( RR_U32_PTR_OFFSET((ptr),offset)) = (val)
+
+#define RR_GET64_NATIVE(ptr) *((const U64 * RR_GET_PTR_POST)(ptr))
+#define RR_PUT64_NATIVE(ptr,val) *((U64 * RR_GET_PTR_POST)(ptr)) = (val)
+
+// offset is in bytes
+#define RR_U64_PTR_OFFSET(ptr,offset) ((U64 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+#define RR_GET64_NATIVE_OFFSET(ptr,offset) *( RR_U64_PTR_OFFSET((ptr),offset) )
+#define RR_PUT64_NATIVE_OFFSET(ptr,val,offset) *( RR_U64_PTR_OFFSET((ptr),offset)) = (val)
+
+//---------------------------------------------------
+
+#ifdef __RADLITTLEENDIAN__
+
+#define RR_GET16_LE RR_GET16_NATIVE
+#define RR_PUT16_LE RR_PUT16_NATIVE
+#define RR_GET16_LE_OFFSET RR_GET16_NATIVE_OFFSET
+#define RR_PUT16_LE_OFFSET RR_PUT16_NATIVE_OFFSET
+
+#define RR_GET32_LE RR_GET32_NATIVE
+#define RR_PUT32_LE RR_PUT32_NATIVE
+#define RR_GET32_LE_OFFSET RR_GET32_NATIVE_OFFSET
+#define RR_PUT32_LE_OFFSET RR_PUT32_NATIVE_OFFSET
+
+#define RR_GET64_LE RR_GET64_NATIVE
+#define RR_PUT64_LE RR_PUT64_NATIVE
+#define RR_GET64_LE_OFFSET RR_GET64_NATIVE_OFFSET
+#define RR_PUT64_LE_OFFSET RR_PUT64_NATIVE_OFFSET
+
+#else
+
+#define RR_GET16_BE RR_GET16_NATIVE
+#define RR_PUT16_BE RR_PUT16_NATIVE
+#define RR_GET16_BE_OFFSET RR_GET16_NATIVE_OFFSET
+#define RR_PUT16_BE_OFFSET RR_PUT16_NATIVE_OFFSET
+
+#define RR_GET32_BE RR_GET32_NATIVE
+#define RR_PUT32_BE RR_PUT32_NATIVE
+#define RR_GET32_BE_OFFSET RR_GET32_NATIVE_OFFSET
+#define RR_PUT32_BE_OFFSET RR_PUT32_NATIVE_OFFSET
+
+#define RR_GET64_BE RR_GET64_NATIVE
+#define RR_PUT64_BE RR_PUT64_NATIVE
+#define RR_GET64_BE_OFFSET RR_GET64_NATIVE_OFFSET
+#define RR_PUT64_BE_OFFSET RR_PUT64_NATIVE_OFFSET
+
+#endif
+
+//-------------------------
+// non-native Get/Put implementations go here :
+
+#if defined(__RADX86__)
+// good implementation for X86 :
+
+#if (_MSC_VER >= 1300)
+
+unsigned short __cdecl _byteswap_ushort (unsigned short _Short);
+unsigned long __cdecl _byteswap_ulong (unsigned long _Long);
+#pragma intrinsic(_byteswap_ushort, _byteswap_ulong)
+
+#define RR_BSWAP16 _byteswap_ushort
+#define RR_BSWAP32 _byteswap_ulong
+
+unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val);
+#pragma intrinsic(_byteswap_uint64)
+#define RR_BSWAP64 _byteswap_uint64
+
+#elif defined(_MSC_VER) // VC6
+
+RADFORCEINLINE unsigned long RR_BSWAP16 (unsigned long _Long)
+{
+ __asm {
+ mov eax, [_Long]
+ rol ax, 8
+ mov [_Long], eax;
+ }
+ return _Long;
+}
+
+RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long)
+{
+ __asm {
+ mov eax, [_Long]
+ bswap eax
+ mov [_Long], eax
+ }
+ return _Long;
+}
+
+RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long)
+{
+ __asm {
+ mov eax, DWORD PTR _Long
+ mov edx, DWORD PTR _Long+4
+ bswap eax
+ bswap edx
+ mov DWORD PTR _Long, edx
+ mov DWORD PTR _Long+4, eax
+ }
+ return _Long;
+}
+
+#elif defined(__GNUC__) || defined(__clang__)
+
+// GCC has __builtin_bswap16, but Clang only seems to have added it recently.
+// We use __builtin_bswap32/64 but 16 just uses the macro version. (No big
+// deal if that turns into shifts anyway)
+#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
+#define RR_BSWAP32 __builtin_bswap32
+#define RR_BSWAP64 __builtin_bswap64
+
+#endif
+
+#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = (U16) RR_BSWAP16(val)
+#define RR_GET16_BE_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET(ptr,offset))
+#define RR_PUT16_BE_OFFSET(ptr,val,offset) *RR_U16_PTR_OFFSET(ptr,offset) = RR_BSWAP16(val)
+
+#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+#define RR_GET32_BE_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET(ptr,offset))
+#define RR_PUT32_BE_OFFSET(ptr,val,offset) *RR_U32_PTR_OFFSET(ptr,offset) = RR_BSWAP32(val)
+
+#define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr)))
+#define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val)
+#define RR_GET64_BE_OFFSET(ptr,offset) RR_BSWAP64(*RR_U64_PTR_OFFSET(ptr,offset))
+#define RR_PUT64_BE_OFFSET(ptr,val,offset) *RR_U64_PTR_OFFSET(ptr,offset) = RR_BSWAP64(val)
+
+// end _MSC_VER
+
+#elif defined(__RADXENON__) // Xenon has built-in funcs for this
+
+unsigned short __loadshortbytereverse(int offset, const void *base);
+unsigned long __loadwordbytereverse (int offset, const void *base);
+
+void __storeshortbytereverse(unsigned short val, int offset, void *base);
+void __storewordbytereverse (unsigned int val, int offset, void *base);
+
+#define RR_GET16_LE(ptr) __loadshortbytereverse(0, ptr)
+#define RR_PUT16_LE(ptr,val) __storeshortbytereverse((U16) (val), 0, ptr)
+
+#define RR_GET16_LE_OFFSET(ptr,offset) __loadshortbytereverse(offset, ptr)
+#define RR_PUT16_LE_OFFSET(ptr,val,offset) __storeshortbytereverse((U16) (val), offset, ptr)
+
+#define RR_GET32_LE(ptr) __loadwordbytereverse(0, ptr)
+#define RR_PUT32_LE(ptr,val) __storewordbytereverse((U32) (val), 0, ptr)
+
+#define RR_GET32_LE_OFFSET(ptr,offset) __loadwordbytereverse(offset, ptr)
+#define RR_PUT32_LE_OFFSET(ptr,val,offset) __storewordbytereverse((U32) (val), offset, ptr)
+
+#define RR_GET64_LE(ptr) ( ((U64)RR_GET32_OFFSET_LE(ptr,4)<<32) | RR_GET32_LE(ptr) )
+#define RR_PUT64_LE(ptr,val) RR_PUT32_LE(ptr, (U32) (val)), RR_PUT32_OFFSET_LE(ptr, (U32) ((val)>>32),4)
+
+#elif defined(__RADPS3__)
+
+#include <ppu_intrinsics.h>
+
+#define RR_GET16_LE(ptr) __lhbrx(ptr)
+#define RR_PUT16_LE(ptr,val) __sthbrx(ptr, (U16) (val))
+
+#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(RR_U16_PTR_OFFSET(ptr, offset))
+#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx(RR_U16_PTR_OFFSET(ptr, offset), (U16) (val))
+
+#define RR_GET32_LE(ptr) __lwbrx(ptr)
+#define RR_PUT32_LE(ptr,val) __stwbrx(ptr, (U32) (val))
+
+#define RR_GET64_LE(ptr) __ldbrx(ptr)
+#define RR_PUT64_LE(ptr,val) __stdbrx(ptr, (U32) (val))
+
+#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(RR_U32_PTR_OFFSET(ptr, offset))
+#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx(RR_U32_PTR_OFFSET(ptr, offset), (U32) (val))
+
+#elif defined(__RADWII__)
+
+#define RR_GET16_LE(ptr) __lhbrx(ptr, 0)
+#define RR_PUT16_LE(ptr,val) __sthbrx((U16) (val), ptr, 0)
+
+#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(ptr, offset)
+#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx((U16) (val), ptr, offset)
+
+#define RR_GET32_LE(ptr) __lwbrx(ptr, 0)
+#define RR_PUT32_LE(ptr,val) __stwbrx((U32) (val), ptr, 0)
+
+#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(ptr, offset)
+#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx((U32) (val), ptr, offset)
+
+#elif defined(__RAD3DS__)
+
+#define RR_GET16_BE(ptr) __rev16(*(U16 *) (ptr))
+#define RR_PUT16_BE(ptr,val) *(U16 *) (ptr) = __rev16(val)
+
+#define RR_GET16_BE_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET(ptr,offset))
+#define RR_PUT16_BE_OFFSET(ptr,offset,val) *RR_U16_PTR_OFFSET(ptr,offset) = __rev16(val)
+
+#define RR_GET32_BE(ptr) __rev(*(U32 *) (ptr))
+#define RR_PUT32_BE(ptr,val) *(U32 *) (ptr) = __rev(val)
+
+#define RR_GET32_BE_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET(ptr,offset))
+#define RR_PUT32_BE_OFFSET(ptr,offset,val) *RR_U32_PTR_OFFSET(ptr,offset) = __rev(val)
+
+#elif defined(__RADIPHONE__)
+
+// iPhone does not seem to have intrinsics for this, so use generic fallback!
+
+// Bswap is just here for use of implementing get/put
+// caller should use Get/Put , not bswap
+#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
+#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) )
+
+#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
+
+#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+
+#elif defined(__RADWIIU__)
+
+#include <ppc_ghs.h>
+
+#define RR_GET16_LE(ptr) (*(__bytereversed U16 *) (ptr))
+#define RR_PUT16_LE(ptr,val) *(__bytereversed U16 *) (ptr) = val
+
+#define RR_GET16_LE_OFFSET(ptr,offset) (*(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset))
+#define RR_PUT16_LE_OFFSET(ptr,val,offset) *(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset) = val
+
+#define RR_GET32_LE(ptr) (*(__bytereversed U32 *) (ptr))
+#define RR_PUT32_LE(ptr,val) *(__bytereversed U32 *) (ptr) = val
+
+#define RR_GET32_LE_OFFSET(ptr,offset) (*(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset))
+#define RR_PUT32_LE_OFFSET(ptr,val,offset) *(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset) = val
+
+#define RR_GET64_LE(ptr) (*(__bytereversed U64 *) (ptr))
+#define RR_PUT64_LE(ptr,val) *(__bytereversed U64 *) (ptr) = val
+
+#define RR_GET64_LE_OFFSET(ptr,offset) (*(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset))
+#define RR_PUT64_LE_OFFSET(ptr,val,offset) *(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset) = val
+
+#elif defined(__RADWINRTAPI__) && defined(__RADARM__)
+
+#include <intrin.h>
+
+#define RR_BSWAP16(u16) _arm_rev16(u16)
+#define RR_BSWAP32(u32) _arm_rev(u32)
+
+#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
+
+#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+
+#elif defined(__RADPSP2__)
+
+// no rev16 exposed
+#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
+#define RR_BSWAP32(u32) __builtin_rev(u32)
+
+#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
+
+#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+
+#else // other platforms ?
+
+// fall back :
+
+// Bswap is just here for use of implementing get/put
+// caller should use Get/Put , not bswap
+#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) )
+#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) )
+#define RR_BSWAP64(u64) ( ((U64) RR_BSWAP32((U32) (u64)) << 32) | (U64) RR_BSWAP32((U32) ((u64) >> 32)) )
+
+#ifdef __RADLITTLEENDIAN__
+
+// comment out fallbacks so users will get errors
+//#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+//#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
+//#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+//#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+
+#else
+
+// comment out fallbacks so users will get errors
+//#define RR_GET16_LE(ptr) RR_BSWAP16(*((U16 *)(ptr)))
+//#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val)
+//#define RR_GET32_LE(ptr) RR_BSWAP32(*((U32 *)(ptr)))
+//#define RR_PUT32_LE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val)
+
+#endif
+
+#endif
+
+//===================================================================
+// @@ TEMP : Aliases for old names : remove me when possible :
+
+#define RR_GET32_OFFSET_LE RR_GET32_LE_OFFSET
+#define RR_GET32_OFFSET_BE RR_GET32_BE_OFFSET
+#define RR_PUT32_OFFSET_LE RR_PUT32_LE_OFFSET
+#define RR_PUT32_OFFSET_BE RR_PUT32_BE_OFFSET
+#define RR_GET16_OFFSET_LE RR_GET16_LE_OFFSET
+#define RR_GET16_OFFSET_BE RR_GET16_BE_OFFSET
+#define RR_PUT16_OFFSET_LE RR_PUT16_LE_OFFSET
+#define RR_PUT16_OFFSET_BE RR_PUT16_BE_OFFSET
+
+
+//===================================================================
+// UNALIGNED VERSIONS :
+
+#if defined(__RADX86__) || defined(__RADPPC__) // platforms where unaligned is fast :
+
+#define RR_GET32_BE_UNALIGNED(ptr) RR_GET32_BE(ptr)
+#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_BE_OFFSET(ptr,offset)
+#define RR_GET16_BE_UNALIGNED(ptr) RR_GET16_BE(ptr)
+#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_BE_OFFSET(ptr,offset)
+
+#define RR_GET32_LE_UNALIGNED(ptr) RR_GET32_LE(ptr)
+#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_LE_OFFSET(ptr,offset)
+#define RR_GET16_LE_UNALIGNED(ptr) RR_GET16_LE(ptr)
+#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_LE_OFFSET(ptr,offset)
+
+#elif defined(__RAD3DS__)
+
+// arm has a "__packed" qualifier to tell the compiler to do unaligned accesses
+#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+
+#define RR_GET32_BE_UNALIGNED(ptr) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0))
+#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset))
+#define RR_GET16_BE_UNALIGNED(ptr) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0))
+#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset))
+
+#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)
+#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)
+#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)
+#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)
+
+#elif defined(__RADPSP2__)
+
+#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((U16 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((U32 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset)))
+
+#define RR_GET32_BE_UNALIGNED(ptr) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0))
+#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset))
+#define RR_GET16_BE_UNALIGNED(ptr) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0))
+#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset))
+
+#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)
+#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)
+#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)
+#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)
+
+#else
+// Unaligned via bytes :
+
+#define RR_GET32_BE_UNALIGNED(ptr) ( \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 24 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 16 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 8 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 0 ) )
+
+#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) ( \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 24 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 16 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 8 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 0 ) )
+
+#define RR_GET16_BE_UNALIGNED(ptr) ( \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 8 ) | \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 0 ) )
+
+#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) ( \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 8 ) | \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 0 ) )
+
+#define RR_GET32_LE_UNALIGNED(ptr) ( \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 24 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 16 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) )
+
+#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) ( \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 24 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 16 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \
+ ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) )
+
+#define RR_GET16_LE_UNALIGNED(ptr) ( \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) )
+
+#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) ( \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \
+ ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) )
+
+#endif
+
+//===================================================================
+// RR_ROTL32 : 32-bit rotate
+//
+
+#ifdef _MSC_VER
+
+ unsigned long __cdecl _lrotl(unsigned long, int);
+ #pragma intrinsic(_lrotl)
+
+ #define RR_ROTL32(x,k) _lrotl((unsigned long)(x),(int)(k))
+
+#elif defined(__RADCELL__) || defined(__RADLINUX__) || defined(__RADWII__) || defined(__RADMACAPI__) || defined(__RADWIIU__) || defined(__RADPS4__) || defined(__RADPSP2__)
+
+ // Compiler turns this into rotate correctly :
+ #define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) )
+
+#elif defined(__RAD3DS__)
+
+ #define RR_ROTL32(u32,num) __ror(u32, (-(num))&31)
+
+#else
+
+// comment out fallbacks so users will get errors
+// fallback implementation using shift and or :
+//#define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) )
+
+#endif
+
+
+//===================================================================
+// RR_ROTL64 : 64-bit rotate
+
+#if ( defined(_MSC_VER) && _MSC_VER >= 1300)
+
+unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift);
+#pragma intrinsic(_rotl64)
+
+#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k))
+
+#elif defined(__RADCELL__)
+
+// PS3 GCC turns this into rotate correctly :
+#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) )
+
+#elif defined(__RADLINUX__) || defined(__RADMACAPI__)
+
+//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above.
+#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) )
+
+#else
+
+// comment out fallbacks so users will get errors
+// fallback implementation using shift and or :
+//#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) )
+
+#endif
+
+//===================================================================
+
+RADDEFEND
+
+//===================================================================
+
+// RR_COMPILER_ASSERT
+#if defined(__cplusplus) && !defined(RR_COMPILER_ASSERT)
+ #if defined(_MSC_VER) && (_MSC_VER >=1400)
+
+ // better version of COMPILER_ASSERT using boost technique
+ template <int x> struct RR_COMPILER_ASSERT_FAILURE;
+
+ template <> struct RR_COMPILER_ASSERT_FAILURE<1> { enum { value = 1 }; };
+
+ template<int x> struct rr_compiler_assert_test{};
+
+ // __LINE__ macro broken when -ZI is used see Q199057
+ #define RR_COMPILER_ASSERT( B ) \
+ typedef rr_compiler_assert_test<\
+ sizeof(RR_COMPILER_ASSERT_FAILURE< (B) ? 1 : 0 >)\
+ > rr_compiler_assert_typedef_
+
+ #endif
+#endif
+
+#ifndef RR_COMPILER_ASSERT
+ // this happens at declaration time, so if it's inside a function in a C file, drop {} around it
+ #define RR_COMPILER_ASSERT(exp) typedef char RR_STRING_JOIN(_dummy_array, __LINE__) [ (exp) ? 1 : -1 ]
+#endif
+
+//===================================================================
+// some error checks :
+
+ RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == sizeof( RR_STRING_JOIN(RAD_U,RAD_PTRBITS) ) );
+ RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == RAD_PTRBYTES );
+ RR_COMPILER_ASSERT( RAD_TWOPTRBYTES == 2* RAD_PTRBYTES );
+
+//===================================================================
+
+ #endif // __RADRES__
+
+//include "testconstant.inl" // uncomment and include to test statement constants
+
+#endif // __RADRR_COREH__
+
+
diff --git a/Minecraft.Client/Durango/Miles/lib/auddurango.LTCG.lib b/Minecraft.Client/Durango/Miles/lib/auddurango.LTCG.lib
new file mode 100644
index 00000000..51cf3af7
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/auddurango.LTCG.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/auddurango.lib b/Minecraft.Client/Durango/Miles/lib/auddurango.lib
new file mode 100644
index 00000000..8b124314
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/auddurango.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/binkadurango.LTCG.lib b/Minecraft.Client/Durango/Miles/lib/binkadurango.LTCG.lib
new file mode 100644
index 00000000..6bbbf311
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/binkadurango.LTCG.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/binkadurango.lib b/Minecraft.Client/Durango/Miles/lib/binkadurango.lib
new file mode 100644
index 00000000..372a3027
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/binkadurango.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/fltdurango.LTCG.lib b/Minecraft.Client/Durango/Miles/lib/fltdurango.LTCG.lib
new file mode 100644
index 00000000..ec21e28a
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/fltdurango.LTCG.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/fltdurango.lib b/Minecraft.Client/Durango/Miles/lib/fltdurango.lib
new file mode 100644
index 00000000..6c9f4edd
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/fltdurango.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/mssdurango.LTCG.lib b/Minecraft.Client/Durango/Miles/lib/mssdurango.LTCG.lib
new file mode 100644
index 00000000..d0e5f7b9
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/mssdurango.LTCG.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/mssdurango.lib b/Minecraft.Client/Durango/Miles/lib/mssdurango.lib
new file mode 100644
index 00000000..65ef946b
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/mssdurango.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.LTCG.lib b/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.LTCG.lib
new file mode 100644
index 00000000..a890cb3c
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.LTCG.lib
Binary files differ
diff --git a/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.lib b/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.lib
new file mode 100644
index 00000000..9b073344
--- /dev/null
+++ b/Minecraft.Client/Durango/Miles/lib/mssdurangomidi.lib
Binary files differ