2026-03-01 12:16:08 +08:00
//############################################################################
//## ##
//## 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
2026-03-02 17:39:35 +07:00
# define EXPAPI
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
# define MilesMajorVersion 9 EXPMACRO
2026-03-01 12:16:08 +08:00
# define MilesMinorVersion 3 EXPMACRO
2026-03-02 17:39:35 +07:00
# define MilesBuildNumber 11 EXPMACRO
# define MilesCustomization 0 EXPMACRO
2026-03-01 12:16:08 +08:00
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 )
2026-03-02 17:39:35 +07:00
# define AILCALL EXPTAG(AILCALL)
2026-03-01 12:16:08 +08:00
/*
Internal calling convention that all external Miles functions use .
Usually cdecl or stdcall on Windows .
*/
2026-03-02 17:39:35 +07:00
# define AILCALLBACK EXPTAG(AILCALLBACK docproto)
2026-03-01 12:16:08 +08:00
/*
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
2026-03-02 17:39:35 +07:00
typedef unsigned __int64 ULONG_PTR , * PULONG_PTR ;
2026-03-01 12:16:08 +08:00
# 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 ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# ifndef WAVE_MAPPER
# define WAVE_MAPPER ((UINT)-1)
# endif
typedef struct waveformat_tag * LPWAVEFORMAT ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
//
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# ifdef IS_WIN32
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# ifdef __RADINDLL__
# define DXDEC __declspec(dllexport)
# define DXDEF __declspec(dllexport)
# else
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS )
# define DXDEC extern
# else
# define DXDEC __declspec(dllimport)
# endif
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# endif
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# define MSS_DIR_SEP "\\"
# define MSS_DIR_UP ".." MSS_DIR_SEP
# define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
# define AILCALLBACK
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : MSS_FIRST use this value to start the enumeration process .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
//
2026-03-02 17:39:35 +07:00
# define AIL_MM_PERIOD 0
2026-03-01 12:16:08 +08:00
# 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 ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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.
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
// 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)
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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.
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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.
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
//
// 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 ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# define WHDR_DONE 0
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
typedef struct _WAVEIN
{
long temp ;
} * HWAVEIN ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
typedef struct _WAVEHDR
{
S32 dwFlags ;
S32 dwBytesRecorded ;
S32 dwUser ;
S32 temp ;
void * lpData ;
S32 dwBufferLength ;
S32 longdwLoops ;
S32 dwLoops ;
void * lpNext ;
U32 * reserved ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
} 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ) )
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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 ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# 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 ) ; \
} \
} \
}
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
# endif
DXDEC S32 AILCALL AIL_digital_handle_release ( HDIGDRIVER drvr ) ;
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 , 3 d listener state will be affected in addition to sample state .
If MILES_PUSH_RESET is present , the 3 d 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
2026-03-02 17:39:35 +07:00
affected when popped .
2026-03-01 12:16:08 +08:00
$ -
2026-03-02 17:39:35 +07:00
If you want more control over whether a sample will be affected by a push or a pop operation ,
2026-03-01 12:16:08 +08:00
see $ AIL_set_sample_level_mask .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
*/
DXDEC EXPAPI void AILCALL AIL_pop_system_state ( HDIGDRIVER dig , S16 crossfade_ms ) ;
/*
2026-03-02 17:39:35 +07:00
Pops the current system state and returns the system to the way it
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
Under normal push / pop operations , a sample ' s mask is set when it is
2026-03-01 12:16:08 +08:00
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 0 db 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
2026-03-02 17:39:35 +07:00
do almost all of the things you can do with a normal sample handle . The only exception
2026-03-01 12:16:08 +08:00
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 0 db 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 ) ;
/*
2026-03-02 17:39:35 +07:00
Installs the Compressor filter on to a bus , using another bus as the input for
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
To control the compressor parameters , access the bus ' s HSAMPLE via $ AIL_bus_sample_handle and
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
typedef struct _STREAM
2026-03-01 12:16:08 +08:00
{
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
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ,
2026-03-02 17:39:35 +07:00
U8 * Ogg_file_image ,
2026-03-01 12:16:08 +08:00
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
//
2026-03-02 17:39:35 +07:00
DXDEC S32 AILCALL AIL_room_type ( HDIGDRIVER dig ,
2026-03-01 12:16:08 +08:00
S32 bus_index ) ;
2026-03-02 17:39:35 +07:00
DXDEC void AILCALL AIL_set_room_type ( HDIGDRIVER dig ,
2026-03-01 12:16:08 +08:00
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 ( 3 D 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 .
2026-03-02 17:39:35 +07:00
This marks a sample as having a low pass cutoff that varies as a function of distance to the listener . If
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
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
2026-03-01 12:16:08 +08:00
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 3 D 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 3 D 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 .
2026-03-02 17:39:35 +07:00
If there is neither spread falloff nor volume falloff specified , spread will be automatically applied
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
Spread is how much the directionality of a sample " spreads " to more speakers - emulating
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
Use $ HMSOUNDBANK instead .
*/
# endif
EXPTYPE typedef struct SoundBank * HMSOUNDBANK ;
/*
Describes a handle to an open sound bank .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
The name of the bank is the name used in asset names . This is distinct from the
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 :
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ {
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 :
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ {
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 :
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ {
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 .
*/
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 :
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ {
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 .
2026-03-02 17:39:35 +07:00
*/
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
preset will have their values restored to default .
2026-03-01 12:16:08 +08:00
*/
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
2026-03-02 17:39:35 +07:00
requested type .
2026-03-01 12:16:08 +08:00
*/
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 .
2026-03-02 17:39:35 +07:00
$ : return Returns the byte size of the buffer required for out_name .
2026-03-01 12:16:08 +08:00
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. "
2026-03-02 17:39:35 +07:00
Discussion = " Primarily designed for offline use, this function is the first step in
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : MILES_START_STEP_RANDOM Randomly select from the list , and allow the same
2026-03-01 12:16:08 +08:00
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. "
2026-03-02 17:39:35 +07:00
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
2026-03-01 12:16:08 +08:00
string is of the form ' BankName1 / SoundName1 : Weight1 : BankName2 / SoundName2 : Weight2 : ' etc . The string must always
2026-03-02 17:39:35 +07:00
terminate in a ' : ' . Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything , use
2026-03-01 12:16:08 +08:00
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. "
2026-03-02 17:39:35 +07:00
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
2026-03-01 12:16:08 +08:00
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 (
2026-03-02 17:39:35 +07:00
HMSSEVENTCONSTRUCT i_Event ,
2026-03-01 12:16:08 +08:00
const char * i_SoundNames ,
2026-03-02 17:39:35 +07:00
const char * i_PresetName ,
2026-03-01 12:16:08 +08:00
U8 i_PresetIsDynamic ,
const char * i_EventName ,
const char * i_StartMarker , const char * i_EndMarker ,
char const * i_StateVar , char const * i_VarInit ,
2026-03-02 17:39:35 +07:00
const char * i_Labels , U32 i_Streaming , U8 i_CanLoad ,
2026-03-01 12:16:08 +08:00
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 ,
2026-03-02 17:39:35 +07:00
U8 i_EvictionType ,
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 (
2026-03-02 17:39:35 +07:00
HMSSEVENTCONSTRUCT i_Event ,
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : i_Name The name of the blend . This is the name that will be
2026-03-01 12:16:08 +08:00
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 . "
}
*/
2026-03-02 17:39:35 +07:00
DXDEC S32 AILCALL
2026-03-01 12:16:08 +08:00
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 ) ; "
}
*/
2026-03-02 17:39:35 +07:00
DXDEC S32 AILCALL
AIL_add_persist_preset_event_step ( HMSSEVENTCONSTRUCT i_Event , const char * i_PresetName , const char * i_PersistName ,
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
Normally , event contents are meant to be handled by the Miles high - level system via $ AIL_enqueue_event ,
2026-03-01 12:16:08 +08:00
rather than inspected directly .
*/
DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step ( HMSSEVENTCONSTRUCT i_Event ) ;
/*
2026-03-02 17:39:35 +07:00
Clears all persistent state in the runtime .
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ;
2026-03-02 17:39:35 +07:00
struct
2026-03-01 12:16:08 +08:00
{
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
2026-03-02 17:39:35 +07:00
used by the MilesEvent system . It returns the pointer to the next step to be passed to this function to get the
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 5 K ) .
2026-03-02 17:39:35 +07:00
$ : 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 .
2026-03-01 12:16:08 +08:00
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 64 K ) .
$ : 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 .
2026-03-02 17:39:35 +07:00
To enqueue events to the new system , use $ AIL_enqueue_event_system .
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
is the name on the media , and the name is the symbolic name you used in the Miles Sound Studio .
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
< b > This is deprecated < / b > . If you know the event name , you should use $ AIL_enqueue_event_by_name , or $ AIL_enqueue_event with
2026-03-01 12:16:08 +08:00
MILESEVENT_ENQUEUE_BY_NAME .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
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
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
This is used to pass more data to an event that will be executed . For instance , if
2026-03-01 12:16:08 +08:00
an event is going to spatialize a sound , but there ' s no need to move the sound over the course of
2026-03-02 17:39:35 +07:00
its lifetime , you can add positional data to the event via $ AIL_enqueue_event_position . When a
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
will yield the thread until a slot is open .
2026-03-01 12:16:08 +08:00
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 3 D 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 3 D 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 .
2026-03-02 17:39:35 +07:00
$ * < b > Buffer < / b > If user_buffer_is_ptr is 0 , then user_buffer_len bytes are copied from user_buffer and
2026-03-01 12:16:08 +08:00
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 ;
2026-03-02 17:39:35 +07:00
// Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound
2026-03-01 12:16:08 +08:00
// 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 ;
2026-03-02 17:39:35 +07:00
// Buffer - the "data" structure will be copied internally, so we can free() the data - or just use
2026-03-01 12:16:08 +08:00
// 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
2026-03-02 17:39:35 +07:00
When a sound starts , the given variable will be set to the given value prior to any possible
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
$ : apply_to_ID The ID to use for filtering . This can be either a sound or event ID . For an
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
The selection index is used to programatically select a sound from the
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
$ AIL_enqueue_event_start .
2026-03-01 12:16:08 +08:00
*/
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 .
2026-03-02 17:39:35 +07:00
$ : event_or_name Pointer to the event contents to queue , or the name of the event to find and queue .
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : 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 .
2026-03-01 12:16:08 +08:00
$ : 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 ,
2026-03-02 17:39:35 +07:00
when Miles triggers one of these event steps , it matches the name and labels stored with the event step . However , if
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
execute events only specific sound instances . QueuedIDs are returned from each call $ AIL_enqueue_event .
2026-03-01 12:16:08 +08:00
InstanceIDs and EventIDs are returned from $ AIL_enumerate_sound_instances .
2026-03-02 17:39:35 +07:00
$ : return On success , returns QueuedID value that is unique to this queued event for the rest of this
2026-03-01 12:16:08 +08:00
program run ( you can use this ID to uniquely identify sounds triggered from this event ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
This function is very lightweight . It does nothing more than post the event and data to a
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
of all your sound related memory directly and is the normal way to use the system ( it is very
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
In both cases , when you later enumerate the sound instances , you can access your sound data
2026-03-01 12:16:08 +08:00
with the $ ( MILESEVENTSOUNDINFO : : UserBuffer ) field .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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
2026-03-02 17:39:35 +07:00
by either using the convenience function $ AIL_enqueue_event_by_name , or by using the MILESEVENT_ENQUEUE_BY_NAME flag and
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : return Return 0 on failure . The only failures are unrecoverable errors in the queued events
2026-03-01 12:16:08 +08:00
( out of memory , bank file not found , bad data , etc ) . You can get the specific error by
calling $ AIL_last_error .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
This function executes all the events currently in the queue . This is where all major
processing takes place in the event system .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
Once you execute this functions , then sound instances will be in one of three states :
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ ( 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 3 D position )
2026-03-02 17:39:35 +07:00
on the sound before Miles begins to play it .
2026-03-01 12:16:08 +08:00
$ ( 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 3 D position for these , for example ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ ( 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 ;
2026-03-02 17:39:35 +07:00
while ( $ AIL_enumerate_sound_instances ( & SoundEnum , MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE , 0 , & Info ) )
2026-03-01 12:16:08 +08:00
{
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 ) ;
}
}
2026-03-02 17:39:35 +07:00
$ AIL_complete_event_queue_processing ( ) ;
$ }
Note that if any event step drastically fails , the rest of the command queue is
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ;
2026-03-02 17:39:35 +07:00
S32 Status ;
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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
2026-03-02 17:39:35 +07:00
was started by a completion event or a event exec step . In that case , the QueuedID represents the ID returned from
2026-03-01 12:16:08 +08:00
$ 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : context The context the variable is set for . Can be either a $ HEVENTSYSTEM
2026-03-01 12:16:08 +08:00
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.
$ }
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
*/
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 .
2026-03-02 17:39:35 +07:00
$ : context The context the variable is set for . Can be either a $ HEVENTSYSTEM
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : info Returns the data for each sound instance .
2026-03-01 12:16:08 +08:00
$ : return Returns 0 when enumeration is complete .
Enumerates the sound instances . This will generally be used between
2026-03-02 17:39:35 +07:00
calls to $ AIL_begin_event_queue_processing and $ AIL_complete_event_queue_processing to
2026-03-01 12:16:08 +08:00
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 3 D position )
2026-03-02 17:39:35 +07:00
on the sound before Miles begins to play it .
2026-03-01 12:16:08 +08:00
$ ( 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 3 D position for these , for example ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ ( 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 ;
2026-03-02 17:39:35 +07:00
while ( $ AIL_enumerate_sound_instances ( & SoundEnum , 0 , 0 , & Info ) )
2026-03-01 12:16:08 +08:00
{
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
2026-03-02 17:39:35 +07:00
# define MILESEVENT_SOUND_STATUS_PLAYING 0x2
2026-03-01 12:16:08 +08:00
# define MILESEVENT_SOUND_STATUS_COMPLETE 0x4
EXPTYPEEND
/*
Specifies the status of a sound instance .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 3 D position )
2026-03-02 17:39:35 +07:00
on the sound before Miles begins to play it .
2026-03-01 12:16:08 +08:00
$ : MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously
started and are continuing to play ( you might update the 3 D position for these , for example ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
$ : MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded .
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : return Returns 0 on failure .
2026-03-02 17:39:35 +07:00
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
2026-03-01 12:16:08 +08:00
and frees the completed ones - it ' s the 2 nd half of the event processing .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
*/
2026-03-02 17:39:35 +07:00
DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance ( HMSOUNDBANK bank , char const * sound , U8 loop_count ,
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
Enqueues an event to start the specified sound asset .
2026-03-01 12:16:08 +08:00
Usually the programmer should trigger an event that the sound designer has specifically
2026-03-02 17:39:35 +07:00
create to start the appropriate sounds , but this function gives the programmer
2026-03-01 12:16:08 +08:00
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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
$ : return String description of current systems state .
2026-03-01 12:16:08 +08:00
This function is a debugging aid - it can be used to show all of the active allocations ,
active sounds , etc .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 ) .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
*/
DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions ( MILESBANKFUNCTIONS const * Functions ) ;
/*
Allows you to override the internal bank file resource management . .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : 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 3 DS
$ : MILES_PLAT_PSP Sony PSP
$ : MILES_PLAT_IPHONE Apple iDevices
$ : MILES_PLAT_LINUX Linux Flavors
$ : MILES_PLAT_WII Nintendo Wii
2026-03-02 17:39:35 +07:00
$ : MILES_PLAT_PSP2 Sony NGP
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
$ : system The system to retrieve information for , or zero for the default system .
$ : state A pointer to a structure to receive the state information .
2026-03-02 17:39:35 +07:00
This function is a debugging aid - it returns information for the event system .
2026-03-01 12:16:08 +08:00
*/
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 ) ;
/*
2026-03-02 17:39:35 +07:00
The function prototype to use for a callback that will be made when the event system
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
2026-03-01 12:16:08 +08:00
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 .
2026-03-02 17:39:35 +07:00
The basic usage is to have the callback check $ AIL_last_error ( ) for the overall category of
2026-03-01 12:16:08 +08:00
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 ,
2026-03-02 17:39:35 +07:00
UINTa user ,
2026-03-01 12:16:08 +08:00
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