From 04dcde993953e7c10f99dd4ed8eceeefcf89513e Mon Sep 17 00:00:00 2001 From: str1k3r <115313679+S1l3ntStr1ke87@users.noreply.github.com> Date: Thu, 23 Jul 2026 12:13:49 -0400 Subject: [PATCH] chore: remove miles libs & stop linking psvita libs --- Minecraft.Client/Minecraft.Client.vcxproj | 127 +- .../Minecraft.Client.vcxproj.filters | 9 - .../Windows64/Miles/include/imssapi.h | 3267 ------- .../Windows64/Miles/include/mss.h | 8429 ----------------- .../Windows64/Miles/include/rrcore.h | 2322 ----- .../Windows64/Miles/include/tmapi.h | 36 - .../Windows64/Miles/lib/aud32.lib | Bin 2480 -> 0 bytes .../Windows64/Miles/lib/mss32.lib | Bin 100962 -> 0 bytes .../Windows64/Miles/lib/mss32midi.lib | Bin 29792 -> 0 bytes .../Windows64/Miles/lib/mss64.lib | Bin 94326 -> 0 bytes .../Windows64/Miles/lib/mss64midi.lib | Bin 27852 -> 0 bytes .../Miles/lib/redist64/binkawin64.asi | Bin 110592 -> 0 bytes .../Miles/lib/redist64/mss64dolby.flt | Bin 44032 -> 0 bytes .../Miles/lib/redist64/mss64ds3d.flt | Bin 71168 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64dsp.flt | Bin 131584 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64eax.flt | Bin 131584 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64srs.flt | Bin 65024 -> 0 bytes 17 files changed, 69 insertions(+), 14121 deletions(-) delete mode 100644 Minecraft.Client/Windows64/Miles/include/imssapi.h delete mode 100644 Minecraft.Client/Windows64/Miles/include/mss.h delete mode 100644 Minecraft.Client/Windows64/Miles/include/rrcore.h delete mode 100644 Minecraft.Client/Windows64/Miles/include/tmapi.h delete mode 100644 Minecraft.Client/Windows64/Miles/lib/aud32.lib delete mode 100644 Minecraft.Client/Windows64/Miles/lib/mss32.lib delete mode 100644 Minecraft.Client/Windows64/Miles/lib/mss32midi.lib delete mode 100644 Minecraft.Client/Windows64/Miles/lib/mss64.lib delete mode 100644 Minecraft.Client/Windows64/Miles/lib/mss64midi.lib delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/binkawin64.asi delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/mss64dolby.flt delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/mss64ds3d.flt delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/mss64dsp.flt delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/mss64eax.flt delete mode 100644 Minecraft.Client/Windows64/Miles/lib/redist64/mss64srs.flt diff --git a/Minecraft.Client/Minecraft.Client.vcxproj b/Minecraft.Client/Minecraft.Client.vcxproj index a959cebd..b10addb1 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj +++ b/Minecraft.Client/Minecraft.Client.vcxproj @@ -1447,7 +1447,7 @@ if not exist "$(TargetDir)\savedata" mkdir "$(TargetDir)\savedata" true $(OutDir)$(ProjectName).pdb - d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;..\Minecraft.Client\Windows64\Miles\Lib\mss64.lib;wsock32.lib + d3d11.lib;..\Minecraft.World\x64_Debug\Minecraft.World.lib;%(AdditionalDependencies);XInput9_1_0.lib;wsock32.lib NotSet false @@ -19109,40 +19109,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true @@ -40609,12 +40575,42 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CU true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true - true + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true - true true @@ -40703,10 +40699,42 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - - - + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + + + true + true + true + true + true + true + true + true true @@ -41067,23 +41095,6 @@ xcopy /q /y /i /s /e $(ProjectDir)Durango\CU $(LayoutDir)Image\Loose\CUtrue true - - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true - true true diff --git a/Minecraft.Client/Minecraft.Client.vcxproj.filters b/Minecraft.Client/Minecraft.Client.vcxproj.filters index 98d8f7aa..7503ab1c 100644 --- a/Minecraft.Client/Minecraft.Client.vcxproj.filters +++ b/Minecraft.Client/Minecraft.Client.vcxproj.filters @@ -2446,12 +2446,6 @@ net\minecraft\client\renderer\entity - - Windows64\Miles Sound System\Include - - - Windows64\Miles Sound System\Include - Orbis\Miles Sound System\include @@ -5990,9 +5984,6 @@ Windows64\4JLibs\libs - - Windows64\Miles Sound System\lib - Windows64\Iggy\lib diff --git a/Minecraft.Client/Windows64/Miles/include/imssapi.h b/Minecraft.Client/Windows64/Miles/include/imssapi.h deleted file mode 100644 index 065a4f65..00000000 --- a/Minecraft.Client/Windows64/Miles/include/imssapi.h +++ /dev/null @@ -1,3267 +0,0 @@ -#ifndef IMSSAPI_H -#define IMSSAPI_H - -// Internal API file - -#if defined(IS_PS3) || defined(IS_PSP) -#include -#endif - -#if defined(IS_WII) -#include -#include -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(push, 1) -#endif -#ifdef IS_32 - #if !defined(IS_WIN32API) - #define ASMLINK - #define ASMPARM - #else - #if defined(IS_XENON) - #define ASMLINK __cdecl - #define ASMPARM register - #else - #define ASMLINK __cdecl - #define ASMPARM - #endif - #endif -#else - #define ASMLINK WINAPI - #define ASMPARM -#endif - -#ifndef YES -#define YES 1 -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#define MSSHIWORD(ptr) (((U32)ptr)>>16) -#define MSSLOWORD(ptr) ((U16)((U32)ptr)) - -#ifndef NO -#define NO 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifdef IS_MAC - -#if !defined(max) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#endif - -#ifdef IS_WATCOM - -#if !defined(max) // Watcom stdlib.h doesn't define these for C++ -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#endif - -#ifdef IS_WIN64 - - #define PTRFMT "0x%I64X" - #define SINTFMT "%I64d" - #define HPFMT "%ld" - -#else - - #if defined(IS_PS3) || defined(IS_PSP) || defined(IS_3DS) - - #define PTRFMT "0x%lX" - #define SINTFMT "%d" // (GCC warns when ints printed with %ld) - #define HPFMT "%ld" - - #else - - #define PTRFMT "0x%lX" - #define SINTFMT "%ld" - #define HPFMT "%ld" - - #endif - -#endif - -U32 AILCALL XMI_read_VLN(U8 const* *ptr); -S32 AILCALL XMI_message_size(S32 status); -void const * AILCALL XMI_find_sequence(U8 const *image, S32 sequence); -S32 AIL_process_WAV_image( AILSOUNDINFO const * info, HSAMPLE sample ); - -#ifdef IS_SPU -#define NTELEMETRY -#endif - -#include "tmapi.h" - -#ifdef NTELEMETRY - #define miles_context 0 -#else - extern HTELEMETRY g_Miles_Tm; - extern S32 g_tm_log; - #define miles_context g_Miles_Tm -#endif - -//############################################################################ -//## ## -//## API function prototypes ## -//## ## -//############################################################################ - -#define check_hardware_buffer( S, flags ) -#define hardware_stop( S ) -#define set_hardware_position( S ) -#define hardware_spin_until_stopped( S ) -#define set_hardware_volume( S ) -#define set_master_hardware_volume( dig ) -#define set_hardware_loop_region( S ) -#define set_hardware_low_pass( S ) - -extern void AILCALL InMilesMutex(void); -extern void AILCALL OutMilesMutex(void); - -#ifdef IS_WIN32API - -#ifdef NTAPI -extern HWND AILCALL AIL_API_HWND (void); - -void AILEXPORT API_timer (UINT IDEvent, - UINT uReserved, - DWORD dwUser, - DWORD dwReserved1, - DWORD dwReserved2); - -#endif - -extern S32 MilesCount; -extern U32 lastapitimerms; - - void AILCALL Set_thread_name( U32 thread_id, char const * thread_name ); - -#endif - - -#ifdef IS_MAC - #if defined(__CARBON__) - ProcessSerialNumber AILCALL AIL_API_Process(void); - #endif -#endif - - -#ifdef _DEBUG - -DXDEC void AILEXPORT AIL_debug_printf( char const *fmt, ...); - -#else - -#define AIL_debug_printf(...) - -#endif - -#ifndef MSS_SPU_PROCESS - -// -// Global preference array -// -extern SINTa AIL_preference [N_PREFS]; - -#endif - -extern char AIL_redist_directory[260]; - -extern S32 AILCALL match_suffix(char const* suffix,char const* file_suffix); - -#if !defined(IS_X86) || !defined(IS_MAC) // use mix rib on x86 mac -DXDEC S32 AILCALL MIX_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 - -// -// High-level support services -// - -extern void AILCALL AIL_API_startup (void); -extern void AILCALL AIL_API_shutdown (void); - -extern SINTa AILCALL AIL_API_set_preference (U32 number, - SINTa value); - -// -// Low-level support services -// - -extern void AILCALL AIL_API_sleep (U32 ms); - -extern S32 AILCALL AIL_API_background (void); - -extern void AILCALL AIL_API_mem_free_lock (void *ptr); - -extern void* AILCALL AIL_API_mem_alloc_lock (UINTa size); - -// -// Process services -// - -extern HTIMER AILCALL AIL_API_register_timer (AILTIMERCB fn); - -extern UINTa AILCALL AIL_API_set_timer_user (HTIMER timer, - UINTa user); - -extern void AILCALL AIL_API_set_timer_period (HTIMER timer, - U32 microseconds); - -extern void AILCALL AIL_API_set_timer_frequency (HTIMER timer, - U32 hertz) ; - -extern void AILCALL AIL_API_set_timer_divisor (HTIMER timer, - U32 PIT_divisor); - -extern void AILCALL AIL_API_start_timer (HTIMER timer) ; -extern void AILCALL AIL_API_start_all_timers (void); - -extern void AILCALL AIL_API_stop_timer (HTIMER timer); -extern void AILCALL AIL_API_stop_all_timers (void); - -extern void AILCALL AIL_API_release_timer_handle(HTIMER timer); -extern void AILCALL AIL_API_release_all_timers (void); - -extern void Container_FreeAll(); -extern void* Container_GetPreset(char const* i_PresetName); -extern void* Container_GetEnvironment(char const* i_EnvironmentName); -extern S32 Container_GetSound(char const* i_SoundName, char* o_SoundFileName, MILESBANKSOUNDINFO* o_SoundInfo); -extern void* Container_GetEvent(char const* i_EventName); -extern void* Container_GetMarkerList(char const* i_SoundName); -extern S32 Container_GetLoadedCount(); -extern S32 Container_GetMemUsage(); -extern char const* Container_GetLoadedName(S32 i_Index); - -extern const U8* AILCALL MilesFindEventInternal(HMSOUNDBANK i_Bank, const char* i_EventName); -extern void AILCALL MilesClearEventQueueInternal(); -extern void AILCALL MilesRegisterRandInternal(MSS_USER_RAND * rand); -extern U64 AILCALL MilesEnqueueEventInternal(const U8* i_Event, void* i_UserBuffer, S32 i_UserBufferLen, S32 i_EnqueueFlags, U64 i_EventFilter); -extern U64 AILCALL MilesEnqueueEventByNameInternal(char const* i_Name); -extern U64 AILCALL MilesEnqueueEventContextInternal(HEVENTSYSTEM i_Context, const U8* i_Event, void* i_UserBuffer, S32 i_UserBufferLen, S32 i_EnqueueFlags, U64 i_EventFilter); - -extern S32 AILCALL MilesBeginEventQueueProcessingInternal(); -extern S32 AILCALL MilesCompleteEventQueueProcessingInternal(); - -extern S32 AILCALL MilesEnumerateSoundInstancesInternal(HEVENTSYSTEM i_System, HMSSENUM* io_Next, S32 i_Status, const char* i_Labels, U64 search_for_ID, MILESEVENTSOUNDINFO* o_Info); -extern S32 AILCALL MilesEnumeratePresetPersistsInternal(HEVENTSYSTEM i_System, HMSSENUM* io_Next, const char** o_Name); -extern HEVENTSYSTEM AILCALL MilesStartupEventSystemInternal(HDIGDRIVER i_Driver, S32 i_CommandBufferSize, char* i_Memory, S32 i_MemoryLen); -extern HEVENTSYSTEM AILCALL MilesAddEventSystemInternal(HDIGDRIVER i_Driver); -extern S32 AILCALL MilesSetSoundLabelLimitsInternal(HEVENTSYSTEM i_System, U64 i_Id, const char* i_SoundLimits, char const* i_Name); - - -extern void AILCALL MilesShutdownEventSystemInternal(); -extern HMSOUNDBANK AILCALL MilesAddSoundBankInternal(const char* i_FileName, char const* i_Name); -extern S32 AILCALL MilesReleaseSoundBankInternal(HMSOUNDBANK i_Bank); -extern char* AILCALL MilesTextDumpEventSystemInternal(); -extern void AILCALL MilesSetEventErrorCallbackInternal(AILEVENTERRORCB i_Callback); - -extern void AILCALL MilesSetVarIInternal(UINTa i_System, char const* i_Name, S32 i_Value); -extern void AILCALL MilesSetVarFInternal(UINTa i_System, char const* i_Name, F32 i_Value); -extern S32 AILCALL MilesGetVarFInternal(UINTa i_Context, char const* i_Name, F32* o_Value); -extern S32 AILCALL MilesGetVarIInternal(UINTa i_Context, char const* i_Name, S32* o_Value); -extern void AILCALL MilesSetSoundStartOffsetInternal(HMSSENUM i_Instance, S32 i_Offset, S32 i_IsMs); -extern void AILCALL MilesRequeueAsyncsInternal(); - -extern AIL_file_open_callback MSS_open; -extern AIL_file_close_callback MSS_close; -extern AIL_file_seek_callback MSS_seek; -extern AIL_file_read_callback MSS_read; - -extern S32 disk_err; -extern char MSS_Directory[260]; - - -extern void stream_background(void); // background service for streaming - -#define call_fetch_CB( ASI,usr,dest,bytes,offset ) ((AILASIFETCHCB)((ASI)->fetch_CB))(usr,dest,bytes,offset) - -extern HPROVIDER find_ASI_provider(const C8 *attrib, const C8 *filename); - - -// -// M3D services -// - -extern HDIGDRIVER AILCALL AIL_API_primary_digital_driver (HDIGDRIVER new_primary); - -extern void AILCALL AIL_API_set_sample_3D_distances (HSAMPLE samp, - F32 max_dist, - F32 min_dist, - S32 auto_3D_wet_atten); - -extern void AILCALL AIL_API_sample_3D_distances (HSAMPLE samp, - F32 * max_dist, - F32 * min_dist, - S32 * auto_3D_wet_atten); - -extern void AILCALL AIL_API_set_sample_obstruction (HSAMPLE S, - F32 obstruction); - -extern void AILCALL AIL_API_set_sample_exclusion (HSAMPLE S, - F32 exclusion); - -extern void AILCALL AIL_API_set_sample_occlusion (HSAMPLE S, - F32 occlusion); - -extern void AILCALL AIL_API_set_sample_3D_cone (HSAMPLE S, - F32 inner_angle, - F32 outer_angle, - F32 outer_volume); - -extern F32 AILCALL AIL_API_sample_obstruction (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_occlusion (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_exclusion (HSAMPLE S); - -extern void AILCALL AIL_API_sample_3D_cone (HSAMPLE S, - F32 *inner_angle, - F32 *outer_angle, - F32 *outer_volume); - -extern S32 AILCALL AIL_API_room_type (HDIGDRIVER dig, - S32 bus_index); - -extern void AILCALL AIL_API_set_room_type (HDIGDRIVER dig, - S32 bus_index, - S32 EAX_room_type); - -extern F32 AILCALL AIL_API_3D_rolloff_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_rolloff_factor (HDIGDRIVER dig, - F32 factor ); - -extern F32 AILCALL AIL_API_3D_doppler_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_doppler_factor (HDIGDRIVER dig, - F32 factor ); - -extern F32 AILCALL AIL_API_3D_distance_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_distance_factor (HDIGDRIVER dig, - F32 factor ); - -extern void AILCALL AIL_API_set_sample_3D_position (HSAMPLE S, - F32 X, - F32 Y, - F32 Z); - -extern void AILCALL AIL_API_set_sample_3D_velocity (HSAMPLE S, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -extern void AILCALL AIL_API_set_sample_3D_velocity_vector (HSAMPLE S, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -extern void AILCALL AIL_API_set_sample_3D_orientation (HSAMPLE S, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -extern S32 AILCALL AIL_API_sample_3D_position (HSAMPLE S, - F32 *X, - F32 *Y, - F32 *Z); - -extern void AILCALL AIL_API_sample_3D_velocity (HSAMPLE S, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -extern void AILCALL AIL_API_sample_3D_orientation (HSAMPLE S, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -extern void AILCALL AIL_API_update_sample_3D_position (HSAMPLE S, - F32 dt_milliseconds); - -extern void AILCALL AIL_API_set_listener_3D_position(HDIGDRIVER dig, - F32 X, - F32 Y, - F32 Z); - -extern void AILCALL AIL_API_set_listener_3D_velocity(HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -extern void AILCALL AIL_API_set_listener_3D_velocity_vector (HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -extern void AILCALL AIL_API_set_listener_3D_orientation (HDIGDRIVER dig, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -extern void AILCALL AIL_API_set_sample_3D_volume_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_lowpass_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_exclusion_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_spread_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_position_segments (HSAMPLE S, MSSVECTOR3D* points, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_spread (HSAMPLE S, F32 spread); - -extern void AILCALL AIL_API_listener_3D_position (HDIGDRIVER dig, - F32 *X, - F32 *Y, - F32 *Z); - -extern void AILCALL AIL_API_listener_3D_velocity (HDIGDRIVER dig, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -extern void AILCALL AIL_API_listener_3D_orientation (HDIGDRIVER dig, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -extern void AILCALL AIL_API_update_listener_3D_position (HDIGDRIVER dig, - F32 dt_milliseconds); - -extern S32 AILCALL AIL_API_calculate_3D_channel_levels (HDIGDRIVER driver, //) - 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); - - -#ifdef IS_GENERICDIG -extern HDIGDRIVER AILCALL AIL_API_open_generic_digital_driver( U32 frequency, - S32 bits, - S32 channel, - U32 flags, - RADSS_OPEN_FUNC dig_open); -#else -extern HDIGDRIVER AILCALL AIL_API_open_digital_driver( U32 frequency, - S32 bits, - S32 channel, - U32 flags ); -#endif - -extern void AILCALL AIL_API_close_digital_driver( HDIGDRIVER dig ); - -#if defined(IS_WINDOWS) - -extern S32 AILCALL AIL_API_digital_handle_release(HDIGDRIVER drvr); - -extern S32 AILCALL AIL_API_digital_handle_reacquire - (HDIGDRIVER drvr); -#endif - -#if defined(IS_WINDOWS) || (defined(IS_MAC) && !defined(IS_IPHONE)) - - -extern HDIGINPUT AILCALL AIL_API_open_input (AIL_INPUT_INFO *info); - -extern void AILCALL AIL_API_close_input (HDIGINPUT dig); - -extern AIL_INPUT_INFO * - AILCALL AIL_API_get_input_info (HDIGINPUT dig); - -extern S32 AILCALL AIL_API_set_input_state (HDIGINPUT dig, - S32 enable); - -#endif - -#ifdef MSS_FLT_SUPPORTED - -void * SS_execute_filter_chain(HSAMPLE S, //) - void * src, - void * temp_dest, - S32 src_bytes, - S32 is_stereo, - S16 *dest_mono_sample_buffer); - -// -// Internal FLT services -// - -void FLT_init_list(void); - -FLTPROVIDER *FLT_find_provider_instance(HPROVIDER provider, - HDIGDRIVER dig); - -void FLT_disconnect_driver(HDIGDRIVER dig); - -void FLT_call_premix_processors(HDIGDRIVER dig); - -S32 FLT_call_postmix_processors(HDIGDRIVER dig, void *output_buffer); - -// -// FLT services -// - -extern S32 AILCALL AIL_API_enumerate_filters (HMSSENUM *next, - HPROVIDER *dest, - C8 * *name); - -extern HDRIVERSTATE - AILCALL AIL_API_open_filter (HPROVIDER lib, - HDIGDRIVER dig); - -extern void AILCALL AIL_API_close_filter (HDRIVERSTATE filter); - - - - - - -extern S32 AILCALL AIL_API_enumerate_filter_attributes - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_filter_attribute (HPROVIDER lib, - C8 const * name, - void * val); - -extern void AILCALL AIL_API_set_filter_preference - (HPROVIDER lib, - C8 const * name, - void const * val); - - - - - -extern S32 AILCALL AIL_API_enumerate_filter_sample_attributes - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_filter_sample_attribute - (HSAMPLE S, - C8 const * name, - void * val); - -extern void AILCALL AIL_API_set_filter_sample_preference - (HSAMPLE S, - C8 const * name, - void const * val); -#endif - -extern S32 AILCALL AIL_API_enumerate_digital_driver_attributes - (HDIGDRIVER dig, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_digital_driver_attribute (HDIGDRIVER dig, - C8 const * name, - void * val); - -extern S32 AILCALL AIL_API_enumerate_digital_driver_preferences - (HDIGDRIVER dig, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_set_digital_driver_preference(HDIGDRIVER dig, - C8 const * name, - void const * val); - -extern S32 AILCALL AIL_API_enumerate_sample_attributes - (HSAMPLE S, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_sample_attribute (HSAMPLE S, - C8 const * name, - void * val); - -extern S32 AILCALL AIL_API_enumerate_sample_preferences - (HSAMPLE S, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_set_sample_preference (HSAMPLE S, - C8 const * name, - void const * val); - -extern S32 AILCALL AIL_API_digital_CPU_percent(HDIGDRIVER dig); - -extern S32 AILCALL AIL_API_digital_SPU_percent(HDIGDRIVER dig); - -extern S32 AILCALL AIL_API_background_CPU_percent(void); - -extern S32 AILCALL AIL_API_digital_latency(HDIGDRIVER dig); - -extern HSAMPLE AILCALL AIL_API_allocate_sample_handle - (HDIGDRIVER dig); - -extern HSAMPLE AILCALL AIL_API_allocate_bus(HDIGDRIVER dig); -extern HSAMPLE AILCALL AIL_API_bus_sample_handle(HDIGDRIVER dig, S32 bus_index); -extern S32 AILCALL AIL_API_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); -DXDEC void AILCALL AIL_free_all_busses(HDIGDRIVER dig); // For miles studio. - -extern HSAMPLE AILCALL AIL_API_allocate_file_sample - (HDIGDRIVER dig, - void const *file_image, - S32 block); - -extern void AILCALL AIL_API_set_speaker_configuration - (HDIGDRIVER dig, - MSSVECTOR3D *array, - S32 n_channels, - F32 falloff_power); - -extern MSSVECTOR3D * - AILCALL AIL_API_speaker_configuration - (HDIGDRIVER dig, - S32 *n_physical_channels, - S32 *n_logical_channels, - F32 *falloff_power, - MSS_MC_SPEC *channel_spec); - -extern void AILCALL AIL_API_set_listener_relative_receiver_array - (HDIGDRIVER dig, - MSS_RECEIVER_LIST *array, - S32 n_receivers); - -extern MSS_RECEIVER_LIST * - AILCALL AIL_API_listener_relative_receiver_array - (HDIGDRIVER dig, - S32 *n_receivers); - -extern void AILCALL AIL_API_set_speaker_reverb_levels - (HDIGDRIVER dig, - F32 *wet_array, - F32 *dry_array, - MSS_SPEAKER const *speaker_index_array, - S32 n_levels); - -extern S32 AILCALL AIL_API_speaker_reverb_levels (HDIGDRIVER dig, - F32 * *wet_array, - F32 * *dry_array, - MSS_SPEAKER const * *speaker_index_array); - -extern void AILCALL AIL_API_release_sample_handle (HSAMPLE S); - -extern S32 AILCALL AIL_API_set_sample_file (HSAMPLE S, - void const *file_image, - S32 block); - -extern S32 AILCALL AIL_API_set_sample_info (HSAMPLE S, - AILSOUNDINFO const * info); - -extern S32 AILCALL AIL_API_set_named_sample_file (HSAMPLE S, - C8 const *file_type_suffix, - void const *file_image, - U32 file_size, - S32 block); - -extern HPROVIDER AILCALL AIL_API_set_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage, - HPROVIDER provider); - -extern HPROVIDER AILCALL AIL_API_set_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage, - HPROVIDER provider); - -extern HPROVIDER AILCALL AIL_API_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage); - -extern HPROVIDER AILCALL AIL_API_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage); - -extern void AILCALL AIL_API_set_sample_address (HSAMPLE S, - void const *start, - U32 len); - -extern S32 AILCALL AIL_API_init_sample (HSAMPLE S, - S32 format); - -extern void AILCALL AIL_API_set_sample_adpcm_block_size - (HSAMPLE S, - U32 blocksize); - -extern void AILCALL AIL_API_start_sample (HSAMPLE S); -extern void AILCALL AIL_API_stop_sample (HSAMPLE S); -extern void AILCALL AIL_API_end_fade_sample (HSAMPLE S); -extern void AILCALL AIL_API_resume_sample (HSAMPLE S); -extern void AILCALL AIL_API_end_sample (HSAMPLE S); - -extern void AILCALL AIL_API_sample_group_operation (HDIGDRIVER dig, S32 op, S32 start_id, S32 set_to_id); -extern void AILCALL AIL_API_schedule_start_sample (HSAMPLE S, U64 mix_time_to_start); - -extern void AILCALL AIL_API_push_system_state (HDIGDRIVER dig, U32 flags, S16 crossfade_ms); -extern void AILCALL AIL_API_pop_system_state (HDIGDRIVER dig, S16 crossfade_ms); - -extern void AILCALL AIL_API_set_sample_playback_rate - (HSAMPLE S, - S32 playback_rate); - -extern void AILCALL AIL_API_set_sample_playback_rate_factor - (HSAMPLE S, - F32 playback_rate_factor); - -extern void AILCALL AIL_API_set_sample_playback_delay - (HSAMPLE S, - S32 playback_delay); - -extern void AILCALL AIL_API_set_sample_volume_pan (HSAMPLE S, - F32 volume, - F32 pan); - -extern S32 AILCALL AIL_API_sample_channel_count (HSAMPLE S, U32 *mask); - -extern S32 AILCALL AIL_API_set_sample_is_3D (HSAMPLE S, //) - S32 onoff); - -extern void AILCALL AIL_API_set_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 const * levels, - S32 n_levels ); - -extern void AILCALL AIL_API_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 * levels, - S32 n_levels ); - -extern void AILCALL AIL_API_set_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 const *levels, - S32 n_levels); - -extern void AILCALL AIL_API_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -extern F32 AILCALL AIL_API_sample_output_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -extern void AILCALL AIL_API_set_sample_51_volume_pan( HSAMPLE S, - F32 volume, - F32 pan, - F32 fb_pan, - F32 center_level, - F32 sub_level ); - -extern void AILCALL AIL_API_sample_51_volume_pan ( HSAMPLE S, - F32* volume, - F32* pan, - F32* fb_pan, - F32* center_level, - F32* sub_level ); - -extern void AILCALL AIL_API_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 ); - -extern void AILCALL AIL_API_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 ); -extern void AILCALL AIL_API_set_sample_volume_levels(HSAMPLE S, - F32 left_level, - F32 right_level); - -extern void AILCALL AIL_API_set_sample_reverb_levels(HSAMPLE S, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_set_sample_low_pass_cut_off( HSAMPLE S, - S32 /*-1 or MSS_SPEAKER*/ input_channel, - F32 cutoff ); - -extern void AILCALL AIL_API_set_sample_loop_count (HSAMPLE S, - S32 loop_count); - -extern void AILCALL AIL_API_set_sample_loop_block (HSAMPLE S, - S32 loop_start_offset, - S32 loop_end_offset); - -extern S32 AILCALL AIL_API_sample_loop_block (HSAMPLE S, - S32 *loop_start_offset, - S32 *loop_end_offset); - -extern U32 AILCALL AIL_API_sample_status (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_playback_rate (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_playback_rate_factor (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_playback_delay (HSAMPLE S); - -extern void AILCALL AIL_API_sample_volume_pan (HSAMPLE S, - F32* volume, - F32* pan); - -extern void AILCALL AIL_API_sample_volume_levels(HSAMPLE S, - F32 * left_level, - F32 * right_level); - -extern void AILCALL AIL_API_sample_reverb_levels(HSAMPLE S, - F32 * dry_level, - F32 * wet_level); - -extern F32 AILCALL AIL_API_sample_low_pass_cut_off(HSAMPLE S, S32 /*-1 or MSS_SPEAKER*/ channel); - -extern S32 AILCALL AIL_API_sample_loop_count (HSAMPLE S); - -extern void AILCALL AIL_API_set_digital_master_volume_level - (HDIGDRIVER dig, - F32 master_volume); - -extern F32 AILCALL AIL_API_digital_master_volume_level (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_digital_master_volume_levels(HDIGDRIVER dig, - F32 left_level, - F32 right_level); - -extern void AILCALL AIL_API_set_digital_master_reverb_levels(HDIGDRIVER dig, - S32 bus_index, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_set_digital_master_room_type(HDIGDRIVER dig, - S32 bus_index, - S32 room_type); - -extern void AILCALL AIL_API_digital_master_reverb_levels(HDIGDRIVER dig, - S32 bus_index, - F32 * dry_level, - F32 * wet_level); - -extern void AILCALL AIL_API_set_digital_master_reverb(HDIGDRIVER dig, - S32 bus_index, - F32 reverb_time, - F32 reverb_predelay, - F32 reverb_damping); - -extern void AILCALL AIL_API_digital_master_reverb(HDIGDRIVER dig, - S32 bus_index, - F32 * reverb_time, - F32 * reverb_predelay, - F32 * reverb_damping); - -extern S32 AILCALL AIL_API_minimum_sample_buffer_size - (HDIGDRIVER dig, - S32 playback_rate, - S32 format); - -extern S32 AILCALL AIL_API_set_sample_buffer_count - (HSAMPLE S, - S32 n_buffers); - -extern S32 AILCALL AIL_API_sample_buffer_count (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_buffer_available (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_loaded_len( HSAMPLE S ); - -extern S32 AILCALL AIL_API_load_sample_buffer (HSAMPLE S, - S32 buff_num, - void const *buffer, - U32 len); - -extern S32 AILCALL AIL_API_sample_buffer_info (HSAMPLE S, - S32 buff_num, - U32 *pos, - U32 *len, - S32 *head, - S32 *tail); - -extern U32 AILCALL AIL_API_sample_granularity (HSAMPLE S); - -extern void AILCALL AIL_API_set_sample_position (HSAMPLE S, - U32 pos); - -extern U32 AILCALL AIL_API_sample_position (HSAMPLE S); - -extern AILSAMPLECB AILCALL AIL_API_register_SOB_callback - (HSAMPLE S, - AILSAMPLECB SOB); - -extern AILSAMPLECB AILCALL AIL_API_register_EOB_callback - (HSAMPLE S, - AILSAMPLECB EOB); - -extern AILSAMPLECB AILCALL AIL_API_register_EOS_callback - (HSAMPLE S, - AILSAMPLECB EOS); - -extern AILFALLOFFCB AILCALL AIL_API_register_falloff_function_callback - (HSAMPLE S, - AILFALLOFFCB falloff_cb); - -extern void AILCALL AIL_API_set_sample_user_data (HSAMPLE S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_sample_user_data (HSAMPLE S, - U32 index); - -extern S32 AILCALL AIL_API_active_sample_count (HDIGDRIVER dig); - -extern void AILCALL AIL_API_digital_configuration (HDIGDRIVER dig, - S32 *rate, - S32 *format, - char *config); - -// -// High-level XMIDI services -// - -#if defined(IS_WINDOWS) - -extern S32 AILCALL AIL_API_midiOutOpen (HMDIDRIVER *drvr, - LPHMIDIOUT *lphMidiOut, - U32 dwDeviceID); - -extern void AILCALL AIL_API_midiOutClose (HMDIDRIVER mdi); - - -extern S32 AILCALL AIL_API_MIDI_handle_release (HMDIDRIVER mdi); - -extern S32 AILCALL AIL_API_MIDI_handle_reacquire (HMDIDRIVER mdi); - -#else - -extern HMDIDRIVER AILCALL AIL_API_open_XMIDI_driver( U32 flags ); - -extern void AILCALL AIL_API_close_XMIDI_driver( HMDIDRIVER mdi ); - -#endif - -extern HSEQUENCE AILCALL AIL_API_allocate_sequence_handle - (HMDIDRIVER mdi); - -extern void AILCALL AIL_API_release_sequence_handle - (HSEQUENCE S); - -extern S32 AILCALL AIL_API_init_sequence (HSEQUENCE S, - void const *start, - S32 sequence_num); - -extern void AILCALL AIL_API_start_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_stop_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_resume_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_end_sequence (HSEQUENCE S); - -extern void AILCALL AIL_API_set_sequence_tempo (HSEQUENCE S, - S32 tempo, - S32 milliseconds); - -extern void AILCALL AIL_API_set_sequence_volume (HSEQUENCE S, - S32 volume, - S32 milliseconds); - -extern void AILCALL AIL_API_set_sequence_loop_count - (HSEQUENCE S, - S32 loop_count); - -extern U32 AILCALL AIL_API_sequence_status (HSEQUENCE S); - -extern S32 AILCALL AIL_API_sequence_tempo (HSEQUENCE S); -extern S32 AILCALL AIL_API_sequence_volume (HSEQUENCE S); -extern S32 AILCALL AIL_API_sequence_loop_count (HSEQUENCE S); - -extern void AILCALL AIL_API_set_XMIDI_master_volume - (HMDIDRIVER mdi, - S32 master_volume); - -extern S32 AILCALL AIL_API_XMIDI_master_volume (HMDIDRIVER mdi); - -// -// Low-level XMIDI services -// - -extern S32 AILCALL AIL_API_active_sequence_count (HMDIDRIVER mdi); - -extern S32 AILCALL AIL_API_controller_value (HSEQUENCE S, - S32 channel, - S32 controller_num); - -extern S32 AILCALL AIL_API_channel_notes (HSEQUENCE S, - S32 channel); - -extern void AILCALL AIL_API_sequence_position (HSEQUENCE S, - S32 *beat, - S32 *measure); - -extern void AILCALL AIL_API_branch_index (HSEQUENCE S, - U32 marker); - -extern AILPREFIXCB AILCALL AIL_API_register_prefix_callback - (HSEQUENCE S, - AILPREFIXCB callback); - -extern AILTRIGGERCB AILCALL AIL_API_register_trigger_callback - (HSEQUENCE S, - AILTRIGGERCB callback); - -extern AILSEQUENCECB AILCALL AIL_API_register_sequence_callback - (HSEQUENCE S, - AILSEQUENCECB callback); - -extern AILEVENTCB AILCALL AIL_API_register_event_callback - (HMDIDRIVER mdi, - AILEVENTCB callback); - -extern AILBEATCB AILCALL AIL_API_register_beat_callback - (HSEQUENCE S, - AILBEATCB callback); - -extern AILTIMBRECB AILCALL AIL_API_register_timbre_callback - (HMDIDRIVER mdi, - AILTIMBRECB callback); - -extern void AILCALL AIL_API_set_sequence_user_data(HSEQUENCE S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_sequence_user_data (HSEQUENCE S, - U32 index); - -extern void AILCALL AIL_API_register_ICA_array (HSEQUENCE S, - U8 *array); - -extern S32 AILCALL AIL_API_lock_channel (HMDIDRIVER mdi); - -extern void AILCALL AIL_API_release_channel (HMDIDRIVER mdi, - S32 channel); - -extern void AILCALL AIL_API_map_sequence_channel (HSEQUENCE S, - S32 seq_channel, - S32 new_channel); - -extern S32 AILCALL AIL_API_true_sequence_channel (HSEQUENCE S, - S32 seq_channel); - -extern void AILCALL AIL_API_send_channel_voice_message - (HMDIDRIVER mdi, - HSEQUENCE S, - S32 status, - S32 data_1, - S32 data_2); - -extern void AILCALL AIL_API_send_sysex_message (HMDIDRIVER mdi, - void const *buffer); - -extern HWAVESYNTH - AILCALL AIL_API_create_wave_synthesizer (HDIGDRIVER dig, - HMDIDRIVER mdi, - void const *wave_lib, - S32 polyphony); - -extern void AILCALL AIL_API_destroy_wave_synthesizer(HWAVESYNTH W); - -extern S32 AILCALL AIL_API_MIDI_to_XMI (void const* MIDI, - U32 MIDI_size, - void**XMIDI, - U32 * XMIDI_size, - S32 flags); - -#if defined(IS_WIN32) - -extern S32 AILCALL AIL_API_list_MIDI (void const* MIDI, - U32 MIDI_size, - char* *list, - U32 * list_size, - S32 flags); - -extern S32 AILCALL AIL_API_list_DLS (void const* DLS, - char**list, - U32 * list_size, - S32 flags, - C8 * title); - -#endif - -extern char* AILCALL AIL_API_last_error ( void ); - -extern void AILCALL AIL_API_set_error ( char const* error_msg ); - -extern S32 AILCALL AIL_API_file_error (void); - -extern S32 AILCALL AIL_API_file_size (char const *filename, - char const * caller, - U32 caller_line); - -extern void * AILCALL AIL_API_file_read (char const *filename, - void *dest, - char const * caller, - U32 caller_line); - -extern S32 AILCALL AIL_API_file_write (char const *filename, - void const *buf, - U32 len); - -extern S32 AILCALL AIL_API_WAV_file_write (char const *filename, - void const *buf, - U32 len, - S32 rate, - S32 format); - -extern void AILCALL AIL_API_serve (void); - - -#ifdef IS_WINDOWS - -extern HREDBOOK AILCALL AIL_API_redbook_open (U32 which); - -extern HREDBOOK AILCALL AIL_API_redbook_open_drive(S32 drive); - -extern void AILCALL AIL_API_redbook_close (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_eject (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_retract (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_status (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_tracks (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_track (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_track_info (HREDBOOK hand, - U32 tracknum, - U32* startmsec, - U32* endmsec); - -extern U32 AILCALL AIL_API_redbook_id (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_position (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_play (HREDBOOK hand, - U32 startmsec, - U32 endmsec); - -extern U32 AILCALL AIL_API_redbook_stop (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_pause (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_resume (HREDBOOK hand); - -extern F32 AILCALL AIL_API_redbook_volume_level (HREDBOOK hand); - -extern F32 AILCALL AIL_API_redbook_set_volume_level(HREDBOOK hand, - F32 volume); - -#endif - -extern S32 AILCALL AIL_API_quick_startup (S32 use_digital, - S32 use_MIDI, - U32 output_rate, - S32 output_bits, - S32 output_channels); - -extern void AILCALL AIL_API_quick_shutdown (void); - -extern void AILCALL AIL_API_quick_handles (HDIGDRIVER* pdig, - HMDIDRIVER* pmdi, - HDLSDEVICE* pdls); - -extern HAUDIO AILCALL AIL_API_quick_load (char const *filename); - -extern HAUDIO AILCALL AIL_API_quick_load_mem (void const *mem, - U32 size); - -extern HAUDIO AILCALL AIL_API_quick_load_named_mem(void const *mem, - char const *filename, - U32 size); - -extern void AILCALL AIL_API_quick_unload (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_play (HAUDIO audio, - U32 loop_count); - -extern void AILCALL AIL_API_quick_halt (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_status (HAUDIO audio); - -extern HAUDIO AILCALL AIL_API_quick_load_and_play (char const *filename, - U32 loop_count, - S32 wait_request); - -extern void AILCALL AIL_API_quick_set_speed (HAUDIO audio, - S32 speed); - -extern void AILCALL AIL_API_quick_set_volume (HAUDIO audio, - F32 volume, - F32 extravol); - -extern void AILCALL AIL_API_quick_set_reverb_levels(HAUDIO audio, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_quick_set_low_pass_cut_off(HAUDIO audio, - S32 channel, - F32 cut_off); - -extern HAUDIO AILCALL AIL_API_quick_copy (HAUDIO hand); - -extern void AILCALL AIL_API_quick_set_ms_position (HAUDIO audio, - S32 milliseconds); - -extern S32 AILCALL AIL_API_quick_ms_position (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_ms_length (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_type (HAUDIO audio); - -// -// High-level streaming services -// - -void AILSTRM_shutdown(HDIGDRIVER driver); - -extern HSTREAM AILCALL AIL_API_open_stream (HDIGDRIVER dig, - char const* filename, - S32 stream_mem); - -extern void AILCALL AIL_API_close_stream (HSTREAM stream); - -extern S32 AILCALL AIL_API_service_stream (HSTREAM stream, - S32 fillup); - -extern void AILCALL AIL_API_start_stream (HSTREAM stream); - -extern void AILCALL AIL_API_pause_stream (HSTREAM stream, - S32 onoff); - -extern void AILCALL AIL_API_set_stream_loop_block (HSTREAM S, - S32 loop_start_offset, - S32 loop_end_offset); - -extern S32 AILCALL AIL_API_stream_loop_count (HSTREAM stream); - -extern void AILCALL AIL_API_set_stream_loop_count (HSTREAM stream, - S32 count); - -extern S32 AILCALL AIL_API_stream_status (HSTREAM stream); - -extern F32 AILCALL AIL_API_stream_filled_percent (HSTREAM stream); - -extern void AILCALL AIL_API_set_stream_position (HSTREAM stream, - S32 offset); - -extern S32 AILCALL AIL_API_stream_position (HSTREAM stream); - -extern void AILCALL AIL_API_stream_info (HSTREAM stream, - S32* datarate, - S32* sndtype, - S32* length, - S32* memory); - -extern void AILCALL AIL_API_auto_service_stream (HSTREAM stream, - S32 onoff); - -extern AILSTREAMCB AILCALL AIL_API_register_stream_callback - (HSTREAM stream, - AILSTREAMCB callback); - -extern void AILCALL AIL_API_set_stream_user_data (HSTREAM S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_stream_user_data (HSTREAM S, - U32 index); - -extern S32 AILCALL AIL_API_size_processed_digital_audio( - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO const* src); - -extern S32 AILCALL AIL_API_process_digital_audio( - void *dest_buffer, - S32 dest_buffer_size, - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO* src); - -extern HDLSDEVICE AILCALL AIL_API_DLS_open (HMDIDRIVER mdi, - HDIGDRIVER dig, -#ifdef IS_STATIC - AILSTATICDLS const* dls, -#else - char const* libname, -#endif - U32 flags, - U32 rate, - S32 bits, - S32 channels); - - -extern void AILCALL AIL_API_DLS_close (HDLSDEVICE dls, - U32 flags); - -extern HDLSFILEID AILCALL AIL_API_DLS_load_file (HDLSDEVICE dls, - char const* filename, - U32 flags); - -extern HDLSFILEID AILCALL AIL_API_DLS_load_memory (HDLSDEVICE dls, - void const* memfile, - U32 flags); - -extern void AILCALL AIL_API_DLS_unload (HDLSDEVICE dls, - HDLSFILEID dlsid); - -extern void AILCALL AIL_API_DLS_compact (HDLSDEVICE dls); - -extern void AILEXPORT AIL_API_DLS_set_reverb_levels(HDLSDEVICE dls, - F32 dry_level, - F32 wet_level); - -extern void AILEXPORT AIL_API_DLS_get_reverb_levels(HDLSDEVICE dls, - F32* dry_level, - F32* wet_level); - -extern void AILCALL AIL_API_DLS_get_info (HDLSDEVICE dls, - AILDLSINFO* info, - S32* PercentCPU); - -extern S32 AILCALL AIL_API_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); - -extern void AILCALL AIL_API_set_sequence_ms_position - (HSEQUENCE S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_sequence_ms_position (HSEQUENCE S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern void AILCALL AIL_API_set_sample_ms_position(HSAMPLE S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_sample_ms_position (HSAMPLE S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern U32 AILCALL AIL_API_sample_ms_lookup (HSAMPLE S, //) - S32 milliseconds, - S32* actualms); - -extern void AILCALL AIL_API_set_stream_ms_position(HSTREAM S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_stream_ms_position (HSTREAM S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern S32 AILCALL AIL_API_WAV_info (void const* data, - AILSOUNDINFO* info); - -extern S32 AILCALL AIL_API_compress_ADPCM (AILSOUNDINFO const* info, //) - void** outdata, U32* outsize); - -extern S32 AILCALL AIL_API_decompress_ADPCM (AILSOUNDINFO const* info, - void** outdata, - U32* outsize); - -extern S32 AILCALL AIL_API_file_type (void const* data, - U32 size); - -extern S32 AILCALL AIL_API_file_type_named (void const* data, - char const* filename, - U32 size); - -extern S32 AILCALL AIL_API_find_DLS (void const* data, - U32 size, - void**xmi, - U32* xmisize, - void**dls, - U32* dlssize); - -// -// Internal MSS mixer RIB calls -// - -extern U32 AILCALL MSS_MMX_available (void); - -extern void AILCALL MSS_mixer_startup (void); -extern void AILCALL MSS_mixer_shutdown (void); - -extern void AILCALL MSS_mixer_flush(S32 *dest, - S32 len -#ifdef IS_X86 - ,U32 MMX_available -#endif - ); - -extern void AILCALL MSS_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 - ); - -extern void AILCALL MSS_mixer_copy(void const *src, - S32 src_len, - void *dest, - U32 operation -#ifdef IS_BE - ,S32 big_endian_output -#else -#ifdef IS_X86 - ,U32 MMX_available -#endif -#endif - ); - -extern void AILCALL SS_set_speaker_configuration (D3DSTATE *D3D, - MSSVECTOR3D *speaker_positions, - S32 n_channels, - S32 logical_channels_per_sample); - -extern void SS_calculate_3D_channel_levels(D3DSTATE const *D3D, - S32 logical_channels_per_sample, - S3DSTATE *S3D, - F32 *channel_levels); - -extern void AILCALL SS_update_driver_reverb_state(HDIGDRIVER dig); - -extern void AILCALL SS_update_sample_reverb_state(HSAMPLE S); - -extern void AILCALL SS_flush (HDIGDRIVER dig, S32 reverb_index); - -extern void AILCALL SS_copy (HDIGDRIVER dig, S32 reverb_index, void *lpWaveAddr); - - -extern F32 AILCALLBACK SS_default_falloff_function_callback(HSAMPLE S, //) - F32 distance, - F32 rolloff_factor, - F32 min_dist, - F32 max_dist); -extern S32 AILCALLBACK SS_stream_to_buffer(HSAMPLE S, - S16 *dest_mono_sample_buffer, - S32 dest_buffer_size); - - -#ifdef MILES10 -extern void SS_fill(HDIGDRIVER dig); -#else -extern void SS_fill(HDIGDRIVER dig, void *lpData); -#endif - -extern void AILCALL SS_start_DIG_driver_playback(HSAMPLE S); - -extern S32 AILCALL SS_set_sample_type( HSAMPLE S, S32 format, U32 channel_mask ); - -extern void AILCALL AIL_apply_reverb( HDIGDRIVER dig ); - -extern S32 AILCALL AIL_allocate_reverb_buffers( HDIGDRIVER dig, S32 index ); - -extern void AILCALL AIL_apply_lowpass( void* dest, void const* src, void const* src_end, LOWPASS_INFO* lp_in, S32 op ); - - -#if defined(IS_WIN32) || defined(IS_GENERICDIG) -extern S32 AILCALL get_system_speaker_configuration(MSS_MC_SPEC *channel_spec); -#endif - - -#ifdef IS_BE - - #ifdef IS_PPC - - #ifdef IS_XENON - - #define LE_SWAP32( ptr ) __loadwordbytereverse(0,ptr) - - #define LE_SWAP32_OFS( ptr,ofs ) __loadwordbytereverse(ofs,ptr) - - #define STORE_LE_SWAP32( ptr, val ) __storewordbytereverse ( (U32)(val), 0, ptr ) - - #elif (defined(IS_PS3) && !defined(IS_SPU)) || defined(IS_MAC) - #define LE_SWAP32( ptr ) ld_le32(ptr) - #define LE_SWAP32_OFS( ptr, ofs ) ld_le32_ofs(ptr,ofs) - // the char* is not required, but works around a GCC bug - #define STORE_LE_SWAP32( ptr, val ) st_le32( (char*)(ptr), (U32)(val) ) - #elif defined(IS_WIIU) - - #define LE_SWAP32(ptr) (*(__bytereversed unsigned int *)(ptr)) - #define LE_SWAP32_OFS(ptr, ofs) (*(__bytereversed unsigned int *)AIL_ptr_add(ptr, ofs)) - - #define STORE_LE_SWAP32( ptr, val ) (*(__bytereversed unsigned int *)(ptr) = (val)) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) (*(__bytereversed unsigned short*)(AIL_ptr_add(ptr, const_ofs))) = (val) - #else - #define LE_SWAP32( ptr ) __lwbrx((void*)(ptr),0) - #define LE_SWAP32_OFS( ptr,ofs ) __lwbrx((void*)(ptr),ofs) - - #define STORE_LE_SWAP32( ptr, val ) __stwbrx( (U32)(val), ptr, 0 ) - #endif - - #elif defined(IS_SPU) - - static U32 inline LE_SWAP32(void const * src) __attribute__((always_inline)); - static U32 inline LE_SWAP32(void const * src) - { - U32 i = (*((U32*)src)); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - static U32 inline LE_SWAP32_OFS(void const * src,S32 ofs) __attribute__((always_inline)); - static U32 inline LE_SWAP32_OFS(void const * src,S32 ofs) - { - U32 i = (*((U32*)(((char*)src)+ofs))); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - #define STORE_LE_SWAP32( ptr, val )\ - { \ - U32 tmp = (U32) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U32 *)(((char*)ptr)+0)) = tmp; \ - } - - #define STORE_LE_SWAP32_OFS( ptr, val, ofs )\ - { \ - U32 tmp = (U32) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U32 *)(((char*)ptr)+ofs)) = tmp; \ - } - - #else - - #define LE_SWAP32(ptr) \ - ( ( ( ( *((U32 *)(ptr) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)(ptr) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 24 ) ) ) - - #define LE_SWAP32_OFS(ptr,ofs) \ - ( ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) >> 24 ) ) ) - - #define STORE_LE_SWAP32( ptr, val ) { *((U32 *)ptr) = \ - ( ( ( ( ((U32)(val) ) ) << 24 ) ) | \ - ( ( ( ((U32)(val) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( ((U32)(val) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( ((U32)(val) ) ) >> 24 ) ) ); } - - #endif - - #if defined( IS_PPC ) - - #ifdef IS_XENON - unsigned short __loadshortbytereverse (int offset, const void * base); - unsigned long __loadwordbytereverse (int offset, const void * base); - - void __storeshortbytereverse (unsigned short val, int offset, void * base); - void __storewordbytereverse (unsigned int val, int offset, void * base); - - #define LE_SWAP16( ptr ) __loadshortbytereverse (0,(S16 *)ptr) - - #define LE_SWAP16_OFS( ptr, const_ofs ) __loadshortbytereverse (const_ofs,(S16 *)ptr) - - #define STORE_LE_SWAP16( ptr, val ) __storeshortbytereverse ( (U16)(val), 0, (S16 *)ptr ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) __storeshortbytereverse ( (U16)(val), const_ofs, (S16 *)ptr ) - #else - - #if (defined(IS_PS3) && !defined(IS_SPU)) || defined(IS_MAC) - - #define __fsel( outf, cmp, inf1, inf2 ) \ - __asm__ __volatile__ ("fsel %0,%1,%2,%3" : "=f" (outf) : "f" (cmp), "f" (inf1), "f" (inf2)); - - static inline float fclip1(float sample ) - { - float ret; - - __fsel( ret, sample + 1.0f, sample, -1.0f ); - __fsel( ret, sample - 1.0f, 1.0f, ret ); - return( ret ); - } - - static __inline__ U16 ld_le16(const S16 *addr) - { - U16 val; - __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr)); - return val; - } - - static __inline__ U16 ld_le16_ofs(const S16 *addr, U64 const_ofs ) - { - U16 val; - __asm__ __volatile__ ("lhbrx %0,%1,%2" : "=r" (val) : "b" (const_ofs), "r" (addr)); - return val; - } - - static __inline__ void st_le16(S16 *addr, const U16 val) - { - __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); - } - - static __inline__ void st_le16_ofs(S16 *addr, U64 const_ofs, const U16 val) - { - __asm__ __volatile__ ("sthbrx %2,%1,%3" : "=m" (*addr) : "b" (const_ofs), "r" (val), "r" (addr)); - } - - static __inline__ U32 ld_le32(const void *addr) - { - U32 val; - - __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" ((U32*)addr) ); - return val; - } - - static __inline__ U32 ld_le32_ofs(const void *addr, U64 const_ofs ) - { - U32 val; - __asm__ __volatile__ ("lwbrx %0,%1,%2" : "=r" (val) : "b" (const_ofs), "r" (addr)); - return val; - } - -/* static __inline__ void st_le32_ofs(void *addr, U64 const_ofs, const U32 val) - { - __asm__ __volatile__ ("stwbrx %2,%1,%3" : "=m" (*(U32*)addr) : "b" (const_ofs), "r" (val), "r" ((U32*)addr)); - }*/ - - static __inline__ void st_le32(void *addr, const U32 val) - { //todo, weird hacks to make this work with GCC - __asm__ __volatile__ ("stwbrx %1,%3,%2" : "=m" (*(U32*)addr) : "r" (val), "r" ((U32*)addr), "O"(0) ); - } - - #define LE_SWAP16( ptr ) ld_le16 ((S16 *)ptr) - - #define LE_SWAP16_OFS( ptr, const_ofs ) ld_le16_ofs ((S16 *)ptr, const_ofs) - - #define STORE_LE_SWAP16( ptr, val ) st_le16( (S16 *)ptr, (U16)(val) ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) st_le16_ofs( (S16 *)ptr, const_ofs, (U16)(val) ) - #elif defined(IS_WIIU) - - #define LE_SWAP16(ptr) (*(__bytereversed unsigned short *)(ptr)) - #define LE_SWAP16_OFS(ptr, ofs) (*(__bytereversed unsigned short *)AIL_ptr_add(ptr, ofs)) - - #define STORE_LE_SWAP16( ptr, val ) (*(__bytereversed unsigned short *)(ptr) = (val)) - - #else - #define LE_SWAP16( ptr ) __lhbrx((S16 *)ptr,0) - - #define LE_SWAP16_OFS( ptr, const_ofs ) __lhbrx((S16 *)ptr,const_ofs) - - #define STORE_LE_SWAP16( ptr, val ) __sthbrx( (U16)(val), (S16 *)ptr, 0 ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) __sthbrx( (U16)(val), (S16 *)ptr, const_ofs ) - #endif - #endif - - #elif defined( IS_SPU ) - - static U32 inline LE_SWAP16(void const * src) __attribute__((always_inline)); - static U32 inline LE_SWAP16(void const * src) - { - U32 i = (*((U16*)src)); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - static U32 inline LE_SWAP16_OFS(void const * src, S32 ofs) __attribute__((always_inline)); - static U32 inline LE_SWAP16_OFS(void const * src, S32 ofs) - { - U32 i = (*((U16*)(((char*)src)+ofs))); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - #define STORE_LE_SWAP16( ptr, val )\ - { \ - U32 tmp = (U16) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U16 *)(((char*)ptr)+0)) = tmp; \ - } - - #define STORE_LE_SWAP16_OFS( ptr, val, ofs )\ - { \ - U32 tmp = (U16) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U16 *)(((char*)ptr)+ofs)) = tmp;\ - } - - #else - - #define LE_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(ptr) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(ptr) ) ) >> 8 ) ) ) \ - ) - - #define LE_SWAP16_OFS(ptr,const_ofs) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) >> 8 ) ) ) \ - ) - - #define STORE_LE_SWAP16( ptr, val ) { *((U16*)ptr) = ( \ - ( ( ( ((U16)(val) ) ) << 8 ) ) | \ - ( ( ( ((U16)(val) ) ) >> 8 ) ) ); } - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) { *((U16*)AIL_ptr_add(ptr,const_ofs)) = ( \ - ( ( ( ((U16)(val) ) ) << 8 ) ) | \ - ( ( ( ((U16)(val) ) ) >> 8 ) ) ); } - - #endif - - #define BE_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define BE_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define MEM_LE_SWAP32(n) *((U32*)n) = LE_SWAP32(n); - #define MEM_LE_SWAP16(n) *((U16*)n) = (U16) LE_SWAP16(n); - - #define MEM_BE_SWAP32(n) - #define MEM_BE_SWAP16(n) - - // unaligned versions - #define BEU_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define BEU_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define LEU_SWAP32(ptr) LE_SWAP32(ptr) - #define LEU_SWAP16(ptr) LE_SWAP16(ptr) - - #define STORE_LEU_SWAP32( ptr, val ) STORE_LE_SWAP32( ptr, val ) - #define STORE_LEU_SWAP16( ptr, val ) STORE_LE_SWAP16( ptr, val ) - - #define MEM_LEU_SWAP32(n) *((U32*)n) = LEU_SWAP32(n); - #define MEM_LEU_SWAP16(n) *((U32*)n) = LEU_SWAP32(n); - -#else // IS_BE - - #define LE_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define LE_SWAP32_OFS( ptr,const_ofs ) ( *((U32 *)AIL_ptr_add(ptr,const_ofs) ) ) - #define LE_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define LE_SWAP16_OFS( ptr, const_ofs ) ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) - - #define STORE_LE_SWAP32( ptr, val ) { *((U32*)(ptr))=(U32)(val); } - #define STORE_LE_SWAP16( ptr, val ) { *((U16*)(ptr))=(U16)(val); } - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) { *((U16*)((((U8*)ptr)+const_ofs)))=(U16)(val); } - - #define BE_SWAP32(ptr) \ - ( ( ( ( *((U32 *)(ptr) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)(ptr) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 24 ) ) ) - - #define BE_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(ptr) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(ptr) ) ) >> 8 ) ) ) \ - ) - -#if defined(IS_PSP) - - #define putunaligned4(temp, s ) \ - __asm__("swl %1,3+%0" : "+m"(*(s)): "r"(temp)); \ - __asm__("swr %1,%0" : "+m"(*(s)) : "r"(temp)); - - #define getunaligned4(temp, s ) \ - __asm__("lwl %0,3+%1" : "=r"(temp) : "o"(*(U32*)(s))); \ - __asm__("lwr %0,%1" : "+r"(temp) : "o"(*(U32*)(s)) ); - - static inline U32 LEU_SWAP32( void * ptr ) - { - U32 ret; - getunaligned4( ret, ptr ); - return( ret ); - } - - static inline U32 BEU_SWAP32( void * ptr ) - { - U32 ret; - - getunaligned4( ret, ptr ); - ret = ( ret << 24 ) | ( ( ret << 8 ) & 0x00ff0000 ) | ( ( ret >> 8 ) & 0x0000ff00 ) | ( ret >> 24 ); - return( ret ); - } - - #define LEU_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( ((U32)(((U8 *)(ptr))[1]) ) ) << 8 ) ) | \ - ( ( ( ((U32)(((U8 *)(ptr))[0]) ) ) ) ) ) \ - ) - #define BEU_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( ((U32)(((U8 *)(ptr))[0]) ) ) << 8 ) ) | \ - ( ( ( ((U32)(((U8 *)(ptr))[1]) ) ) ) ) ) \ - ) - - #define STORE_LEU_SWAP32( ptr, val ) { register U32 __v = (U32)val; register U32 * __p = (U32*)ptr; putunaligned4( __v, __p ); } - #define STORE_LEU_SWAP16( ptr, val ) { register U16 __v = (U16)val; ((U8*)(ptr))[0]=(U8)val; ((U8*)(ptr))[1]=(U8)(val>>8);} - -#else - - #define LEU_SWAP32(ptr) LE_SWAP32(ptr) - #define LEU_SWAP16(ptr) LE_SWAP16(ptr) - - #define BEU_SWAP32(ptr) BE_SWAP32(ptr) - #define BEU_SWAP16(ptr) BE_SWAP16(ptr) - - #define STORE_LEU_SWAP32( ptr, val ) STORE_LE_SWAP32( ptr, val ) - #define STORE_LEU_SWAP16( ptr, val ) STORE_LE_SWAP16( ptr, val ) - -#endif - - #define MEM_LEU_SWAP32(n) - #define MEM_LEU_SWAP16(n) - - #define MEM_LE_SWAP32(n) - #define MEM_LE_SWAP16(n) - - #define MEM_BE_SWAP32(n) *((U32*)n) = BE_SWAP32(n); - #define MEM_BE_SWAP16(n) *((U16*)n) = BE_SWAP16(n); - -#endif - - - -#if defined(IS_MAC) || defined(IS_WII) || defined(IS_IPHONE) - -#ifdef IS_X86 - -static inline U32 mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; - - return( retv ); - -} - - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; - return( retv ); -} - -#elif defined(IS_IPHONE) - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -static U32 __inline mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; - return( retv ); -} - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; - return( retv ); -} - -#else - -// -// These three dudes help deal with u64s in hi,lo format -// - -#define mul64hilo(_hi,_lo,_mt1,_mt2) \ - __asm \ - { \ - mulhwu _hi, _mt1, _mt2; \ - mullw _lo, _mt1, _mt2 \ - } \ - - -#define imul64hilo(_hi,_lo,_mt1,_mt2) \ - __asm \ - { \ - mulhw _hi, _mt1, _mt2; \ - mullw _lo, _mt1, _mt2 \ - } \ - - -#define add64hilo(_hi,_lo,_hisub,_losub) \ - __asm \ - { \ - addc _lo, _losub, _lo; \ - adde _hi, _hisub, _hi \ - } \ - - -#define sub64hilo(_hi,_lo,_hisub,_losub) \ - __asm \ - { \ - subfc _lo, _losub, _lo; \ - subfe _hi, _hisub, _hi \ - } \ - -#define carry_check( q, r, c, d ) \ - if ( r < c ) \ - { \ - --q; \ - r += d; \ - if ( r >= d ) \ - { \ - if ( r < c ) \ - { \ - --q; \ - r += d; \ - } \ - } \ - } - -// The PPC mac doesnt' have intrinsics like CW -#ifdef IS_MAC -static U32 __cntlzw(U32 in) -{ - U32 ret; - asm ("cntlzw %0, %1\n": "=r" (ret): "r" (in)); - return ret; -} -#endif - -static inline U32 div64with16( U32 nlo, U32 nhi, U32 d ) -{ - U32 dlo, dhi; - U32 rlo, rhi; - U32 qhi, qlo; - U32 carry; - - dhi = d >> 16; - dlo = d & 0xffff; - - qhi = nhi / dhi; - rhi = nhi % dhi; - - carry = qhi * dlo; - - rhi = ( rhi << 16 ) | ( nlo >> 16 ); - - carry_check( qhi, rhi, carry, d ); - rhi -= carry; - - qlo = rhi / dhi; - rlo = rhi % dhi; - carry = qlo * dlo; - - qhi <<= 16; - - rlo = ( rlo << 16 ) | ( nlo & 0xffff ); - carry_check( qlo, rlo, carry, d ); - -// rlo -= carry; - - return( qhi | qlo ); -} - -static U32 inline mult64anddiv( register U32 a, register U32 b,U32 d ) -{ -/* register U32 hi, lo; - register U32 mt1, mt2, d; - - mt1=m1; - mt2=m2; - d=dv; - - mul64hilo( hi, lo, mt1, mt2 ); - - return( div64(hi,lo,d) ); -*/ - U32 lz; - register U32 nhi=0, nlo=0; - - mul64hilo( nhi, nlo, a, b ); - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( ( nhi << ( lz + 1 ) ) | ( nlo >> ( 31 - lz ) ) ); - } - - if ( nhi == 0 ) - { - return( nlo / d ); - } - - lz = (U32) __cntlzw( d ); - - d <<= lz; - nhi = ( nhi << lz ) + ( nlo >> ( 32 - lz ) ); - nlo <<= lz; - - return( div64with16( nlo, nhi, d ) ); - -} - -static U32 inline mult64andshift( U32 m1,U32 m2,U32 shift ) -{ - register U32 hi, lo; - register U32 mt1, mt2; - - mt1=m1; - mt2=m2; - - mul64hilo( hi, lo, mt1, mt2 ); - - return( ( hi << (32 - shift ) ) + ( lo >> shift ) ); -} - -static U32 inline mult64addsubandshift( U32 m1, U32 m2, U32 av, U32 sv, U32 shift ) -{ - register U32 hi=0, lo=0; - register U32 mt1, mt2; - register U32 addv; - register U32 subv; - register U32 zero = 0; - - mt1=m1; - mt2=m2; - addv=av; - subv=sv; - - mul64hilo(hi,lo,mt1,mt2); - add64hilo( hi, lo, zero, addv ); - sub64hilo( hi, lo, zero, subv ); - - return( ( hi << (32 - shift ) ) + ( lo >> shift ) ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 av, U32 sv, U32 divv) -{ - register U32 hi, lo; - register U32 addv; - register U32 subv; - register U32 d; - register U32 zero = 0; - U32 lz; - - addv=av; - subv=sv; - d=divv; - - hi = val >> ( 32 - shift ); - lo = val << shift; - add64hilo( hi, lo, zero, addv ); - sub64hilo( hi, lo, zero, subv ); - - if ( hi & 0x80000000 ) - { - register U32 ihi = hi; - register U32 ilo = lo; - hi = lo = 0; - sub64hilo( hi, lo, ihi, ilo ); - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( (U32) -(S32) ( ( hi << ( lz + 1 ) ) | ( lo >> ( 31 - lz ) ) ) ); - } - - if ( hi == 0 ) - { - return( (U32) -(S32) ( lo / d ) ); - } - - return( (U32) -(S32) div64with16( lo,hi,d ) ); - } - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( ( hi << ( lz + 1 ) ) | ( lo >> ( 31 - lz ) ) ); - } - - if ( hi == 0 ) - { - return( lo / d ); - } - - return( div64with16( lo,hi,d ) ); -} - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - -#endif - -#else - -#if ( defined(IS_X86) && defined(IS_WIN32API) ) || defined(IS_LINUX) || defined(__RADSEKRIT2__) - -// -// Macros to aid in writing to build buffers -// - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -static U32 __inline mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) mt1 * mt2; - value += addv; - value -= subv; - value = (S64) value >> (S64) shift; - retv = (U32) value; -#else - __asm - { - mov eax,[mt1] - mov ecx,[mt2] - mul ecx - add eax,[addv] - adc edx,0 - sub eax,[subv] - sbb edx,0 - mov ecx,[shift] - shrd eax,edx,cl - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) a * b; - value /= c; - retv = (U32) value; -#else - __asm - { - mov eax,[a] - mov ecx,[b] - mul ecx - mov ecx,[c] - div ecx - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) val; - value <<= shift; - value += addv; - value -= subv; - value = (S64) value / (S64) divv; - retv = (U32) value; -#else - __asm - { - xor edx, edx - mov eax, [val] - mov ecx, [shift] - shld edx, eax, cl - shl eax, cl - add eax, [addv] - adc edx, 0 - sub eax, [subv] - sbb edx, 0 - mov ecx, [divv] - idiv ecx - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -#else - -#ifdef __WATCOMC__ - -#else - -#if defined( IS_XENON ) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - - -#else - -#if defined( IS_PSP ) || defined(IS_3DS) || defined(IS_PSP2) || defined(__RADANDROID__) - - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -#elif defined(IS_WIIU) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - - - -#elif defined( IS_PS3 ) && !defined( IS_SPU ) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) *dest = (S16)(U16)0xff7f; \ - else if (fOut < -32768.0F) *dest = (S16)(U16)0x0080; \ - else STORE_LE_SWAP16( dest, (S16) fOut ) \ - ++dest; \ -} - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< - - static int stacksizehas( int v ) - { - vector signed int val; - __asm__("or %0,$1,$1" : "=r"(val) ); - - if ( val[1] < ( v + 2048 ) ) { MSSBreakPoint(); } - return v; - } - #define spu_alloc(bytes) (void*)alloca( stacksizehas( ( ( bytes ) + 15 ) & ~15 ) ) - #else - #include - #define spu_alloc(bytes) (void*)alloca( ( ( bytes ) + 15 ) & ~15 ) - #endif - -#endif - -#else - -#define SPU_NAME( flt, name ) static void AILCALL name -#define addstackmark() - -#endif - -// -// low-level utility memory file routines -// - -typedef struct _MEMDUMP -{ - void* buffer[1024]; // up to 64 MB - U8* current; - U32 size; - U32 totalsize; - U32 curbufnum; - U32 lastbufnum; - U32 curpos; - S32 error; - S32 expandable; - U32 eachbuf; - U32 firstbuf; -} MEMDUMP; - -// This typedef occurs in mss.h as well. -//typedef struct _MEMDUMP* HMEMDUMP; - -DXDEC HMEMDUMP AILCALL AIL_mem_open(void* addr,U32 size); - -DXDEC HMEMDUMP AILCALL AIL_mem_create(void); -DXDEC HMEMDUMP AILCALL AIL_mem_create_from_existing(void* addr, U32 size); // do not delete pointer passed in - -DXDEC S32 AILCALL AIL_mem_close(HMEMDUMP m, void** buf, U32* size); - -DXDEC U32 -#if defined(IS_WIN32API) -__cdecl -#endif -AIL_mem_printf(HMEMDUMP m, char const* fmt, ...); - -DXDEC U32 AILCALL AIL_mem_printc(HMEMDUMP m, char c); - -DXDEC U32 AILCALL AIL_mem_prints(HMEMDUMP m, char const* s); - -DXDEC U32 AILCALL AIL_mem_write(HMEMDUMP m, void const* s, U32 bytes); - -DXDEC U32 AILCALL AIL_mem_read(HMEMDUMP m, void* s, U32 bytes); - -DXDEC U32 AILCALL AIL_mem_seek(HMEMDUMP m, U32 pos); - -DXDEC U32 AILCALL AIL_mem_size(HMEMDUMP m); - -DXDEC U32 AILCALL AIL_mem_pos(HMEMDUMP m); - -DXDEC S32 AILCALL AIL_mem_error(HMEMDUMP m); - - - -#define DIG_PROCESS_BUFFER_SIZE 2048 - -extern U8 *ASI_mem_src_ptr; -extern S32 ASI_mem_src_len; -extern S32 ASI_mem_src_pos; - - -extern S32 AILCALLBACK ASI_mem_stream_CB(UINTa user, //) - void *dest, - S32 bytes_requested, - S32 offset); - -#if 1 - -#if 0 //used to be a IS_LINUX - -#else - -DXDEC S32 AILCALL AIL_stricmp(const char *s1, const char *s2); -DXDEC S32 AILCALL AIL_strnicmp( const char *s1, const char *s2, U32 maxlen); - -#if defined(IS_MAC) || defined(IS_LINUX) || defined(IS_3DS) || defined(IS_IPHONE) || defined(IS_PSP2) || defined(IS_WIIU) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) - -#ifdef IS_PSP2 -#ifdef __cplusplus -} -#endif -#endif - -#include -#include // for abs(). - -#ifdef IS_PSP2 -#ifdef __cplusplus -extern "C" { -#endif -#endif - - -#define AIL_memcpy memcpy -#define AIL_memmove memmove -#define AIL_strcpy strcpy -#define AIL_strcmp strcmp -#define AIL_strlen strlen -#define AIL_strcat strcat -#define AIL_memset memset -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) -#define AIL_ptr_alloc_clone(x) ((void*)x) -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#define AIL_abs abs -#define AIL_memcmp memcmp - -#else // not mac or linux - -#ifdef IS_WIN32API - -#define AIL_abs abs - -#ifdef IS_XENON - -typedef void *PVOID; -typedef int INT; -typedef unsigned long ULONG_PTR; -typedef ULONG_PTR SIZE_T; - -PVOID -__stdcall -XMemSet( - PVOID pDest, - INT c, - SIZE_T count - ); - -PVOID -__stdcall -XMemCpy( - PVOID pDest, - const void* pSrc, - SIZE_T count - ); - -char * __cdecl strcpy( char *_Dest, const char * _Source); - -#define AIL_memcpy XMemCpy -#define AIL_memset XMemSet - -#else - -#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(__NT__) || defined(__WIN32__) - #include - void * __cdecl memcpy(void *, const void *, size_t); - void * __cdecl memset(void *, int, size_t); - char * __cdecl strcpy(char *, const char *); -#endif - -#define AIL_memcpy memcpy -#define AIL_memset memset - -#endif - -#if defined(IS_XENON) -#include -#endif - -#define AIL_memmove memmove - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#else - -#if defined(IS_PSP) - -#define AIL_memmove memmove - -#define AIL_memcpy memcpy - -#define AIL_memset memset - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_stricmp strcasecmp - -#define AIL_strnicmp strncasecmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -static inline S32 AIL_abs(S32 v) { return( ( v >=0 ) ? v : -v ); } - - -#elif defined(IS_PS3) - -#define AIL_memmove memmove - -#define AIL_memcpy memcpy - -#define AIL_memset memset - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_stricmp strcasecmp_ascii - -#define AIL_strnicmp strncasecmp_ascii - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -static inline S32 AIL_abs(S32 v) { return( ( v >=0 ) ? v : -v ); } - -#else - -#ifdef IS_WII - -#define AIL_memcpy memcpy - -#define AIL_memmove memmove - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_memset memset - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#ifndef __cplusplus -int abs( int ); -#endif - -#define AIL_abs abs -#define AIL_memcmp memcmp - -#endif - -#endif - -#endif - -#endif - -#endif - -#endif - -#ifndef AIL_ptr_inc_clone -#define AIL_ptr_inc_clone(x,y) AIL_ptr_inc_clone_ref((void * *)(void*) &(x),y) -#endif -#define AIL_ptr_from_clone(clone,hptr) (AIL_ptr_add(hptr,AIL_ptr_dif(clone,hptr))) - - -#ifdef IS_32 - -#define MSS_do_cb1(type,addr,ds,param1) \ - (addr)(param1) - -#define MSS_do_cb3(type,addr,ds,param1,param2,param3) \ - (addr)(param1,param2,param3) - -#define MSS_do_cb4(type,addr,ds,param1,param2,param3,param4) \ - (addr)(param1,param2,param3,param4) - -#define MSS_do_cb1_with_ret(ret,type,addr,ds,param1) \ - ret = (addr)(param1) - -#define MSS_do_cb3_with_ret(ret,type,addr,ds,param1,param2,param3) \ - ret = (addr)(param1,param2,param3) - -#define MSS_do_cb4_with_ret(ret,type,addr,ds,param1,param2,param3,param4) \ - ret = (addr)(param1,param2,param3,param4) - -#define MSS_do_cb5_with_ret(ret,type,addr,ds,param1,param2,param3,param4,param5) \ - ret = (addr)(param1,param2,param3,param4,param5) - -#endif - -#if (defined(IS_MAC) && defined( IS_X86 )) || defined(IS_LINUX) - - -#define MSS_CB_STACK_ALIGN( name ) \ -void MSS_CALLBACK_ALIGNED_NAME(name)(void)\ -{\ - asm (\ - "mov $16,%%eax\n" \ - "sub $64,%%esp\n" \ - "add %%esp, %%eax\n" \ - "and $0xfffffff0,%%eax\n" \ - "movups 8(%%ebp), %%xmm0\n" \ - "movaps %%xmm0, (%%eax)\n" \ - "movl %%esp, 32(%%eax)\n" \ - "mov %%eax,%%esp\n" \ - "call *%0\n" \ - "movl 32(%%esp), %%esp\n" \ - "add $64,%%esp\n" \ - : : "r" (name) : "eax"); \ -} - -#define MSS_DEF_CB_STACK_ALIGN( name ) DXDEF MSS_CB_STACK_ALIGN( name ) -#define MSS_CB_STACK_ALIGN_DEC( name ) void MSS_CALLBACK_ALIGNED_NAME(name)(void); - -#else - -#define MSS_CB_STACK_ALIGN( name ) -#define MSS_DEF_CB_STACK_ALIGN( name ) -#define MSS_CB_STACK_ALIGN_DEC( name ) - -#endif - -#ifdef IS_XENON - -#define XWAVE_FORMAT_XMA 0x0165 - -typedef MSS_STRUCT XXMASTREAMFORMAT -{ - U32 PsuedoBytesPerSec; // Used by encoder - U32 SampleRate; // Sample rate for the stream. - U32 LoopStart; // Loop start offset (in bits). - U32 LoopEnd; // Loop end offset (in bits). - - // Format for SubframeData: eeee ssss. - // e: Subframe number of loop end point [0,3]. - // s: Number of subframes to skip before decoding and outputting at the loop start point [1,4]. - - U8 SubframeData; // Data for decoding subframes. See above. - U8 Channels; // Number of channels in the stream (1 or 2). - U16 ChannelMask; // Channel assignments for the channels in the stream (same as - // lower 16 bits of dwChannelMask in WAVEFORMATEXTENSIBLE). -} XXMASTREAMFORMAT; - -typedef MSS_STRUCT XXMAWAVEFORMAT -{ - U16 FormatTag; // Audio format type (always WAVE_FORMAT_XMA). - U16 BitsPerSample; // Bit depth (currently required to be 16). - U16 EncodeOptions; // Options for XMA encoder/decoder. - U16 LargestSkip; // Largest skip used in interleaving streams. - U16 NumStreams; // Number of interleaved audio streams. - U8 LoopCount; // Number of loop repetitions (255 == infinite). - U8 Version; // Version of the encoder that generated this. - XXMASTREAMFORMAT XmaStreams[1]; // Format info for each stream (can grow based on wNumStreams). -} XXMAWAVEFORMAT; - -#endif - -extern U32 SS_granularity(HSAMPLE S); - -extern S32 MC_open_output_filter(C8 const *name, //) - HDIGDRIVER driver, - S32 is_matrix_filter); - -extern void AILCALL MSS_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 ); - -extern void AILCALL MSS_mixer_adpcm_decode( void * dest, - void const * in, - S32 out_len, - S32 in_len, - S32 input_format, - ADPCMDATA *adpcm_data ); -// -// Prototypes for ADPCM decode routines -// - -extern void ASMLINK DecodeADPCM_STEREO( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - -extern void ASMLINK DecodeADPCM_MONO( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - -extern void ASMLINK DecodeADPCM_MONO_8( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - - -// -// .VOC file header -// - -typedef MSS_STRUCT -{ - S8 ID_string[20]; - - U16 data_offset; - U16 version; - U16 ID_code; -} -VOC; - -typedef MSS_STRUCT _ADPCMOUT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - S16 extra; - S16 samples_per_block; - U32 factmark; - U32 factlen; - U32 samples; - U32 datamark; - U32 datalen; -} ADPCMOUT; - -typedef MSS_STRUCT _WAVEOUT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - U32 datamark; - U32 datalen; -} WAVEOUT; - -typedef MSS_STRUCT _WAVEOUTEXT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - U16 size; - U16 sampbits; - U32 chanmask; - U8 subfmt[16]; - U32 datamark; - U32 datalen; -} WAVEOUTEXT; - -F32 evaluate_graph(MSSGRAPHPOINT const* graph, S32 cnt, F32 x); - -// -// platform allocators -// - -void * AILCALLBACK platform_alloc(UINTa size); -void AILCALLBACK platform_free( void * ptr ); - - -// -// Abstracted IO structures. -// - -#ifdef IS_WII -#define MAX_PLATFILE_SPECIFIC_SIZE 512 -#else -#define MAX_PLATFILE_SPECIFIC_SIZE 32 -#endif -typedef struct PLATFORM_FILE -{ - char plat_specific[MAX_PLATFILE_SPECIFIC_SIZE]; // needs to be at the front for wii - U32 offset; // current offset in to our "file" - U32 start_pos; // offset of our "file" from the start of the physical file. - U32 file_length; // length of our "file" - S32 dont_close; // nonzero if we don't own the file handle, so when done, don't close. - U32 raw_length; // length of the entire file that we might be "inside of" -} PLATFORM_FILE; - -typedef struct FNVALUES -{ - char const * filename; - U32 size; - U32 start; -} FNVALUES; - -typedef struct FHVALUES -{ - S32 hand; - S32 length; - S32 pos; -} FHVALUES; - -// -// Functions implemented per platform. -// -extern int Platform_OpenFile(struct PLATFORM_FILE* i_File, char const * fn); -extern void Platform_SeekFromBeginning(PLATFORM_FILE* i_File, S32 i_Offset); -extern U32 Platform_ReadFile(PLATFORM_FILE* i_File, void* o_Buffer, U32 i_ReadBytes); -extern void Platform_CloseFile(PLATFORM_FILE* i_File); - -DXDEC void AILCALL AIL_set_event_settings(void* i_Settings); - -// Auditioner Declarations -//----------------------------------------------------------------------------- -S32 Audition_Status(); -S32 Audition_Pump(); -void* Audition_OpenBank(char const* i_FileName); -S32 Audition_OpenComplete(void* i_Bank); -void Audition_CloseBank(void* i_Bank); - -void Audition_Suppress(S32 i_IsSuppressed); -void Audition_FrameStart(); -void Audition_FrameEnd(); -void Audition_DefragStart(); -void Audition_SetBlend(U64 i_EventId, char const* i_Name); -void Audition_SetPersist(U64 i_EventId, char const* i_Name, char const* i_Preset); -void Audition_Event(char const* i_EventName, U64 i_EventId, U64 i_Filter, S32 i_Exists, void* i_InitBlock, S32 i_InitBlockLen); -void Audition_Sound(U64 i_EventId, U64 i_SoundId, char const* i_Sound, char const* i_Label, float i_Volume, S32 i_Delay, float i_Pitch); -void Audition_SoundComplete(U64 i_SoundId); -void Audition_SoundPlaying(U64 i_SoundId); -void Audition_SoundFlags(U64 i_SoundId, S32 i_Flags); -void Audition_SoundLimited(U64 i_SoundId, char const* i_Label); -void Audition_SoundEvicted(U64 i_SoundId, U64 i_ForSound, S32 i_Reason); -void Audition_Control(U64 i_EventId, char const* i_Labels, U8 i_ControlType, U64 i_Filter); -void Audition_SoundBus(U64 i_SoundId, U8 i_BusIndex); - -void Audition_Error(U64 i_Id, char const* i_Details); - -void Audition_AsyncQueued(U64 i_RelevantId, S32 i_AsyncId, char const* i_Asset); -void Audition_AsyncLoad(S32 i_AsyncId, S32 i_ExpectedData); -void Audition_AsyncError(S32 i_AsyncId); -void Audition_AsyncComplete(S32 i_AsyncId, S32 i_DataLoaded); -void Audition_AsyncCancel(S32 i_AsyncId); -void Audition_ListenerPosition(float x, float y, float z); -void Audition_SoundPosition(U64 i_Sound, float x, float y, float z); -void Audition_SendCPU(HDIGDRIVER i_Driver); -void Audition_UpdateDataCount(S32 i_CurrentDataLoaded); -void Audition_SendCount(S32 i_SoundCount); -void Audition_HandleSystemLoad(S32 i_Avail, S32 i_Total); -void Audition_VarState(char const* i_Var, U64 i_SoundId, S32 i_Int, void* i_4ByteValue); -void Audition_RampState(char const* i_Ramp, U64 i_SoundId, S32 i_Type, float i_Current); -void Audition_SoundState(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); -void Audition_ClearState(); -void Audition_CompletionEvent(U64 i_CompletionEventId, U64 i_ParentSoundId); -void Audition_AddRamp(U64 i_ParentSoundId, S32 i_Type, char const* i_Name, char const* i_LabelQuery, U64 i_EventId); - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(pop) -#endif -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/Minecraft.Client/Windows64/Miles/include/mss.h b/Minecraft.Client/Windows64/Miles/include/mss.h deleted file mode 100644 index 762bae62..00000000 --- a/Minecraft.Client/Windows64/Miles/include/mss.h +++ /dev/null @@ -1,8429 +0,0 @@ -//############################################################################ -//## ## -//## Miles Sound System ## -//## ## -//############################################################################ -//## ## -//## Contact RAD Game Tools at 425-893-4300 for technical support. ## -//## ## -//############################################################################ - -#ifndef MSS_VERSION - -// also update versions below for the docs - -// for cdep and installs -#define MILESVERSION "9.3m" -// see below in docs section -#define MILESMAJORVERSION 9 -#define MILESMINORVERSION 3 -#define MILESSUBVERSION 11 -#define MILESBUILDVERSION 0 -#define MILESVERSIONDATE "20-Jun-14" -#define MILESCOPYRIGHT "Copyright (C) 1991-2014, RAD Game Tools, Inc." - -// source files use these defines -#define MSS_VERSION MILESVERSION -#define MSS_MAJOR_VERSION MILESMAJORVERSION -#define MSS_MINOR_VERSION MILESMINORVERSION -#define MSS_SUB_VERSION MILESSUBVERSION -#define MSS_BUILD_VERSION MILESBUILDVERSION - -#define MSS_VERSION_DATE MILESVERSIONDATE -#define MSS_COPYRIGHT MILESCOPYRIGHT - -#endif - -#if !defined(MSS_H) && !defined(__RADRES__) -#define MSS_H - -// doc system stuff -#ifndef EXPAPI -#define EXPAPI -#endif -#ifndef EXPTYPE -#define EXPTYPE -#endif -#ifndef EXPMACRO -#define EXPMACRO -#endif -#ifndef EXPCONST -#define EXPCONST -#endif -#ifndef EXPOUT -#define EXPOUT -#endif -#ifndef EXPTYPEBEGIN -#define EXPTYPEBEGIN -#endif -#ifndef EXPTYPEEND -#define EXPTYPEEND -#endif -#ifndef EXPGROUP -#define EXPGROUP(GroupName) -#endif -#ifndef DEFGROUP -#define DEFGROUP(GroupName, Info) -#endif - -// For docs -EXPGROUP(_NullGroup) -#define MilesVersion "9.3m" EXPMACRO -#define MilesMajorVersion 9 EXPMACRO -#define MilesMinorVersion 3 EXPMACRO -#define MilesBuildNumber 11 EXPMACRO -#define MilesCustomization 0 EXPMACRO -EXPGROUP(_RootGroup) - - -// IS_WINDOWS for Windows or Win32 -// IS_WIN64 for Win64 -// IS_WIN32 for Win32 -// IS_WIN32API for Windows, Xbox and Xenon -// IS_64REGS when CPU registers are 64-bit - Xenon, PS3, Win64 and PS2 -// IS_32 for at least 32-bit pointers -// IS_LE for little endian (PCs) -// IS_BE for big endian (Macs, x360, ps3) -// IS_X86 for Intel -// IS_MAC for Mac -// IS_MACHO for Macho Mac -// IS_PPC for PPC Mac -// IS_68K for 68K Mac -// IS_LINUX for Linux -// IS_XBOX for Xbox -// IS_XENON for Xbox 360 -// IS_PS2 for PS/2 -// IS_PS3 for PS/3 -// IS_SPU for PS3 SPU -// IS_WII for Wii - -#include "rrCore.h" - -//#define MILES_CHECK_OFFSETS -#ifdef MILES_CHECK_OFFSETS - #include -#endif - -#ifdef __RADNT__ -#define IS_WIN32 -#if defined(__RAD64__) -#define IS_WIN64 -#endif -#endif - -#if defined(__RADWIN__) && !defined(__RADXENON__) && !defined(__RADXBOX__) && !defined(__RADWINRTAPI__) -#define IS_WINDOWS -#endif - -#if defined(__RADWIN__) -#define IS_WIN32API -#endif - -#if defined(__RAD64__) && defined(__RADWIN__) -#define IS_WIN64 -#endif - -// 16-bit not supported anymore -#define IS_32 - -#ifdef __RADLITTLEENDIAN__ -#define IS_LE -#endif - -#ifdef __RADBIGENDIAN__ -#define IS_BE -#endif - -#ifdef __RADX86__ -#define IS_X86 -#endif - -#ifdef __RADMAC__ -#define IS_MAC -#endif - -#ifdef __RADPPC__ -#define IS_PPC -#endif - -#ifdef __RAD68K__ -#define IS_68K -#endif - -#ifdef __RADLINUX__ -#define IS_LINUX -#endif - -// -// MSS_STATIC_RIB is used to determine whether anything loaded -// through the RIB interface is loaded via RIB_load_application_providers -// or via a static declaration from the user (Register_RIB) -// mirror this in rib.h -// -#if defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPSP2__) || \ - defined(__RADWII__) || defined(__RADWIIU__) || defined(__RAD3DS__) || defined(__RADIPHONE__) || \ - defined(__RADXENON__) || defined(__RADPS4__) || defined(__RADPS3__) || defined(__RADSPU__) || \ - defined(__RADDURANGO__) || defined(__RADWINRTAPI__) - #define MSS_STATIC_RIB - // WinRT is weird in that we statically pull in the RIBs, but we dynamically link Midi - #ifndef __RADWINRTAPI__ - #define MSS_STATIC_MIDI - #endif -#elif defined(__RADWIN__) || defined(__RADLINUX__) || defined(__RADMAC__) - // not static. -#else - #error "MSS needs to know whether it is being distributed as a static lib!" -#endif - -// Retain the old IS_STATIC define for example code -#ifdef MSS_STATIC_RIB - #define IS_STATIC -#endif - -#ifdef __RADXBOX__ -#define IS_XBOX -#endif - -#ifdef __RADXENON__ -#define IS_XENON -#endif - -#ifdef __RADWII__ -#define IS_WII -#endif - -#ifdef __RADWIIU__ -#define IS_WIIU -#endif - -#ifdef __RADPS2__ -#define IS_PS2 -#endif - -#ifdef __RADPS3__ -#define IS_PS3 -#ifndef HOST_SPU_PROCESS - #define HOST_SPU_PROCESS -#endif -#endif - -#ifdef __RADSPU__ -#define IS_PS3 -#define IS_SPU -#endif - -#ifdef __RADPSP__ -#define IS_PSP -#endif - -#ifdef __RADPSP2__ -#define IS_PSP2 -#endif - -#ifdef __RADDOS__ -#define IS_DOS -#endif - -#ifdef __RAD64REGS__ -#define IS_64REGS -#endif - -#ifdef __RADMACH__ -#define IS_MACHO -#endif - -#ifdef __RADIPHONE__ -#define IS_IPHONE -#endif - -#ifdef __RADIPHONESIM__ -#define IS_IPHONESIM -#endif - -#ifdef __RAD3DS__ -#define IS_3DS -#endif - -#define MSSRESTRICT RADRESTRICT - -#define MSS_STRUCT RADSTRUCT - -#define C8 char -typedef void VOIDFUNC(void); - - -#if (!defined(IS_LE) && !defined(IS_BE)) - #error MSS.H did not detect your platform. Define _WINDOWS, WIN32, WIN64, or macintosh. -#endif - -// -// Pipeline filters supported on following platforms -// - -#define MSS_FLT_SUPPORTED 1 -#define EXTRA_BUILD_BUFFERS 1 -#define FLT_A (MAX_SPEAKERS) - -#if defined(IS_WIN32API) - #define MSS_VFLT_SUPPORTED 1 -#endif - -#define MSS_REVERB_SUPPORTED 1 - -//================ - -EXPGROUP(Basic Types) -#define AILCALL EXPTAG(AILCALL) -/* - Internal calling convention that all external Miles functions use. - - Usually cdecl or stdcall on Windows. -*/ - -#define AILCALLBACK EXPTAG(AILCALLBACK docproto) -/* - Calling convention that user supplied callbacks from Miles use. - - Usually cdecl or stdcall on Windows. -*/ - -EXPGROUP(_RootGroup) -#undef AILCALL -#undef AILCALLBACK -//================ - -RADDEFSTART - -#define MSSFOURCC U32 -#ifdef IS_LE - #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((U32)(U8)(ch0) | ((U32)(U8)(ch1) << 8) | \ - ((U32)(U8)(ch2) << 16) | ((U32)(U8)(ch3) << 24 )) -#else - - #define MSSMAKEFOURCC(ch0, ch1, ch2, ch3) \ - (((U32)(U8)(ch0) << 24) | ((U32)(U8)(ch1) << 16) | \ - ((U32)(U8)(ch2) << 8) | ((U32)(U8)(ch3) )) -#endif - -#define MSSmmioFOURCC(w,x,y,z) MSSMAKEFOURCC(w,x,y,z) - -#if defined(__RADWINRTAPI__) - - #define AILLIBCALLBACK RADLINK - #define AILCALL RADLINK - #define AILEXPORT RADEXPLINK - #define AILCALLBACK RADLINK - #define DXDEF RADEXPFUNC - #define DXDEC RADEXPFUNC - -#elif defined(IS_WINDOWS) - - typedef char CHAR; - typedef short SHORT; - typedef int BOOL; - typedef long LONG; - typedef CHAR *LPSTR, *PSTR; - - #ifdef IS_WIN64 - typedef unsigned __int64 ULONG_PTR, *PULONG_PTR; - #else - #ifdef _Wp64 - #if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 - typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR; - #else - typedef unsigned long ULONG_PTR, *PULONG_PTR; - #endif - #else - typedef unsigned long ULONG_PTR, *PULONG_PTR; - #endif - #endif - - typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR; - typedef unsigned long DWORD; - typedef unsigned short WORD; - typedef unsigned int UINT; - typedef struct HWAVE__ *HWAVE; - typedef struct HWAVEIN__ *HWAVEIN; - typedef struct HWAVEOUT__ *HWAVEOUT; - typedef HWAVEIN *LPHWAVEIN; - typedef HWAVEOUT *LPHWAVEOUT; - - #ifndef WAVE_MAPPER - #define WAVE_MAPPER ((UINT)-1) - #endif - - typedef struct waveformat_tag *LPWAVEFORMAT; - - typedef struct HMIDIOUT__ *HMIDIOUT; - typedef HMIDIOUT *LPHMIDIOUT; - typedef struct HWND__ *HWND; - typedef struct HINSTANCE__ *HINSTANCE; - typedef HINSTANCE HMODULE; - typedef struct wavehdr_tag *LPWAVEHDR; - - #define MSS_MAIN_DEF __cdecl - - // - // If compiling MSS DLL, use __declspec(dllexport) for both - // declarations and definitions - // - - #ifdef IS_WIN32 - - #if !defined(FORNONWIN) && !defined(__RADNTBUILDLINUX__) - #define AILLIBCALLBACK __stdcall - #define AILCALL __stdcall - #define AILCALLBACK __stdcall - #define AILEXPORT __stdcall - #else - #define AILLIBCALLBACK __cdecl - #define AILCALL __cdecl - #define AILCALLBACK __cdecl - #define AILEXPORT __cdecl - #endif - - #ifdef __RADINDLL__ - #define DXDEC __declspec(dllexport) - #define DXDEF __declspec(dllexport) - #else - - #if defined( __BORLANDC__ ) || defined( MSS_SPU_PROCESS ) - #define DXDEC extern - #else - #define DXDEC __declspec(dllimport) - #endif - - #endif - - #ifdef IS_WIN64 - #define MSSDLLNAME "MSS64.DLL" - #define MSS_REDIST_DIR_NAME "redist64" - #else - #define MSSDLLNAME "MSS32.DLL" - #define MSS_REDIST_DIR_NAME "redist" - #endif - - #define MSS_DIR_SEP "\\" - #define MSS_DIR_UP ".." MSS_DIR_SEP - #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - - #endif - - typedef void * LPVOID; - typedef LPVOID AILLPDIRECTSOUND; - typedef LPVOID AILLPDIRECTSOUNDBUFFER; - -#elif defined( IS_MAC ) || defined(IS_IPHONE) || defined(IS_LINUX) - - #if defined(__RADARM__) || defined(__RADX64__) - #define AILLIBCALLBACK - #define AILCALL - #define AILEXPORT - #define AILCALLBACK - #elif defined(__RADX86__) - #define AILLIBCALLBACK __attribute__((cdecl)) - #define AILCALL __attribute__((cdecl)) - #define AILCALLBACK __attribute__((cdecl)) - #define AILEXPORT __attribute__((cdecl)) - #else - #error "No fn call decorators specified" - #endif - - #ifdef __RADINDLL__ - #define DXDEC __attribute__((visibility("default"))) - #define DXDEF __attribute__((visibility("default"))) - #else - #define DXDEC extern - #define DXDEF - #endif - - #ifdef __RADX64__ - #define MSS_REDIST_DIR_NAME "redist/x64" - #elif defined(IS_X86) - #define MSS_REDIST_DIR_NAME "redist/x86" - #elif defined(__RADARM__) - #define MSS_REDIST_DIR_NAME "" - #else - #error "No Redist Dir Specified" - #endif - - #define MSS_DIR_SEP "/" - #define MSS_DIR_UP ".." MSS_DIR_SEP - #define MSS_DIR_UP_TWO MSS_DIR_UP MSS_DIR_UP - - #define MSS_MAIN_DEF - -#elif defined(IS_XENON) - - #define AILLIBCALLBACK __stdcall - #define AILCALL __stdcall - #define AILEXPORT __stdcall - #define AILCALLBACK __stdcall - - #define DXDEC extern - #define DXDEF - - typedef void * AILLPDIRECTSOUND; - typedef void * AILLPDIRECTSOUNDBUFFER; - -#else - - #define AILLIBCALLBACK - #define AILCALL - #define AILEXPORT - #define AILCALLBACK - - #define DXDEC extern - #define DXDEF - -#endif - - -// -// Misc. constant definitions -// - -#define MAX_DRVRS 16 // Max. # of simultaneous drivers -#define MAX_TIMERS 16 // Max. # of simultaneous timers -#define MAX_NOTES 32 // Max # of notes "on" -#define FOR_NEST 4 // # of nested XMIDI FOR loops -#define NUM_CHANS 16 // # of possible MIDI channels -#define MAX_W_VOICES 16 // Max virtual wave synth voice cnt -#define MAX_W_ENTRIES 512 // 512 wave library entries max. -#ifdef IS_WIN32 -#define MAX_SPEAKERS 9 // Up to 9 hardware output channels supported on Win32 -#elif defined(IS_PS3) || defined(IS_WII) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) -#define MAX_SPEAKERS 8 // Up to 8 hardware output channels on PS3, PS2, Wii, WiiU -#elif defined(IS_PSP) || defined(IS_IPHONE) || defined(IS_3DS) || defined(IS_PSP2) || defined(__RADANDROID__) -#define MAX_SPEAKERS 2 // Up to 2 hardware output channels on PSP -#else -#define MAX_SPEAKERS 6 // Up to 6 hardware output channels supported on other platforms -#endif -#define MAX_RECEIVER_SPECS 32 // Up to 32 receiver point specifications - -#define MAX_BUSSES 4 // # of busses that can be active. -#define MILES_MAX_STATES 4 // # of state pushes allowed. - - -#define MIN_CHAN ( 1-1) // Min channel recognized (0-based) -#define MAX_CHAN (16-1) // Max channel recognized -#define MIN_LOCK_CHAN ( 1-1) // Min channel available for locking -#define MAX_LOCK_CHAN (16-1) // Max channel available for locking -#define PERCUSS_CHAN (10-1) // Percussion channel (no locking) - -#define AIL_MAX_FILE_HEADER_SIZE 8192 // AIL_set_named_sample_file() requires at least 8K - // of data or the entire file image, whichever is less, - // to determine sample format -#define DIG_F_16BITS_MASK 1 -#define DIG_F_STEREO_MASK 2 -#define DIG_F_ADPCM_MASK 4 -#define DIG_F_XBOX_ADPCM_MASK 8 -#define DIG_F_MULTICHANNEL_MASK 16 -#define DIG_F_OUTPUT_FILTER_IN_USE 32 - -#define DIG_F_MONO_8 0 // PCM data formats -#define DIG_F_MONO_16 (DIG_F_16BITS_MASK) -#define DIG_F_STEREO_8 (DIG_F_STEREO_MASK) -#define DIG_F_MULTICHANNEL_8 (DIG_F_MULTICHANNEL_MASK) // (not actually supported) -#define DIG_F_STEREO_16 (DIG_F_STEREO_MASK|DIG_F_16BITS_MASK) -#define DIG_F_MULTICHANNEL_16 (DIG_F_MULTICHANNEL_MASK|DIG_F_16BITS_MASK) -#define DIG_F_ADPCM_MONO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK) -#define DIG_F_ADPCM_STEREO_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) -#define DIG_F_ADPCM_MULTICHANNEL_16 (DIG_F_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) -#define DIG_F_XBOX_ADPCM_MONO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK) -#define DIG_F_XBOX_ADPCM_STEREO_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_STEREO_MASK) -#define DIG_F_XBOX_ADPCM_MULTICHANNEL_16 (DIG_F_XBOX_ADPCM_MASK |DIG_F_16BITS_MASK|DIG_F_MULTICHANNEL_MASK) - -#define DIG_F_NOT_8_BITS (DIG_F_16BITS_MASK | DIG_F_ADPCM_MASK | DIG_F_XBOX_ADPCM_MASK | DIG_F_MULTICHANNEL_MASK) - -#define DIG_F_USING_ASI 16 - -#define DIG_PCM_POLARITY 0x0004 // PCM flags used by driver hardware -#define DIG_PCM_SPLIT 0x0008 -#define DIG_BUFFER_SERVICE 0x0010 -#define DIG_DUAL_DMA 0x0020 -#define DIG_RECORDING_SUPPORTED 0x8000 - -#ifndef WAVE_FORMAT_PCM - #define WAVE_FORMAT_PCM 1 -#endif -#ifndef WAVE_FORMAT_IMA_ADPCM - #define WAVE_FORMAT_IMA_ADPCM 0x0011 -#endif -#ifndef WAVE_FORMAT_XBOX_ADPCM - #define WAVE_FORMAT_XBOX_ADPCM 0x0069 -#endif -#ifndef WAVE_FORMAT_EXTENSIBLE - #define WAVE_FORMAT_EXTENSIBLE 0xFFFE -#endif - -typedef enum -{ - MSS_SPEAKER_MONO = 0, - MSS_SPEAKER_FRONT_LEFT = 0, // Speaker order indexes correspond to - MSS_SPEAKER_FRONT_RIGHT = 1, // bitmasks in PSDK's ksmedia.h - MSS_SPEAKER_FRONT_CENTER = 2, // Also see microsoft.com/whdc/device/audio/multichaud.mspx - MSS_SPEAKER_LOW_FREQUENCY = 3, - MSS_SPEAKER_BACK_LEFT = 4, - MSS_SPEAKER_BACK_RIGHT = 5, - MSS_SPEAKER_FRONT_LEFT_OF_CENTER = 6, - MSS_SPEAKER_FRONT_RIGHT_OF_CENTER = 7, - MSS_SPEAKER_BACK_CENTER = 8, - MSS_SPEAKER_SIDE_LEFT = 9, - MSS_SPEAKER_SIDE_RIGHT = 10, - MSS_SPEAKER_TOP_CENTER = 11, - MSS_SPEAKER_TOP_FRONT_LEFT = 12, - MSS_SPEAKER_TOP_FRONT_CENTER = 13, - MSS_SPEAKER_TOP_FRONT_RIGHT = 14, - MSS_SPEAKER_TOP_BACK_LEFT = 15, - MSS_SPEAKER_TOP_BACK_CENTER = 16, - MSS_SPEAKER_TOP_BACK_RIGHT = 17, - MSS_SPEAKER_MAX_INDEX = 17, - MSS_SPEAKER_FORCE_32 = 0x7fffffff -} MSS_SPEAKER; - -// -// Pass to AIL_midiOutOpen for NULL MIDI driver -// - -#define MIDI_NULL_DRIVER ((U32)(S32)-2) - - -// -// Non-specific XMIDI/MIDI controllers and event types -// - -#define SYSEX_BYTE 105 -#define PB_RANGE 106 -#define CHAN_MUTE 107 -#define CALLBACK_PFX 108 -#define SEQ_BRANCH 109 -#define CHAN_LOCK 110 -#define CHAN_PROTECT 111 -#define VOICE_PROTECT 112 -#define TIMBRE_PROTECT 113 -#define PATCH_BANK_SEL 114 -#define INDIRECT_C_PFX 115 -#define FOR_LOOP 116 -#define NEXT_LOOP 117 -#define CLEAR_BEAT_BAR 118 -#define CALLBACK_TRIG 119 -#define SEQ_INDEX 120 - -#define GM_BANK_MSB 0 -#define MODULATION 1 -#define DATA_MSB 6 -#define PART_VOLUME 7 -#define PANPOT 10 -#define EXPRESSION 11 -#define GM_BANK_LSB 32 -#define DATA_LSB 38 -#define SUSTAIN 64 -#define REVERB 91 -#define CHORUS 93 -#define RPN_LSB 100 -#define RPN_MSB 101 -#define RESET_ALL_CTRLS 121 -#define ALL_NOTES_OFF 123 - -#define EV_NOTE_OFF 0x80 -#define EV_NOTE_ON 0x90 -#define EV_POLY_PRESS 0xa0 -#define EV_CONTROL 0xb0 -#define EV_PROGRAM 0xc0 -#define EV_CHAN_PRESS 0xd0 -#define EV_PITCH 0xe0 -#define EV_SYSEX 0xf0 -#define EV_ESC 0xf7 -#define EV_META 0xff - -#define META_EOT 0x2f -#define META_TEMPO 0x51 -#define META_TIME_SIG 0x58 - -// -// SAMPLE.system_data[] usage -// - -#define VOC_BLK_PTR 1 // Pointer to current block -#define VOC_REP_BLK 2 // Pointer to beginning of repeat loop block -#define VOC_N_REPS 3 // # of iterations left in repeat loop -#define VOC_MARKER 4 // Marker to search for, or -1 if all -#define VOC_MARKER_FOUND 5 // Desired marker found if 1, else 0 -#define STR_HSTREAM 6 // Stream, if any, that owns the HSAMPLE -#define SSD_TEMP 7 // Temporary storage location for general use -#define EVT_HANDLE_MAGIC 1 // EventSystem handle.magic -#define EVT_HANDLE_INDEX 2 // EventSystem handle.index - -// -// Timer status values -// - -#define AILT_FREE 0 // Timer handle is free for allocation -#define AILT_STOPPED 1 // Timer is stopped -#define AILT_RUNNING 2 // Timer is running - -// -// SAMPLE.status flag values -// - -#define SMP_FREE 0x0001 // Sample is available for allocation - -#define SMP_DONE 0x0002 // Sample has finished playing, or has - // never been started - -#define SMP_PLAYING 0x0004 // Sample is playing - -#define SMP_STOPPED 0x0008 // Sample has been stopped - -#define SMP_PLAYINGBUTRELEASED 0x0010 // Sample is playing, but digital handle - // has been temporarily released - - - -// -// SEQUENCE.status flag values -// - -#define SEQ_FREE 0x0001 // Sequence is available for allocation - -#define SEQ_DONE 0x0002 // Sequence has finished playing, or has - // never been started - -#define SEQ_PLAYING 0x0004 // Sequence is playing - -#define SEQ_STOPPED 0x0008 // Sequence has been stopped - -#define SEQ_PLAYINGBUTRELEASED 0x0010 // Sequence is playing, but MIDI handle - // has been temporarily released - -#ifdef IS_WINDOWS - -// -// AIL_set_direct_buffer_control() command values -// - -#define AILDS_RELINQUISH 0 // App returns control of secondary buffer -#define AILDS_SEIZE 1 // App takes control of secondary buffer -#define AILDS_SEIZE_LOOP 2 // App wishes to loop the secondary buffer - -#endif - -#ifndef MSS_BASIC - -#ifndef FILE_ERRS - #define FILE_ERRS - - #define AIL_NO_ERROR 0 - #define AIL_IO_ERROR 1 - #define AIL_OUT_OF_MEMORY 2 - #define AIL_FILE_NOT_FOUND 3 - #define AIL_CANT_WRITE_FILE 4 - #define AIL_CANT_READ_FILE 5 - #define AIL_DISK_FULL 6 - #define AIL_NO_AVAIL_ASYNC 7 -#endif - -#define MIN_VAL 0 -#define NOM_VAL 1 -#define MAX_VAL 2 - - -EXPGROUP(Basic Types) -EXPTYPEBEGIN typedef SINTa HMSSENUM; -#define MSS_FIRST ((HMSSENUM)-1) -EXPTYPEEND -/* - specifies a type used to enumerate through a list of properties. - - $:MSS_FIRST use this value to start the enumeration process. - -The Miles enumeration functions all work similarly - you set a local variable of type HMSSENUM to MSS_FIRST and then call -the enumeration function until it returns 0. - -*/ - - - - -// -// Preference names and default values -// - -#define AIL_MM_PERIOD 0 -#define DEFAULT_AMP 1 // Default MM timer period = 5 msec. - -#define AIL_TIMERS 1 -#define DEFAULT_AT 16 // 16 allocatable HTIMER handles - -#define AIL_ENABLE_MMX_SUPPORT 2 // Enable MMX support if present -#define DEFAULT_AEMS YES // (may be changed at any time) - - -#define DIG_MIXER_CHANNELS 3 -#define DEFAULT_DMC 64 // 64 allocatable SAMPLE structures - -#define DIG_ENABLE_RESAMPLE_FILTER 4 // Enable resampling filter by -#define DEFAULT_DERF YES // default - -#define DIG_RESAMPLING_TOLERANCE 5 -#define DEFAULT_DRT 131 // Resampling triggered at +/- 0.2% - -// 1 ms per mix. The PS3 has frag count restrictions, so we use 5 ms. -#define DIG_DS_FRAGMENT_SIZE 6 -#ifdef __RADPS3__ -# define DEFAULT_DDFS 5 -#else -# define DEFAULT_DDFS 1 -#endif - -// We want ~256 ms of buffers. PS3 must be 8, 16, or 32. -#define DIG_DS_FRAGMENT_CNT 7 -#ifdef __RADPS3__ -# define DEFAULT_DDFC 32 -#else -# define DEFAULT_DDFC 256 -#endif - -// Mix ahead ~48 ms. PS3 is based off on 5 ms frag size above... -#define DIG_DS_MIX_FRAGMENT_CNT 8 -#ifdef __RADPS3__ -# define DEFAULT_DDMFC 8 -#else -# define DEFAULT_DDMFC 48 -#endif - -#define DIG_LEVEL_RAMP_SAMPLES 9 -#define DEFAULT_DLRS 32 // Ramp level changes over first 32 samples in each buffer to reduce zipper noise - - -#define DIG_MAX_PREDELAY_MS 10 -#define DEFAULT_MPDMS 500 // Max predelay reverb time in ms - -#define DIG_3D_MUTE_AT_MAX 11 -#define DEFAULT_D3MAM YES // on by default - -#define DIG_DS_USE_PRIMARY 12 -#define DEFAULT_DDUP NO // Mix into secondary DirectSound buffer by default - - -#define DIG_DS_DSBCAPS_CTRL3D 13 -#define DEFAULT_DDDC NO // Do not use DSBCAPS_CTRL3D by default - -#define DIG_DS_CREATION_HANDLER 14 -#define DEFAULT_DDCH 0 // Use DirectSoundCreate() by default - - -#define DIG_MAX_CHAIN_ELEMENT_SIZE 15 -#define DEFAULT_MCES 8192 // max of 8192 bytes/waveOut buffer - -#define DIG_MIN_CHAIN_ELEMENT_TIME 16 -#define DEFAULT_MCET 100 // 100 milliseconds buffers - - -#define DIG_USE_WAVEOUT 17 -#define DEFAULT_DUW NO // Use DirectSound by default - -#define DIG_OUTPUT_BUFFER_SIZE 18 -#define DEFAULT_DOBS 49152 // Windows: waveout 48K output buffer size - - -#define DIG_PREFERRED_WO_DEVICE 19 -#define DEFAULT_DPWOD ((UINTa)-1) // Preferred WaveOut device == WAVE_MAPPER - -#define DIG_PREFERRED_DS_DEVICE 20 -#define DEFAULT_DPDSD 0 // Preferred DirectSound device == default NULL GUID - - -#define MDI_SEQUENCES 21 -#define DEFAULT_MS 8 // 8 sequence handles/driver - -#define MDI_SERVICE_RATE 22 -#define DEFAULT_MSR 120 // XMIDI sequencer timing = 120 Hz - -#define MDI_DEFAULT_VOLUME 23 -#define DEFAULT_MDV 127 // Default sequence volume = 127 (0-127) - -#define MDI_QUANT_ADVANCE 24 -#define DEFAULT_MQA 1 // Beat/bar count +1 interval - -#define MDI_ALLOW_LOOP_BRANCHING 25 -#define DEFAULT_ALB NO // Branches cancel XMIDI FOR loops - -#define MDI_DEFAULT_BEND_RANGE 26 -#define DEFAULT_MDBR 2 // Default pitch-bend range = 2 - -#define MDI_DOUBLE_NOTE_OFF 27 -#define DEFAULT_MDNO NO // For stuck notes on SB daughterboards - -#define MDI_SYSEX_BUFFER_SIZE 28 -#define DEFAULT_MSBS 1536 // Default sysex buffer = 1536 bytes - - -#define DLS_VOICE_LIMIT 29 -#define DEFAULT_DVL 64 // 64 voices supported - -#define DLS_TIMEBASE 30 -#define DEFAULT_DTB 120 // 120 intervals/second by default - -#define DLS_BANK_SELECT_ALIAS 31 -#define DEFAULT_DBSA NO // Do not treat controller 114 as bank - -#define DLS_STREAM_BOOTSTRAP 32 // Don't submit first stream buffer -#define DEFAULT_DSB YES // until at least 2 available - -#define DLS_VOLUME_BOOST 33 -#define DEFAULT_DVB 0 // Boost final volume by 0 dB - -#define DLS_ENABLE_FILTERING 34 // Filtering = on by default -#define DEFAULT_DEF YES // (may be changed at any time) - - -#define DLS_GM_PASSTHROUGH 35 // Pass unrecognized traffic on to -#define DEFAULT_DGP YES // default GM driver layer - // (may be changed at any time) - -#define DLS_ADPCM_TO_ASI_THRESHOLD 36 // Size in samples to switch to ASI -#define DEFAULT_DATAT 32768 - -#ifdef __RAD3DS__ -# define AIL_3DS_USE_SYSTEM_CORE 32 // Defaults to 0 -#endif - -#define N_PREFS 40 // # of preference types - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(push, 1) -#endif - -typedef struct Mwavehdr_tag { - C8 * lpData; - U32 dwBufferLength; - U32 dwBytesRecorded; - UINTa dwUser; - U32 dwFlags; - U32 dwLoops; - struct Mwavehdr_tag *lpNext; - UINTa reserved; -} MWAVEHDR; -typedef MSS_STRUCT Mwaveformat_tag { - U16 wFormatTag; - U16 nChannels; - U32 nSamplesPerSec; - U32 nAvgBytesPerSec; - U16 nBlockAlign; -} MWAVEFORMAT; -typedef MSS_STRUCT Mpcmwaveformat_tag { - MWAVEFORMAT wf; - U16 wBitsPerSample; -} MPCMWAVEFORMAT; -typedef MSS_STRUCT Mwaveformatex_tag { - U16 wFormatTag; - U16 nChannels; - U32 nSamplesPerSec; - U32 nAvgBytesPerSec; - U16 nBlockAlign; - U16 wBitsPerSample; - U16 cbSize; -} MWAVEFORMATEX; -typedef MSS_STRUCT Mwaveformatextensible_tag { - MWAVEFORMATEX Format; - union { - U16 wValidBitsPerSample; - U16 wSamplesPerBlock; - U16 wReserved; - } Samples; - U32 dwChannelMask; - U8 SubFormat[16]; -} MWAVEFORMATEXTENSIBLE; - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(pop) -#endif - -// This will fail if structure packing isn't correct for the compiler we are running. -RR_COMPILER_ASSERT(sizeof(MWAVEFORMATEXTENSIBLE) == 40); - - -typedef struct _AILSOUNDINFO { - S32 format; - void const* data_ptr; - U32 data_len; - U32 rate; - S32 bits; - S32 channels; - U32 channel_mask; - U32 samples; - U32 block_size; - void const* initial_ptr; -} AILSOUNDINFO; - -// asis use these callbacks -typedef void * (AILCALL MSS_ALLOC_TYPE)( UINTa size, UINTa user, char const * filename, U32 line ); -typedef void (AILCALL MSS_FREE_TYPE)( void * ptr, UINTa user, char const * filename, U32 line ); - -// helper functions that just turn around and call AIL_mem_alloc_lock -DXDEC void * AILCALL MSS_alloc_info( UINTa size, UINTa user, char const * filename, U32 line ); -DXDEC void AILCALL MSS_free_info( void * ptr, UINTa user, char const * filename, U32 line ); - -#if defined(STANDALONEMIXRIB) && !defined(FORNONWIN) -#define MSS_CALLBACK_ALIGNED_NAME( name ) name##_fixup -#define MSS_DEC_CB_STACK_ALIGN( name ) DXDEC void AILCALL MSS_CALLBACK_ALIGNED_NAME(name)(void); -#else -#define MSS_CALLBACK_ALIGNED_NAME( name ) name -#define MSS_DEC_CB_STACK_ALIGN( name ) -#endif - -MSS_DEC_CB_STACK_ALIGN( MSS_alloc_info ) -MSS_DEC_CB_STACK_ALIGN( MSS_free_info) - - -#ifndef RIB_H // RIB.H contents included if RIB.H not already included - -#define RIB_H -#define ARY_CNT(x) (sizeof((x)) / sizeof((x)[0])) - -// ---------------------------------- -// RIB data types -// ---------------------------------- - -typedef S32 RIBRESULT; - -#define RIB_NOERR 0 // Success -- no error -#define RIB_NOT_ALL_AVAILABLE 1 // Some requested functions/attribs not available -#define RIB_NOT_FOUND 2 // Resource not found -#define RIB_OUT_OF_MEM 3 // Out of system RAM - -// -// Handle to interface provider -// - -typedef UINTa HPROVIDER; - -// -// Handle representing token used to obtain property data -// -// This needs to be large enough to store a function pointer -// - -typedef UINTa HPROPERTY; - -// -// Data types for RIB properties -// - -typedef enum -{ - RIB_NONE = 0, // No type - RIB_CUSTOM, // Used for pointers to application-specific structures - RIB_DEC, // Used for 32-bit integer values to be reported in decimal - RIB_HEX, // Used for 32-bit integer values to be reported in hex - RIB_FLOAT, // Used for 32-bit single-precision FP values - RIB_PERCENT, // Used for 32-bit single-precision FP values to be reported as percentages - RIB_BOOL, // Used for Boolean-constrained integer values to be reported as TRUE or FALSE - RIB_STRING, // Used for pointers to null-terminated ASCII strings - RIB_READONLY = 0x80000000 // Property is read-only -} -RIB_DATA_SUBTYPE; - -// -// RIB_ENTRY_TYPE structure, used to register an interface or request one -// - -typedef enum -{ - RIB_FUNCTION = 0, - RIB_PROPERTY, // Property: read-only or read-write data type - RIB_ENTRY_FORCE_32 = 0x7fffffff -} -RIB_ENTRY_TYPE; - -// -// RIB_INTERFACE_ENTRY, used to represent a function or data entry in an -// interface -// - -typedef struct -{ - RIB_ENTRY_TYPE type; // See list above - const C8 *entry_name; // Name of desired function or property - UINTa token; // Function pointer or property token - RIB_DATA_SUBTYPE subtype; // Property subtype -} -RIB_INTERFACE_ENTRY; - -// -// Standard RAD Interface Broker provider identification properties -// - -#define PROVIDER_NAME ((U32) (S32) (-100)) // RIB_STRING name of decoder -#define PROVIDER_VERSION ((U32) (S32) (-101)) // RIB_HEX BCD version number - -// -// Standard function to obtain provider properties (see PROVIDER_ defines -// above) -// -// Each provider of a searchable interface must export this function -// - -typedef S32 (AILCALL *PROVIDER_PROPERTY) (HPROPERTY index, - void * before_value, - void const * new_value, - void * after_value - ); - -// -// Macros to simplify interface registrations/requests for functions, -// and properties -// - -#define FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE } -#define REG_FN(entry_name) { RIB_FUNCTION, #entry_name, (UINTa) &(entry_name), RIB_NONE } - -#define PR(entry_name,ID) { RIB_PROPERTY, (entry_name), (UINTa) &(ID), RIB_NONE } -#define REG_PR(entry_name,ID,subtype) { RIB_PROPERTY, (entry_name), (UINTa) (ID), subtype } - -#define RIB_register(x,y,z) RIB_register_interface ((HPROVIDER)(x), y, ARY_CNT(z), z) -#define RIB_unregister(x,y,z) RIB_unregister_interface((HPROVIDER)(ssx), y, ARY_CNT(z), z) -#define RIB_unregister_all(x) RIB_unregister_interface((HPROVIDER)(x), 0, 0, 0) -#define RIB_free_libraries() RIB_free_provider_library((HPROVIDER)(0)); -#define RIB_request(x,y,z) RIB_request_interface (x, y, ARY_CNT(z), z) - -// passed to RIB DLLs in Miles 9 and up (so RIBS don't have to link to MSS32.dll) -typedef HPROVIDER AILCALL RIB_ALLOC_PROVIDER_HANDLE_TYPE(long module); - -typedef RIBRESULT AILCALL RIB_REGISTER_INTERFACE_TYPE (HPROVIDER provider, - C8 const *interface_name, - S32 entry_count, - RIB_INTERFACE_ENTRY const *rlist); - -typedef RIBRESULT AILCALL RIB_UNREGISTER_INTERFACE_TYPE (HPROVIDER provider, - C8 const *interface_name, - S32 entry_count, - RIB_INTERFACE_ENTRY const *rlist); - -#define RIB_registerP(x,y,z) rib_reg ((HPROVIDER)(x), y, ARY_CNT(z), z) -#define RIB_unregister_allP(x) rib_unreg ((HPROVIDER)(x), 0, 0, 0) - - -// ---------------------------------- -// Standard RIB API prototypes -// ---------------------------------- - -DXDEC HPROVIDER AILCALL RIB_alloc_provider_handle (long module); -DXDEC void AILCALL RIB_free_provider_handle (HPROVIDER provider); - -DXDEC HPROVIDER AILCALL RIB_load_provider_library (C8 const *filename); -DXDEC void AILCALL RIB_free_provider_library (HPROVIDER provider); - -DXDEC RIBRESULT AILCALL RIB_register_interface (HPROVIDER provider, - C8 const *interface_name, - S32 entry_count, - RIB_INTERFACE_ENTRY const *rlist); - -DXDEC RIBRESULT AILCALL RIB_unregister_interface (HPROVIDER provider, - C8 const *interface_name, - S32 entry_count, - RIB_INTERFACE_ENTRY const *rlist); - -DXDEC RIBRESULT AILCALL RIB_request_interface (HPROVIDER provider, - C8 const *interface_name, - S32 entry_count, - RIB_INTERFACE_ENTRY *rlist); - -DXDEC RIBRESULT AILCALL RIB_request_interface_entry (HPROVIDER provider, - C8 const *interface_name, - RIB_ENTRY_TYPE entry_type, - C8 const *entry_name, - UINTa *token); - -DXDEC S32 AILCALL RIB_enumerate_interface (HPROVIDER provider, - C8 const *interface_name, - RIB_ENTRY_TYPE type, - HMSSENUM *next, - RIB_INTERFACE_ENTRY *dest); - -DXDEC S32 AILCALL RIB_enumerate_providers (C8 const *interface_name, - HMSSENUM *next, - HPROVIDER *dest); - -DXDEC C8 * AILCALL RIB_type_string (void const * data, - RIB_DATA_SUBTYPE subtype); - -DXDEC HPROVIDER AILCALL RIB_find_file_provider (C8 const *interface_name, - C8 const *property_name, - C8 const *file_suffix); - -DXDEC HPROVIDER AILCALL RIB_find_provider (C8 const *interface_name, - C8 const *property_name, - void const *property_value); - -// -// Static library definitions -// - -#ifdef MSS_STATIC_RIB - #define RIB_MAIN_NAME( name ) name##_RIB_Main - - DXDEC S32 AILCALL RIB_MAIN_NAME(SRS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(DTS)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(DolbySurround)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(MP3Dec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(OggDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(BinkADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(SpxDec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(SpxEnc)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(Voice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(SpxVoice)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - DXDEC S32 AILCALL RIB_MAIN_NAME(DSP)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - -#ifdef IS_XENON - DXDEC S32 AILCALL RIB_MAIN_NAME(XMADec)( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); -#endif - - #define Register_RIB(name) RIB_load_static_provider_library(RIB_MAIN_NAME(name),#name) - -#else // MSS_STATIC_RIB - #define RIB_MAIN_NAME( name ) RIB_Main - DXDEC S32 AILCALL RIB_Main( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); -#endif // MSS_STATIC_RIB - -typedef S32 ( AILCALL * RIB_MAIN_FUNC) ( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); - -DXDEC HPROVIDER AILCALL RIB_load_static_provider_library (RIB_MAIN_FUNC main, const char* description); - - -DXDEC HPROVIDER AILCALL RIB_find_files_provider (C8 const *interface_name, - C8 const *property_name_1, - C8 const *file_suffix_1, - C8 const *property_name_2, - C8 const *file_suffix_2); - -DXDEC HPROVIDER AILCALL RIB_find_file_dec_provider (C8 const *interface_name, - C8 const *property_name_1, - U32 decimal_property_value_1, - C8 const *property_name_2, - C8 const *file_suffix_2); - -DXDEC S32 AILCALL RIB_load_application_providers - (C8 const *filespec); - -DXDEC void AILCALL RIB_set_provider_user_data (HPROVIDER provider, - U32 index, - SINTa value); - -DXDEC SINTa AILCALL RIB_provider_user_data (HPROVIDER provider, - U32 index); - -DXDEC void AILCALL RIB_set_provider_system_data - (HPROVIDER provider, - U32 index, - SINTa value); - -DXDEC SINTa AILCALL RIB_provider_system_data (HPROVIDER provider, - U32 index); - -DXDEC C8 * AILCALL RIB_error (void); - -#endif // RIB_H - - -#ifndef MSS_ASI_VERSION // MSSASI.H contents included if MSSASI.H not already included - -#define AIL_ASI_VERSION 1 -#define AIL_ASI_REVISION 0 - -// -// Handle to stream being managed by ASI codec -// - -typedef SINTa HASISTREAM; - -// -// ASI result codes -// - -typedef S32 ASIRESULT; - -#define ASI_NOERR 0 // Success -- no error -#define ASI_NOT_ENABLED 1 // ASI not enabled -#define ASI_ALREADY_STARTED 2 // ASI already started -#define ASI_INVALID_PARAM 3 // Invalid parameters used -#define ASI_INTERNAL_ERR 4 // Internal error in ASI driver -#define ASI_OUT_OF_MEM 5 // Out of system RAM -#define ASI_ERR_NOT_IMPLEMENTED 6 // Feature not implemented -#define ASI_NOT_FOUND 7 // ASI supported device not found -#define ASI_NOT_INIT 8 // ASI not initialized -#define ASI_CLOSE_ERR 9 // ASI not closed correctly - -// ---------------------------------- -// Application-provided ASI callbacks -// ---------------------------------- - -// -// AILASIFETCHCB: Called by ASI to obtain data from stream source -// -// offset normally will be either 0 at the first call made by the codec -// or -1 to specify a continuous stream, except when ASI_stream_seek() -// is called to restart the stream codec at a new stream offset. In this -// case, the application must execute the seek operation on the ASI codec's -// behalf. -// -// In response to this callback, the application should read the requested -// data and copy it to the specified destination buffer, returning the number -// of bytes copied (which can be less than bytes_requested if the end of -// the stream is reached). -// - - -typedef S32 (AILCALLBACK * AILASIFETCHCB) (UINTa user, // User value passed to ASI_open_stream() - void *dest, // Location to which stream data should be copied by app - S32 bytes_requested, // # of bytes requested by ASI codec - S32 offset); // If not -1, application should seek to this point in stream - -//############################################################################ -//## ## -//## Interface "ASI codec" ## -//## ## -//############################################################################ - -// -// Initialize ASI stream codec -// -// No other ASI functions may be called outside an ASI_startup() / -// ASI_shutdown() pair, except for the standard RIB function -// PROVIDER_property() where appropriate. -// - -typedef ASIRESULT (AILCALL *ASI_STARTUP)(void); - -// -// Shut down ASI codec -// - -typedef ASIRESULT (AILCALL * ASI_SHUTDOWN)(void); - -// -// Return codec error message, or NULL if no errors have occurred since -// last call -// -// The ASI error text state is global to all streams -// - -typedef C8 * (AILCALL * ASI_ERROR)(void); - -//############################################################################ -//## ## -//## Interface "ASI stream" ## -//## ## -//############################################################################ - -// -// Open a stream, returning handle to stream -// - -typedef HASISTREAM (AILCALL *ASI_STREAM_OPEN) (MSS_ALLOC_TYPE * palloc, - MSS_FREE_TYPE * pfree, - UINTa user, // User value passed to fetch callback - AILASIFETCHCB fetch_CB, // Source data fetch handler - U32 total_size); // Total size for %-done calculations (0=unknown) - -// -// Translate data in stream, returning # of bytes actually decoded or encoded -// -// Any number of bytes may be requested. Requesting more data than is -// available in the codec's internal buffer will cause the AILASIFETCHCB -// handler to be called to fetch more data from the stream. -// - -typedef S32 (AILCALL *ASI_STREAM_PROCESS) (HASISTREAM stream, // Handle of stream - void *buffer, // Destination for processed data - S32 buffer_size); // # of bytes to return in buffer - -// -// Restart stream decoding process at new offset -// -// Relevant for decoders only -// -// Seek destination is given as offset in bytes from beginning of stream -// -// At next ASI_stream_process() call, decoder will seek to the closest possible -// point in the stream which occurs at or after the specified position -// -// This function has no effect for decoders which do not support random -// seeks on a given stream type -// -// Warning: some decoders may need to implement seeking by reparsing -// the entire stream up to the specified offset, through multiple calls -// to the data-fetch callback. This operation may be extremely -// time-consuming on large files or slow network connections. -// -// A stream_offset value of -1 may be used to inform the decoder that the -// application has changed the input stream offset on its own, e.g. for a -// double-buffering application where the ASI decoder is not accessing the -// stream directly. ASI decoders should respond to this by flushing all -// internal buffers and resynchronizing themselves to the data stream. -// - -typedef ASIRESULT (AILCALL *ASI_STREAM_SEEK) (HASISTREAM stream, - S32 stream_offset); - -// -// Retrieve or set a property value by index (returns 1 on success) -// - -typedef S32 (AILCALL *ASI_STREAM_PROPERTY) (HASISTREAM stream, - HPROPERTY property, - void * before_value, - void const * new_value, - void * after_value - ); - -// -// Close stream, freeing handle and all internally-allocated resources -// - -typedef ASIRESULT (AILCALL *ASI_STREAM_CLOSE) (HASISTREAM stream); - -#endif // MSS_ASI_VERSION - -//############################################################################ -//## ## -//## Interface "MSS mixer services" ## -//## ## -//############################################################################ - -// -// Operation flags used by mixer and filter modules -// - -#define M_DEST_STEREO 1 // Set to enable stereo mixer output -#define M_SRC_16 2 // Set to enable mixing of 16-bit samples -#define M_FILTER 4 // Set to enable filtering when resampling -#define M_SRC_STEREO 8 // Set to enable mixing of stereo input samples -#define M_RESAMPLE 16 // Set to enable playback ratios other than 65536 -#define M_VOL_SCALING 32 // Set to enable volume scalars other than 2048 -#define M_COPY16_NOVOL 64 - -#ifdef IS_32 - -// -// Initialize mixer -// -// No other mixer functions may be called outside a MIXER_startup() / -// MIXER_shutdown() pair, except for the standard RIB function -// PROVIDER_property() as appropriate. -// - -typedef void (AILCALL *MIXER_STARTUP)(void); - -// -// Shut down mixer -// - -typedef void (AILCALL *MIXER_SHUTDOWN)(void); - -// -// Flush mixer buffer -// - -typedef void (AILCALL *MIXER_FLUSH) (S32 *dest, - S32 len -#ifdef IS_X86 - ,U32 MMX_available -#endif - ); - -// -// Perform audio mixing operation -// - -typedef void (AILCALL *MIXER_MERGE) (void const * *src, - U32 *src_fract, - void const *src_end, - S32 * *dest, - void *dest_end, - S32 *left_val, - S32 *right_val, - S32 playback_ratio, - S32 scale_left, - S32 scale_right, - U32 operation -#ifdef IS_X86 - ,U32 MMX_available -#endif - ); - -// -// Translate mixer buffer contents to final output format -// -// "option" parameter is big_endian_output on Mac, MMX on x86, overwrite flag on PS2 -// - -typedef void (AILCALL *MIXER_COPY) (void const *src, - S32 src_len, - void *dest, - U32 operation -#if defined(IS_BE) || defined(IS_X86) - ,U32 option -#endif - ); - -#else - -// -// Initialize mixer -// -// No other mixer functions may be called outside a MIXER_startup() / -// MIXER_shutdown() pair, except for the standard RIB function -// PROVIDER_property() as appropriate. -// - -typedef void (AILCALL *MIXER_STARTUP)(void); - -// -// Shut down mixer -// - -typedef void (AILCALL *MIXER_SHUTDOWN)(void); - -// -// Flush mixer buffer -// - -typedef void (AILCALL *MIXER_FLUSH) (S32 *dest, - S32 len, - U32 MMX_available); - -// -// Perform audio mixing operation -// - -typedef void (AILCALL *MIXER_MERGE) (U32 src_sel, - U32 dest_sel, - U32 *src_fract, - U32 *src_offset, - U32 *dest_offset, - U32 src_end_offset, - U32 dest_end_offset, - S32 *left_val, - S32 *right_val, - S32 playback_ratio, - S32 scale_both, - U32 operation); - -// -// Translate mixer buffer contents to final output format -// - -typedef void (AILCALL *MIXER_COPY) (void const *src, - S32 src_len, - void *dest, - U32 operation, - U32 option); -#endif - - -typedef struct _MSS_BB // Used in both MC and conventional mono/stereo configurations -{ - S32 *buffer; // Build buffer - S32 bytes; // Size in bytes - S32 chans; // Always mono (1) or stereo (2) - - S32 speaker_offset; // Destination offset in interleaved PCM block for left channel -} MSS_BB; - -typedef struct _ADPCMDATATAG -{ - U32 blocksize; - U32 extrasamples; - U32 blockleft; - U32 step; - UINTa savesrc; - U32 sample; - UINTa destend; - UINTa srcend; - U32 samplesL; - U32 samplesR; - U16 moresamples[16]; -} ADPCMDATA; - -typedef void (AILCALL * MIXER_MC_COPY) ( MSS_BB * build, - S32 n_build_buffers, - void * lpWaveAddr, - S32 hw_format, -#ifdef IS_X86 - S32 use_MMX, -#endif - S32 samples_per_buffer, - S32 physical_channels_per_sample ); - - -typedef void (AILCALL * MIXER_ADPCM_DECODE ) ( void * dest, - void const * in, - S32 out_len, - S32 in_len, - S32 input_format, - ADPCMDATA *adpcm_data); - -// -// Type definitions -// - -struct _DIG_DRIVER; - -struct _MDI_DRIVER; - -typedef struct _DIG_DRIVER * HDIGDRIVER; // Handle to digital driver - -typedef struct _MDI_DRIVER * HMDIDRIVER; // Handle to XMIDI driver - -typedef struct _SAMPLE * HSAMPLE; // Handle to sample - -typedef struct _SEQUENCE * HSEQUENCE; // Handle to sequence - -typedef S32 HTIMER; // Handle to timer - - -// -// Function pointer types -// - -typedef void (AILCALLBACK* AILINCB) (void const *data, S32 len, UINTa user_data); - -typedef void (AILCALLBACK* AILTRACECB) (C8 *text, S32 nest_depth); - -typedef void (AILCALLBACK* AILTIMERCB) (UINTa user); - -typedef void (AILCALLBACK* AILSAMPLECB) (HSAMPLE sample); - -typedef void (AILCALLBACK* AILMIXERCB) (HDIGDRIVER dig); - -typedef F32 (AILCALLBACK* AILFALLOFFCB) (HSAMPLE sample, F32 distance, F32 rolloff_factor, F32 min_dist, F32 max_dist); - -typedef S32 (AILCALLBACK* AILEVENTCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 status,S32 data_1,S32 data_2); - -typedef S32 (AILCALLBACK* AILTIMBRECB) (HMDIDRIVER hmi,S32 bank,S32 patch); - -typedef S32 (AILCALLBACK* AILPREFIXCB) (HSEQUENCE seq,S32 log,S32 data); - -typedef void (AILCALLBACK* AILTRIGGERCB) (HSEQUENCE seq,S32 log,S32 data); - -typedef void (AILCALLBACK* AILBEATCB) (HMDIDRIVER hmi,HSEQUENCE seq,S32 beat,S32 measure); - -typedef void (AILCALLBACK* AILSEQUENCECB) (HSEQUENCE seq); - -typedef S32 (AILCALLBACK *SS_STREAM_CB) (HSAMPLE S, S16 *dest_mono_sample_buffer, S32 dest_buffer_size); - -// -// Handle to sample and driver being managed by pipeline filter -// - -typedef SINTa HSAMPLESTATE; -typedef SINTa HDRIVERSTATE; - -// -// Digital pipeline stages -// -// These are the points at which external modules may be installed into -// a given HSAMPLE or HDIGDRIVER's processing pipeline -// - -typedef enum -{ - SP_ASI_DECODER = 0, // Must be "ASI codec stream" provider - SP_FILTER, // Must be "MSS pipeline filter" provider - SP_FILTER_0 = SP_FILTER, // Must be "MSS pipeline filter" provider - SP_FILTER_1, // Must be "MSS pipeline filter" provider - SP_FILTER_2, // Must be "MSS pipeline filter" provider - SP_FILTER_3, // Must be "MSS pipeline filter" provider - SP_FILTER_4, // Must be "MSS pipeline filter" provider - SP_FILTER_5, // Must be "MSS pipeline filter" provider - SP_FILTER_6, // Must be "MSS pipeline filter" provider - SP_FILTER_7, // Must be "MSS pipeline filter" provider - SP_MERGE, // Must be "MSS mixer" provider - N_SAMPLE_STAGES, // Placeholder for end of list (= # of valid sample pipeline stages) - SP_OUTPUT = N_SAMPLE_STAGES, // Used to set/get prefs/attribs on a driver's output or matrix filter (if present) - SAMPLE_ALL_STAGES // Used to signify all pipeline stages, for shutdown -} -SAMPLESTAGE; - -#define N_SP_FILTER_STAGES 8 // SP_FILTER_0 ... SP_FILTER_7 - -typedef enum -{ - DP_FLUSH = 0, // Must be "MSS mixer" provider - DP_DEFAULT_FILTER, // Must be "MSS pipeline filter" provider (sets the default) - DP_DEFAULT_MERGE, // Must be "MSS mixer" provider (sets the default) - DP_COPY, // Must be "MSS mixer" provider - DP_MC_COPY, // Must be "MSS mixer" provider - DP_ADPCM_DECODE, // Must be "MSS mixer" provider - N_DIGDRV_STAGES, // Placeholder for end of list (= # of valid stages) - DIGDRV_ALL_STAGES // Used to signify all pipeline stages, for shutdown -} -DIGDRVSTAGE; - -typedef struct - { - ASI_STREAM_OPEN ASI_stream_open; - ASI_STREAM_PROCESS ASI_stream_process; - ASI_STREAM_SEEK ASI_stream_seek; - ASI_STREAM_CLOSE ASI_stream_close; - ASI_STREAM_PROPERTY ASI_stream_property; - - HPROPERTY INPUT_BIT_RATE; - HPROPERTY INPUT_SAMPLE_RATE; - HPROPERTY INPUT_BITS; - HPROPERTY INPUT_CHANNELS; - HPROPERTY OUTPUT_BIT_RATE; - HPROPERTY OUTPUT_SAMPLE_RATE; - HPROPERTY OUTPUT_BITS; - HPROPERTY OUTPUT_CHANNELS; - HPROPERTY OUTPUT_CHANNEL_MASK; - HPROPERTY OUTPUT_RESERVOIR; - HPROPERTY POSITION; - HPROPERTY PERCENT_DONE; - HPROPERTY MIN_INPUT_BLOCK_SIZE; - HPROPERTY RAW_RATE; - HPROPERTY RAW_BITS; - HPROPERTY RAW_CHANNELS; - HPROPERTY REQUESTED_RATE; - HPROPERTY REQUESTED_BITS; - HPROPERTY REQUESTED_CHANS; - HPROPERTY STREAM_SEEK_POS; - HPROPERTY DATA_START_OFFSET; - HPROPERTY DATA_LEN; - HPROPERTY EXACT_SEEK; - HPROPERTY EXACT_GETPOS; - HPROPERTY SEEK_LOOKUP; - HPROPERTY SET_LOOPING_SAMPLES; - HPROPERTY CLEAR_LOOP_META; - - HASISTREAM stream; - } -ASISTAGE; - -typedef struct - { - struct _FLTPROVIDER *provider; - HSAMPLESTATE sample_state[MAX_SPEAKERS]; - } -FLTSTAGE; - -typedef struct -{ - S32 active; // Pass-through if 0, active if 1 - HPROVIDER provider; - - union - { - ASISTAGE ASI; - MIXER_MERGE MSS_mixer_merge; - FLTSTAGE FLT; - } - TYPE; -} -SPINFO; - -typedef struct -{ - S32 active; // Pass-through if 0, active if 1 - HPROVIDER provider; - - union - { - MIXER_FLUSH MSS_mixer_flush; - MIXER_COPY MSS_mixer_copy; - MIXER_MC_COPY MSS_mixer_mc_copy; - MIXER_ADPCM_DECODE MSS_mixer_adpcm_decode; - } - TYPE; -} -DPINFO; - -// -// Other data types -// - -typedef enum -{ - WIN32_HWAVEOUT, // waveOut handle for HDIGDRIVER, if any - WIN32_HWAVEIN, // waveIn handle for HDIGINPUT, if any - WIN32_LPDS, // lpDirectSound pointer for HSAMPLE - WIN32_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE - WIN32_HWND, // HWND that will be used to open DirectSound driver - WIN32_POSITION_ERR, // Nonzero if DirectSound play cursor stops moving (e.g., headphones removed) - - PS3_AUDIO_PORT, // cellaudio port that Miles is using - PS3_AUDIO_ADDRESS, // address of cellaudio sound buffer - PS3_AUDIO_LENGTH, // length of cellaudio sound buffer - PS3_AUDIO_POSITION, // current playback position of cellaudio sound buffer - - PSP_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw - PSP_AUDIO_PORT, // Port # Miles is using, -1 for simple audio, >= 0 for libwave - - PSP2_SUBMIT_THREAD, // Handle to thread submitting chucks of audio to the hw - PSP2_AUDIO_PORT, // Port # Miles is using - - OAL_CONTEXT, // OpenAL Context - OAL_DEVICE, // OpenAL Device - - XB_LPDS, // lpDirectSound pointer for HSAMPLE - XB_LPDSB, // lpDirectSoundBuffer pointer for HSAMPLE - - XB360_LPXAB // IXAudioSourceVoice pointer for HDIGDRIVER -} -MSS_PLATFORM_PROPERTY; - - -typedef struct _AIL_INPUT_INFO // Input descriptor type -{ - AILINCB callback; // Callback function to receive incoming data - UINTa user_data; // this is a user defined value - U32 device_ID; // DS LPGUID or wave device ID - U32 hardware_format; // e.g., DIG_F_STEREO_16 - U32 hardware_rate; // e.g., 22050 - S32 buffer_size; // Maximum # of bytes to be passed to callback (-1 to use DIG_INPUT_LATENCY) -} AIL_INPUT_INFO; - -typedef struct _AILTIMER // Timer instance -{ - AILTIMERCB callback; - U64 next; - U64 delta; - UINTa user; - U32 status; -} AILTIMERSTR; - -#ifndef IS_WIN64 - - #define OFSblocksize 0 // these constants valid for 32-bit versions only! - #define OFSextrasamples 4 - #define OFSblockleft 8 - #define OFSstep 12 - #define OFSsavesrc 16 - #define OFSsample 20 - #define OFSdestend 24 - #define OFSsrcend 28 - #define OFSsamplesL 32 - #define OFSsamplesR 36 - #define OFSmoresamples 40 - -#endif - -typedef struct LOWPASS_INFO -{ - S32 X0, X1; - S32 Y0, Y1; - S32 A, B0, B1; - S32 flags; - S32 queuedA, queuedB; - F32 calculated_cut; - F32 cutoff; -} LOWPASS_INFO; - - -typedef union STAGE_BUFFER -{ - union STAGE_BUFFER * next; - U8 data[ 1 ]; -} STAGE_BUFFER; - -typedef struct _MSSVECTOR3D -{ - F32 x; - F32 y; - F32 z; -} MSSVECTOR3D; - -#define MILES_TANGENT_LINEAR 0 -#define MILES_TANGENT_CURVE 1 -#define MILES_TANGENT_STEP 2 -#define MILES_MAX_FALLOFF_GRAPH_POINTS 5 - -#define MILES_MAX_SEGMENT_COUNT 10 - -typedef struct _MSSGRAPHPOINT -{ - F32 X, Y, ITX, ITY, OTX, OTY; // Point & tangents. - S32 IType, OType; -} MSSGRAPHPOINT; - -typedef struct _S3DSTATE // Portion of HSAMPLE that deals with 3D positioning -{ - MSSVECTOR3D position; // 3D position - MSSVECTOR3D face; // 3D orientation - MSSVECTOR3D up; // 3D up-vector - MSSVECTOR3D velocity; // 3D velocity - - S32 doppler_valid; // TRUE if OK to apply Doppler shift - F32 doppler_shift; // Scalar for S->playback rate - - F32 inner_angle; // Cone attenuation parameters - F32 outer_angle; // (Angles divided by two and convered to rads for dot-product comparisons) - F32 outer_volume; - S32 cone_enabled; - - F32 max_dist; // Sample distances - F32 min_dist; - S32 dist_changed; // TRUE if min/max distances have changed and need to be sent to the hardware - - S32 auto_3D_atten; // TRUE if distance/cone attenuation should be applied to wet signal - F32 atten_3D; // Attenuation due to distance/cone effects, calculated by software 3D positioner - F32 rolloff; // per sample rolloff factor to use instead of global rolloff, if non zero. - - F32 exclusion_3D; // exclusion value computed by falloff graph. -1 if not affected. - F32 lowpass_3D; // low pass cutoff computed by falloff graph. -1 if not affected. - - F32 spread; - - HSAMPLE owner; // May be NULL if used for temporary/internal calculations - AILFALLOFFCB falloff_function; // User function for min/max distance calculations, if desired - - MSSVECTOR3D position_graph[MILES_MAX_SEGMENT_COUNT]; - S32 position_graph_count; - - MSSGRAPHPOINT volgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; - MSSGRAPHPOINT excgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; - MSSGRAPHPOINT lpgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; - MSSGRAPHPOINT spreadgraph[MILES_MAX_FALLOFF_GRAPH_POINTS]; - - U8 volgraphcnt; - U8 excgraphcnt; - U8 lpgraphcnt; - U8 spreadgraphcnt; - -} S3DSTATE; - -typedef struct _SMPBUF -{ - void const *start; // Sample buffer address (W) - U32 len; // Sample buffer size in bytes (W) - U32 pos; // Index to next byte (R/W) - U32 done; // Nonzero if buffer with len=0 sent by app - S32 reset_ASI; // Reset the ASI decoder at the end of the buffer - S32 reset_seek_pos; // New destination offset in stream source data, for ASI codecs that care -} SMPBUF; - -typedef struct _SAMPLE // Sample instance -{ - U32 tag; // HSAM - - HDIGDRIVER driver; // Driver for playback - - S32 index; // Numeric index of this sample - - SMPBUF buf[8]; // Source data buffers - - U32 src_fract; // Fractional part of source address - - U32 mix_delay; // ms until start mixing (decreased every buffer mix) - F32 max_output_mix_volume; // max_volume of any speaker at last mix - - U64 mix_bytes; // total number of bytes sent to the mixer for this sample. - - S32 group_id; // ID for grouped operations. - - // size of the next dynamic arrays - U32 chan_buf_alloced; - U32 chan_buf_used; - U8* chan_buf_ptr; - - // these are dynamic arrays sized as n_channels long (so 1 for mono, 2 stereo, 6 for 5.1) - S32 *left_val; - S32 *right_val; - S32 *last_decomp; - LOWPASS_INFO *lp; // low pass info - - - // these are dynamic arrays pointing to dynamic arrays, each of the sub arrays are n_channels long or [MAX_SPEAKERS][n_channels] - F32 **user_channel_levels; // Channel levels set by AIL_set_sample_channel_levels() [source_channels][driver->logical_channels] - S32 **cur_scale; // Calculated 11-bit volume scale factors for current/previous mixing interval - S32 **prev_scale; // (These are all indexed by build buffer*2, not speaker indexes!) - S32 **ramps_left; - - // these are dynamic arrays - F32 *auto_3D_channel_levels; // Channel levels set by 3D positioner (always 1.0 if not 3D-positioned) - F32 *speaker_levels; // one level per speaker (multiplied after user or 3D) - - S8 *speaker_enum_to_source_chan; // array[MSS_SPEAKER_xx] = -1 if not present, else channel # - // 99% of the time this is a 1:1 mapping and is zero. - - S32 lp_any_on; // are any of the low pass filters on? - S32 user_channels_need_deinterlace; // do any of the user channels require a stereo sample to be deinterlaced? - - S32 n_buffers; // # of buffers (default = 2) - S32 head; - S32 tail; - S32 starved; // Buffer stream has run out of data - S32 exhaust_ASI; // Are we prolonging the buffer lifetime until ASI output is exhausted? - - S32 loop_count; // # of cycles-1 (1=one-shot, 0=indefinite) - S32 loop_start; // Starting offset of loop block (0=SOF) - S32 loop_end; // End offset of loop block (-1=EOF) - S32 orig_loop_count; // Original loop properties specified by app, before any - S32 orig_loop_start; // alignment constraints - S32 orig_loop_end; - - S32 format; // DIG_F format (8/16 bits, mono/stereo/multichannel) - S32 n_channels; // # of channels (which can be >2 for multichannel formats) - U32 channel_mask; // Same as WAVEFORMATEXTENSIBLE.dwChannelMask - - S32 original_playback_rate; // Playback rate in hertz - F32 playback_rate_factor; // Fractional playback rate, normally 1.0 - - F32 save_volume; // Sample volume 0-1.0 - F32 save_pan; // Mono panpot/stereo balance (0=L ... 1.0=R) - - F32 left_volume; // Left/mono volume 0 to 1.0 - F32 right_volume; // Right volume 0 to 1.0 - F32 wet_level; // reverb level 0 to 1.0 - F32 dry_level; // non-reverb level 0 to 1.0 - F32 sys_level; // system control - - F32 extra_volume; // Volume scalar for ramping or otherwise. - F32 extra_wet; - F32 extra_lp; - F32 extra_rate; - - - U32 low_pass_changed; // bit mask for what channels changed. - - S32 bus; // Bus assignment for this sample. - S32 bus_comp_sends; // Which buses this bus routes compressor input to. - S32 bus_comp_installed; // Nonzero if we have a compressor installed. - U32 bus_comp_input; // The input to use for this bus's compressor, if we have one installed - S32 bus_override_wet; // If true, samples on this bus will use the bus's wet level instead of their own. - U32 bus_signal_strength; // The bus level. - S32 bus_enable_limiter; // If true, a basic limiter will be run on the samples prior to clamping to S16. - S32 bus_limiter_atten; // The attenuation that was applied on the last bus pass. - - S32 fade_to_stop; // # of samples to fade to stop over. ( currently fixed at the volramp count ) - - U64 mix_start_time; // arbitrary non-zero id for starting sounds synced. - - S16 pop_fade_total; - S16 pop_fade_time; - U8 pop_fade_stop; // nonzero we end the sample when it fades out. - - U8 state_level; // Level the sample was started at. -#ifdef IS_WIIU - S8 route_to_drc; -#endif - - F32 obstruction; - F32 occlusion; - F32 exclusion; - - S32 service_type; // 1 if single-buffered; 2 if streamed - - AILSAMPLECB SOB; // Start-of-block callback function - AILSAMPLECB EOB; // End-of-buffer callback function - AILSAMPLECB EOS; // End-of-sample callback function - - SINTa user_data [8]; // Miscellaneous user data - SINTa system_data[8]; // Miscellaneous system data - SINTa hl_marker_list; - - ADPCMDATA adpcm; - - S32 doeob; // Flags to trigger callbacks - S32 dosob; - S32 doeos; - - S32 vol_ramps; - S32 resamp_tolerance; - S32 enable_resamp_filter; - - // - // Sample pipeline stages - // - - SPINFO pipeline[N_SAMPLE_STAGES]; - S32 n_active_filters; // # of SP_FILTER_n stages active - - // - // 3D-related state for all platforms (including Xbox) - // - - S32 is_3D; // TRUE if channel levels are derived automatically from 3D positional state, FALSE if they're controlled manually - - S3DSTATE S3D; // Software version applies 3D positioning only if is_3D == TRUE, but output filters always use it - -#ifdef MSS_VFLT_SUPPORTED - void *voice; // Optional object used by output filter to store per-sample information such as DS3D buffers -#endif - - F32 leftb_volume; // Left/mono volume 0 to 1.0 (back) - F32 rightb_volume; // Right volume 0 to 1.0 (back) - F32 center_volume; // Center volume 0 to 1.0 - F32 low_volume; // Low volume 0 to 1.0 - F32 save_fb_pan; // Sample volume 0-1.0 - F32 save_center; // saved center level - F32 save_low; // saved sub level - -#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS) - S32 spu_on; - U32 align[1]; -#endif - -#if defined(IS_WINDOWS) - - // - // DirectSound-specific data - // - - S32 service_interval; // Service sample every n ms - S32 service_tick; // Current service countdown value - S32 buffer_segment_size; // Buffer segment size to fill - - S32 prev_segment; // Previous segment # (0...n) - S32 prev_cursor; // Previous play cursor location - - S32 bytes_remaining; // # of bytes left to play (if not -1) - - S32 direct_control; // 1 if app controls buffer, 0 if MSS - -#endif -} SAMPLE; - -#ifdef MILES_CHECK_OFFSETS - RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(SAMPLE, save_low) & 3) == 0); -#endif - -// -// used for AIL_process -// - -typedef struct _AILMIXINFO { - AILSOUNDINFO Info; - ADPCMDATA mss_adpcm; - U32 src_fract; - S32 left_val; - S32 right_val; -} AILMIXINFO; - - - -DXDEC U32 AILCALL AIL_get_timer_highest_delay (void); - -DXDEC void AILCALL AIL_serve(void); - -#ifdef IS_MAC - - typedef void * LPSTR; - - #define WHDR_DONE 0 - - typedef struct _WAVEIN - { - long temp; - } * HWAVEIN; - - typedef struct _WAVEHDR - { - S32 dwFlags; - S32 dwBytesRecorded; - S32 dwUser; - S32 temp; - void * lpData; - S32 dwBufferLength; - S32 longdwLoops; - S32 dwLoops; - void * lpNext; - U32 * reserved; - - } WAVEHDR, * LPWAVEHDR; - -#endif - -#define N_WAVEIN_BUFFERS 8 // Use a ring of 8 buffers by default - -typedef struct _DIG_INPUT_DRIVER *HDIGINPUT; // Handle to digital input driver - -#ifdef IS_MAC - - #define AIL_DIGITAL_INPUT_DEFAULT 0 - - typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver - { - U32 tag; // HDIN - S32 input_enabled; // 1 if enabled, 0 if not - U32 incoming_buffer_size; - void * incoming_buffer[ 2 ]; - void* outgoing_buffer; - U32 which_buffer; - AIL_INPUT_INFO info; // Input device descriptor - AILMIXINFO incoming_info; - long device; -#ifdef IS_MAC - char InternalRecordingState[128]; // Hide this so we dont' have to #include OS stuff everywhere. -#endif - } DIG_INPUT_DRIVER; - -#else - -#define AIL_DIGITAL_INPUT_DEFAULT ((U32)WAVE_MAPPER) - -typedef struct _DIG_INPUT_DRIVER // Handle to digital input driver -{ - U32 tag; // HDIN - - HTIMER background_timer; // Background timer handle - - AIL_INPUT_INFO info; // Input device descriptor - - S32 input_enabled; // 1 if enabled, 0 if not - - UINTa callback_user; // Callback user value - - // - // Provider-independent data - // - - U32 DMA_size; // Size of each DMA sub-buffer in bytes - void *DMA[N_WAVEIN_BUFFERS]; // Simulated DMA buffers - - U32 silence; // Silence value for current format (0 or 128) - - S32 device_active; // 1 if buffers submittable, 0 if not - -#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) - // - // waveOut-specific data - // - - HWAVEIN hWaveIn; // Handle to wave input device - volatile MWAVEHDR wavehdr[N_WAVEIN_BUFFERS]; // Handles to wave headers - -#endif -} DIG_INPUT_DRIVER; -#endif - - -typedef struct REVERB_CONSTANT_INFO -{ - F32* start0,* start1,* start2,* start3,* start4,* start5; - F32* end0,* end1,* end2,* end3,* end4,* end5; - F32 C0, C1, C2, C3, C4, C5; - F32 A; - F32 B0, B1; -} REVERB_CONSTANT_INFO; - -typedef struct REVERB_UPDATED_INFO -{ - F32 * address0, * address1, * address2, * address3, * address4, * address5; - F32 X0, X1, Y0, Y1; -} REVERB_UPDATED_INFO; - -typedef struct REVERB_INFO -{ - REVERB_UPDATED_INFO u; - REVERB_CONSTANT_INFO c; -} REVERB_INFO; - -typedef struct REVERB_SETTINGS -{ - S32 room_type; // Changes to this drive master_wet and duration/damping/predelay! - F32 master_wet; // Master reverb level 0-1.0 - F32 master_dry; // Master non-reverb level 0-1.0 - - REVERB_INFO ri; - - S32 *reverb_build_buffer; - S32 reverb_total_size; - S32 reverb_fragment_size; - S32 reverb_buffer_size; - S32 reverb_on; - U32 reverb_off_time_ms; - - U32 reverb_duration_ms; - - F32 reverb_decay_time_s; - F32 reverb_predelay_s; - F32 reverb_damping; - - S32 reverb_head; - S32 reverb_tail; -} REVERB_SETTINGS; - - -typedef struct _MSS_RECEIVER_LIST -{ - MSSVECTOR3D direction; // Normalized direction vector from listener - - S32 speaker_index[MAX_SPEAKERS]; // List of speakers affected by sounds in this direction - F32 speaker_level[MAX_SPEAKERS]; // Each speaker's degree of effect from this source - S32 n_speakers_affected; -} MSS_RECEIVER_LIST; - -typedef struct _D3DSTATE -{ - S32 mute_at_max; - - MSSVECTOR3D listen_position; - MSSVECTOR3D listen_face; - MSSVECTOR3D listen_up; - MSSVECTOR3D listen_cross; - MSSVECTOR3D listen_velocity; - - F32 rolloff_factor; - F32 doppler_factor; - F32 distance_factor; - F32 falloff_power; - - // - // Precalculated listener info - // - - S32 ambient_channels [MAX_SPEAKERS]; // E.g., LFE - S32 n_ambient_channels; - - S32 directional_channels[MAX_SPEAKERS+1]; // Channel index, or -1 if virtual - MSSVECTOR3D listener_to_speaker [MAX_SPEAKERS+1]; - S32 n_directional_channels; - - MSS_RECEIVER_LIST receiver_specifications[MAX_RECEIVER_SPECS]; // Constellation of receiver vectors - S32 n_receiver_specs; - - MSSVECTOR3D speaker_positions [MAX_SPEAKERS]; // Listener-relative speaker locations - - F32 speaker_wet_reverb_response [MAX_SPEAKERS]; // Reverb sensitivity of each speaker - F32 speaker_dry_reverb_response [MAX_SPEAKERS]; -} D3DSTATE; - -typedef enum -{ - MSS_MC_INVALID = 0, // Used for configuration-function errors - MSS_MC_MONO = 1, // For compatibility with S32 channel param - MSS_MC_STEREO = 2, - MSS_MC_USE_SYSTEM_CONFIG = 0x10, // Leave space between entries for new variations - MSS_MC_HEADPHONES = 0x20, // with similar quality levels/speaker counts - MSS_MC_DOLBY_SURROUND = 0x30, - MSS_MC_SRS_CIRCLE_SURROUND = 0x40, - MSS_MC_40_DTS = 0x48, - MSS_MC_40_DISCRETE = 0x50, - MSS_MC_51_DTS = 0x58, - MSS_MC_51_DISCRETE = 0x60, - MSS_MC_61_DISCRETE = 0x70, - MSS_MC_71_DISCRETE = 0x80, - MSS_MC_81_DISCRETE = 0x90, - MSS_MC_DIRECTSOUND3D = 0xA0, - MSS_MC_EAX2 = 0xC0, - MSS_MC_EAX3 = 0xD0, - MSS_MC_EAX4 = 0xE0, - MSS_MC_FORCE_32 = 0x7fffffff -} -MSS_MC_SPEC; - - -typedef struct _DIG_DRIVER // Handle to digital audio driver -{ - U32 tag; // HDIG - - HTIMER backgroundtimer; // Background timer handle - - U32 num_mixes; // incrementing number of mixes - - S32 mix_ms; // rough ms per mix - - - F32 master_volume; // Master sample volume 0-1.0 - - S32 DMA_rate; // Hardware sample rate - S32 hw_format; // DIG_F code in use - S32 n_active_samples; // # of samples being processed - - MSS_MC_SPEC channel_spec; // Original "channels" value passed to AIL_open_digital_driver() - - D3DSTATE D3D; // 3D listener parms for all platforms - - -#if defined(IS_PSP2) || defined(IS_PSP) || defined(IS_XENON) || defined(IS_IPHONE) || defined(IS_MAC) || defined(IS_LINUX) || defined(IS_3DS) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) // generic dig platforms -#define IS_GENERICDIG - void* dig_ss; // Sound system ptr (embed in mss.h?) - void* dig_heap; // Sound system heap. -#endif - -#ifdef IS_XENON - void* x2_voiceptr; //! \todo get rid of this? Only expose dig_ss? -#endif - - S32 quiet; // # of consecutive quiet sample periods - S32 playing; // Playback active if non-zero - - S32 bytes_per_channel; // # of bytes per channel (always 1 or 2 for 8- or 16-bit hardware output) - S32 samples_per_buffer; // # of samples per build buffer / half-buffer - S32 physical_channels_per_sample; // # of channels per *physical* sample (1 or 2, or more in discrete MC mode) - S32 logical_channels_per_sample; // # of logical channels per sample (may differ from physical channel count in matrix formats) - -#ifdef IS_LINUX - S32 released; // has the sound manager been released? -#endif - - HSAMPLE samples; // Pointer to list of SAMPLEs - - U32 *sample_status; // SMP_ flags: _FREE, _DONE, _PLAYING, moved out of SAMPLEs for faster iteration - S32 n_samples; // # of SAMPLEs - - SINTa system_data[8]; // Miscellaneous system data - - HSAMPLE bus_samples[MAX_BUSSES]; // Sample handles the bus will route through. - S32 bus_active_count[MAX_BUSSES]; // Number of samples mixed on the bus last mix. - void* bus_ptrs[MAX_BUSSES]; // Buffers for each bus to mix in to. - - void* pushed_states[MILES_MAX_STATES]; - U8 state_index; - - // - // Build buffers - // - // In multichannel mode, source samples may be mixed into more than one - // build buffer - // - - MSS_BB build[MAX_SPEAKERS+EXTRA_BUILD_BUFFERS]; - S32 n_build_buffers; // # of build buffers actually used for output processing - - S32 hardware_buffer_size; // Size of each output buffer - - S32 enable_limiter; - S32 limiter_atten; // attenuation level from last hw copy. - - S32 scheduled_sample_count; // # of samples that are waiting to be started at an exact time. - - AILMIXERCB mixcb; // callback for each mix. - -#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) - - // - // waveOut-specific interface data - // - - HWAVEOUT hWaveOut; // Wave output driver - - U32 reset_works; // TRUE if OK to do waveOutReset - U32 request_reset; // If nonzero, do waveOutReset ASAP - - LPWAVEHDR first; // Pointer to first WAVEHDR in chain - S32 n_buffers; // # of output WAVEHDRs in chain - - LPWAVEHDR volatile *return_list; // Circular list of returned WAVEHDRs - S32 volatile return_head; // Head of WAVEHDR list (insertion point) - S32 volatile return_tail; // Tail of WAVEHDR list (retrieval point) - - // - // DirectSound-specific interface data - // - - UINTa guid; // The guid id of the ds driver - AILLPDIRECTSOUND pDS; // DirectSound output driver (don't - // use with Smacker directly anymore!) - - U32 ds_priority; // priority opened with - - S32 emulated_ds; // is ds emulated or not? - AILLPDIRECTSOUNDBUFFER lppdsb; // primary buffer or null - - UINTa dsHwnd; // HWND used with DirectSound - - AILLPDIRECTSOUNDBUFFER * lpbufflist; // List of pointers to secondary buffers - HSAMPLE *samp_list; // HSAMPLE associated with each buffer - S32 *sec_format; // DIG_F_ format for secondary buffer - S32 max_buffs; // Max. allowable # of secondary buffers - - // - // Driver output configuration - // - // Note: # of "logical" (source) channels per sample = dig->channels_per_sample - // # of "physical" (DAC) channels per sample = dig->wformat.wf.nChannels - // - // These may be different if a matrix format (e.g., Dolby/SRS) - // is in use! - // - - MPCMWAVEFORMAT wformat; // format from waveout open - C8 wfextra[32]; // Extension to PCMWAVEFORMAT (e.g., WAVE_FORMAT_EXTENSIBLE) - - // - // Misc. data - // - - S32 released; // has the sound manager been released? - - HDIGDRIVER next; // Pointer to next HDIGDRIVER in use - - // - // Vars for waveOut emulation - // - - S32 DS_initialized; - - AILLPDIRECTSOUNDBUFFER DS_sec_buff; // Secondary buffer (or NULL if none) - AILLPDIRECTSOUNDBUFFER DS_out_buff; // Output buffer (may be sec or prim) - S32 DS_buffer_size; // Size of entire output buffer - - S32 DS_frag_cnt; // Total fragment count and size, and - S32 DS_frag_size; // last fragment occupied by play cursor - S32 DS_last_frag; - S32 DS_last_write; - S32 DS_last_timer; - S32 DS_skip_time; - - S32 DS_use_default_format; // 1 to force use of default DS primary buffer format - - U32 position_error; // last status from position report (can be used - // to watch for headset removal) - U32 last_ds_play; - U32 last_ds_write; - U32 last_ds_move; - -#endif - -#ifdef IS_X86 - S32 use_MMX; // Use MMX with this driver if TRUE -#endif - - U64 mix_total; - U64 last_polled; - U32 last_percent; - - void * MC_buffer; - // - // Digital driver pipeline filter stages - // - - DPINFO pipeline[N_DIGDRV_STAGES]; - -#ifdef MSS_VFLT_SUPPORTED - struct _FLTPROVIDER *voice_filter; - SS_STREAM_CB stream_callback; -#endif - - struct _FLTPROVIDER *matrix_filter; - - // - // Reverb - // If no busses are active, 0 is still used as the base reverb. - // - REVERB_SETTINGS reverb[MAX_BUSSES]; - -#ifdef IS_PS3 - HDIGDRIVER next; // Pointer to next HDIGDRIVER in use - - void * hw_buf; - U32 hw_datarate; - U32 hw_align; - U32 port; - S32 hw_buffer_size; - S32 snd_frag_cnt; - S32 snd_frag_size; - S32 snd_last_frag; - S32 snd_last_write; - S32 snd_skip_time; - U32 snd_last_play; - U32 snd_last_move; - S32 snd_last_timer; -#endif - -#ifdef IS_GENERICDIG - HDIGDRIVER next; -#endif - -#if defined(IS_WINDOWS) - S32 no_wom_done; // don't process WOM_DONEs on this driver - U32 wom_done_buffers; -#endif - -#if defined(HOST_SPU_PROCESS) || defined(MSS_SPU_PROCESS) - U32 spu_num; - S32 spu_on; - U64 spu_total; - U64 spu_last_polled; - U32 spu_last_percent; - #ifdef IS_PS3 - U32 align[ 2 ]; - #else - U32 align[ 1 ]; - #endif -#endif - - U64 adpcm_time; - U64 deinterlace_time; - U64 mix_time; - U64 rev_time; - U64 reformat_time; - U64 lowpass_time; - U64 filter_time; - U64 copy_time; - U64 sob_time; - U64 eob_time; - U64 eos_time; - U64 spu_wait_time; - U64 asi_times[4]; - - HSAMPLE adpcm_sam; - HSAMPLE deinterlace_sam; - HSAMPLE mix_sam; - HSAMPLE rev_sam; - HSAMPLE reformat_sam; - HSAMPLE lowpass_sam; - HSAMPLE filter_sam; - HSAMPLE asi_sams[4]; - - U32 adpcm_num; - U32 deinterlace_num; - U32 mix_num; - U32 rev_num; - U32 reformat_num; - U32 lowpass_num; - U32 filter_num; - U32 asi_nums[4]; - - - // these clauses have to be at the end of the structure!! -#ifdef IS_WII - HDIGDRIVER next; // Pointer to next HDIGDRIVER in use - - U32 hw_datarate; - S32 hw_buffer_size; - S32 each_buffer_size; - S32 snd_frag_cnt; - S32 snd_frag_size; - S32 snd_last_frag; - S32 snd_last_write; - S32 snd_skip_time; - U32 snd_last_play; - U32 snd_last_move; - S32 snd_last_timer; - - void * buffer[ 2 ]; - U32 physical[ 2 ]; - - #ifdef AX_OUTPUT_BUFFER_DOUBLE - AXVPB* voice[ 2 ]; - #endif - -#endif - -#ifdef XAUDIOFRAMESIZE_NATIVE - XAUDIOPACKET packet; -#endif - -} DIG_DRIVER; - -#ifdef MILES_CHECK_OFFSETS - RR_COMPILER_ASSERT((RR_MEMBER_OFFSET(DIG_DRIVER, filter_num) & 3) == 0); -#endif - -typedef struct // MIDI status log structure - { - S32 program [NUM_CHANS]; // Program Change - S32 pitch_l [NUM_CHANS]; // Pitch Bend LSB - S32 pitch_h [NUM_CHANS]; // Pitch Bend MSB - - S32 c_lock [NUM_CHANS]; // Channel Lock - S32 c_prot [NUM_CHANS]; // Channel Lock Protection - S32 c_mute [NUM_CHANS]; // Channel Mute - S32 c_v_prot [NUM_CHANS]; // Voice Protection - S32 bank [NUM_CHANS]; // Patch Bank Select - S32 gm_bank_l [NUM_CHANS]; // GM Bank Select - S32 gm_bank_m [NUM_CHANS]; // GM Bank Select - S32 indirect [NUM_CHANS]; // ICA indirect controller value - S32 callback [NUM_CHANS]; // Callback Trigger - - S32 mod [NUM_CHANS]; // Modulation - S32 vol [NUM_CHANS]; // Volume - S32 pan [NUM_CHANS]; // Panpot - S32 exp [NUM_CHANS]; // Expression - S32 sus [NUM_CHANS]; // Sustain - S32 reverb [NUM_CHANS]; // Reverb - S32 chorus [NUM_CHANS]; // Chorus - - S32 bend_range[NUM_CHANS]; // Bender Range (data MSB, RPN 0 assumed) - - S32 RPN_L [NUM_CHANS]; // RPN # LSB - S32 RPN_M [NUM_CHANS]; // RPN # MSB - } -CTRL_LOG; - -typedef struct _SEQUENCE // XMIDI sequence state table -{ - char tag[4]; // HSEQ - - HMDIDRIVER driver; // Driver for playback - - U32 status; // SEQ_ flagsstruct - - void const *TIMB; // XMIDI IFF chunk pointers - void const *RBRN; - void const *EVNT; - - U8 const *EVNT_ptr; // Current event pointer - - U8 *ICA; // Indirect Controller Array - - AILPREFIXCB prefix_callback; // XMIDI Callback Prefix handler - AILTRIGGERCB trigger_callback; // XMIDI Callback Trigger handler - AILBEATCB beat_callback; // XMIDI beat/bar change handler - AILSEQUENCECB EOS; // End-of-sequence callback function - - S32 loop_count; // 0=one-shot, -1=indefinite, ... - - S32 interval_count; // # of intervals until next event - S32 interval_num; // # of intervals since start - - S32 volume; // Sequence volume 0-127 - S32 volume_target; // Target sequence volume 0-127 - S32 volume_accum; // Accumulated volume period - S32 volume_period; // Period for volume stepping - - S32 tempo_percent; // Relative tempo percentage 0-100 - S32 tempo_target; // Target tempo 0-100 - S32 tempo_accum; // Accumulated tempo period - S32 tempo_period; // Period for tempo stepping - S32 tempo_error; // Error counter for tempo DDA - - S32 beat_count; // Sequence playback position - S32 measure_count; - - S32 time_numerator; // Sequence timing data - S32 time_fraction; - S32 beat_fraction; - S32 time_per_beat; - - U8 const *FOR_ptrs[FOR_NEST]; // Loop stack - S32 FOR_loop_count [FOR_NEST]; - - S32 chan_map [NUM_CHANS]; // Physical channel map for sequence - - CTRL_LOG shadow; // Controller values for sequence - - S32 note_count; // # of notes "on" - - S32 note_chan [MAX_NOTES]; // Channel for queued note (-1=free) - S32 note_num [MAX_NOTES]; // Note # for queued note - S32 note_time [MAX_NOTES]; // Remaining duration in intervals - - SINTa user_data [8]; // Miscellaneous user data - SINTa system_data[8]; // Miscellaneous system data - -} SEQUENCE; - -#if defined(IS_MAC) || defined(IS_LINUX) || defined(IS_XENON) || defined(IS_PS3) || defined(IS_WII) || defined(IS_PSP) || defined(IS_PSP2) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) - -struct MIDIHDR; -struct MIDIOUT; -typedef struct MIDIOUT* HMIDIOUT; -typedef HMIDIOUT* LPHMIDIOUT; - -#endif - -typedef struct _MDI_DRIVER // Handle to XMIDI driver -{ - char tag[4]; // HMDI - - HTIMER timer; // XMIDI quantization timer - S32 interval_time; // XMIDI quantization timer interval in uS - - HSEQUENCE sequences; // Pointer to list of SEQUENCEs - S32 n_sequences; // # of SEQUENCEs - - S32 lock [NUM_CHANS]; // 1 if locked, 2 if protected, else 0 - HSEQUENCE locker[NUM_CHANS]; // HSEQUENCE which locked channel - HSEQUENCE owner [NUM_CHANS]; // HSEQUENCE which owned locked channel - HSEQUENCE user [NUM_CHANS]; // Last sequence to use channel - S32 state [NUM_CHANS]; // Lock state prior to being locked - - S32 notes [NUM_CHANS]; // # of active notes in channel - - AILEVENTCB event_trap; // MIDI event trap callback function - AILTIMBRECB timbre_trap; // Timbre request callback function - - S32 master_volume; // Master XMIDI note volume 0-127 - - SINTa system_data[8]; // Miscellaneous system data - -#if (defined(IS_WINDOWS) && !defined(__RADWINRTAPI__)) || defined(IS_MAC) || defined(IS_LINUX) - - S32 released; // has the hmidiout handle been released - U32 deviceid; // ID of the MIDI device - U8 *sysdata; // SysEx buffer - -#endif - -#if defined(IS_XENON) || defined(IS_WII) || defined(IS_PS3) || defined(IS_PSP) || defined(IS_3DS) || defined(IS_IPHONE) || defined(IS_PSP2) || defined(IS_WIIU) || defined(__RADWINRTAPI__) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) - HMDIDRIVER next; // Pointer to next HMDIDRIVER in use -#endif - -#ifdef IS_LINUX - struct MIDIHDR *mhdr; // SysEx header - HMDIDRIVER next; // Pointer to next HMDIDRIVER in use - HMIDIOUT hMidiOut; // MIDI output driver -#endif - -#if defined(IS_WINDOWS) && !defined(__RADWINRTAPI__) - - struct midihdr_tag *mhdr; // SysEx header - - HMDIDRIVER next; // Pointer to next HMDIDRIVER in use - - HMIDIOUT hMidiOut; // MIDI output driver - -#else - - #if defined(IS_MAC) - struct MIDIHDR *mhdr; // SysEx header - HMDIDRIVER next; // Pointer to next HMDIDRIVER in use - HMIDIOUT hMidiOut; // MIDI output driver - #endif - -#endif - -} MDI_DRIVER; - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(push, 1) -#endif - -typedef MSS_STRUCT // XMIDI TIMB IFF chunk - { - S8 name[4]; - - U8 msb; - U8 lsb; - U8 lsb2; - U8 lsb3; - - U16 n_entries; - - U16 timbre[1]; - } -TIMB_chunk; - -typedef MSS_STRUCT // XMIDI RBRN IFF entry - { - S16 bnum; - U32 offset; - } -RBRN_entry; - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(pop) -#endif - -typedef struct // Wave library entry -{ - S32 bank; // XMIDI bank, MIDI patch for sample - S32 patch; - - S32 root_key; // Root MIDI note # for sample (or -1) - - U32 file_offset; // Offset of wave data from start-of-file - U32 size; // Size of wave sample in bytes - - S32 format; // DIG_F format (8/16 bits, mono/stereo) - S32 playback_rate; // Playback rate in hertz -} -WAVE_ENTRY; - -typedef struct // Virtual "wave synthesizer" descriptor -{ - HMDIDRIVER mdi; // MIDI driver for use with synthesizer - HDIGDRIVER dig; // Digital driver for use with synthesizer - - WAVE_ENTRY *library; // Pointer to wave library - - AILEVENTCB prev_event_fn; // Previous MIDI event trap function - AILTIMBRECB prev_timb_fn; // Previous timbre request trap function - - CTRL_LOG controls; // MIDI controller states - - WAVE_ENTRY *wave [NUM_CHANS];// Pointer to WAVE_ENTRY for each channel - - HSAMPLE S [MAX_W_VOICES]; // List of HSAMPLE voices - S32 n_voices; // Actual # of voices allocated to synth - - S32 chan [MAX_W_VOICES]; // MIDI channel for each voice, or -1 - S32 note [MAX_W_VOICES]; // MIDI note number for voice - S32 root [MAX_W_VOICES]; // MIDI root note for voice - S32 rate [MAX_W_VOICES]; // Playback rate for voice - S32 vel [MAX_W_VOICES]; // MIDI note velocity for voice - U32 time [MAX_W_VOICES]; // Timestamp for voice - - U32 event; // Event counter for LRU timestamps -} -WAVE_SYNTH; - -typedef WAVE_SYNTH * HWAVESYNTH;// Handle to virtual wave synthesizer - - -// -// DIG_DRIVER list -// - -extern HDIGDRIVER DIG_first; - -// -// MDI_DRIVER list -// - -extern HMDIDRIVER MDI_first; - -// -// Miscellaneous system services -// - -#define FILE_READ_WITH_SIZE ((void*)(SINTa)-1) - - -typedef void * (AILCALLBACK *AILMEMALLOCCB)(UINTa size); -typedef void (AILCALLBACK *AILMEMFREECB)(void *); - -#define AIL_mem_alloc_lock_trk(size) AIL_mem_alloc_lock_info( size, __FILE__, __LINE__ ) -#define AIL_file_read_trk(file,dest) AIL_file_read_info( file, dest, __FILE__, __LINE__ ) -#define AIL_file_size_trk(file) AIL_file_size_info( file, __FILE__, __LINE__ ) - -//#define MSS_NONTRACKED -#ifdef MSS_NONTRACKED - DXDEC void * AILCALL AIL_mem_alloc_lock(UINTa size); - DXDEC void * AILCALL AIL_file_read(char const * filename, void * dest ); - DXDEC S32 AILCALL AIL_file_size(char const * filename ); -#else - #define AIL_mem_alloc_lock(size) AIL_mem_alloc_lock_trk(size) - #define AIL_file_read(file,dest) AIL_file_read_trk(file,dest) - #define AIL_file_size(file) AIL_file_size_trk(file) -#endif - -DXDEC void * AILCALL AIL_mem_alloc_lock_info(UINTa size, char const * file, U32 line); -DXDEC void AILCALL AIL_mem_free_lock (void *ptr); - - -DXDEC S32 AILCALL AIL_file_error (void); - -DXDEC S32 AILCALL AIL_file_size_info(char const *filename, - char const * caller, - U32 line); - -DXDEC void * AILCALL AIL_file_read_info(char const *filename, - void *dest, - char const * caller, - U32 line); - -DXDEC S32 AILCALL AIL_file_write (char const *filename, - void const *buf, - U32 len); - -DXDEC S32 AILCALL AIL_WAV_file_write - (char const *filename, - void const *buf, - U32 len, - S32 rate, - S32 format); - -DXDEC S32 AILCALL AIL_file_append (char const *filename, - void const *buf, U32 len); - -DXDEC AILMEMALLOCCB AILCALL AIL_mem_use_malloc(AILMEMALLOCCB fn); -DXDEC AILMEMFREECB AILCALL AIL_mem_use_free (AILMEMFREECB fn); - - -#define MSSBreakPoint RR_BREAK - - -// -// Compiler-independent CRTL helper functions for PS2 -// Exported here for use in demo programs as well as MSS itself -// - -#if defined(IS_PSP) - - DXDEC F32 AILCALL AIL_sin(F32 x); - DXDEC F32 AILCALL AIL_cos(F32 x); - DXDEC F32 AILCALL AIL_tan( F32 x ); - DXDEC F32 AILCALL AIL_acos(F32 x); - DXDEC F32 AILCALL AIL_atan(F32 x); - DXDEC F32 AILCALL AIL_ceil( F32 x ); - DXDEC F32 AILCALL AIL_floor( F32 x ); - DXDEC F32 AILCALL AIL_fsqrt( F32 x ); - DXDEC F32 AILCALL AIL_fabs ( F32 x ); - DXDEC F32 AILCALL AIL_log10( F32 x ); - DXDEC F32 AILCALL AIL_log( F32 x ); - DXDEC F32 AILCALL AIL_pow( F32 x, F32 p ); - DXDEC F32 AILCALL AIL_frexpf( F32 x, S32 *pw2 ); - DXDEC F32 AILCALL AIL_ldexpf( F32 x, S32 pw2 ); - #define AIL_exp(x) AIL_pow(2.718281828F,(x)) - -#else - - #ifdef IS_WATCOM - #define AIL_pow powf - #define AIL_tan tanf - #else - #define AIL_tan tan - #define AIL_pow pow - #endif - - #define AIL_sin sin - #define AIL_cos cos - #define AIL_acos acos - #define AIL_atan atan - #define AIL_ceil ceil - #define AIL_floor floor - - #if defined(IS_PS3) && !defined(IS_SPU) - DXDEC F32 AILCALL AIL_fsqrt( F32 val ); - #else - #define AIL_fsqrt(arg) ((F32) sqrt(arg)) - #endif - - #define AIL_fabs fabs - #define AIL_log10 log10 - #define AIL_log log - #define AIL_frexpf(a1,a2) ((F32) frexp(a1,a2)) - #define AIL_ldexpf(a1,a2) ((F32) ldexp(a1,a2)) - #define AIL_exp exp - -#endif - -// -// High-level support services -// - -DXDEC S32 AILCALL AIL_startup (void); - -DXDEC SINTa AILCALL AIL_get_preference (U32 number); - -DXDEC void AILCALL AIL_shutdown (void); - -DXDEC SINTa AILCALL AIL_set_preference (U32 number, - SINTa value); - -DXDEC char *AILCALL AIL_last_error (void); - -DXDEC void AILCALL AIL_set_error (char const * error_msg); - -#ifdef IS_WIIU -DXDEC void AILCALL AIL_set_wiiu_file_client (void* ptr_to_fsclient, void* ptr_to_fscmdblock); -#endif - -#ifdef __RADIPHONE__ -// -// On iOS, audio session interruptions stop the audio queues, and we have to manually restart them. -// -// This should be called whenever you get an Interruption Ended msg via your Audio Session callback. -// -DXDEC void AILCALL AIL_ios_post_audio_session_interrupt_end(HDIGDRIVER dig); -#endif - -// -// Low-level support services -// - -#ifdef IS_X86 - -DXDEC U32 AILCALL AIL_MMX_available (void); - -#endif - -#define AIL_lock AIL_lock_mutex -#define AIL_unlock AIL_unlock_mutex - -DXDEC void AILCALL AIL_lock_mutex (void); -DXDEC void AILCALL AIL_unlock_mutex (void); - -#define AIL_delay AIL_sleep -DXDEC void AILCALL AIL_sleep (U32 ms); - -DXDEC AILTRACECB AILCALL AIL_configure_logging (char const * filename, - AILTRACECB cb, - S32 level); - - -// -// Process services -// - -DXDEC HTIMER AILCALL AIL_register_timer (AILTIMERCB fn); - -DXDEC UINTa AILCALL AIL_set_timer_user (HTIMER timer, - UINTa user); - -DXDEC void AILCALL AIL_set_timer_period (HTIMER timer, - U32 microseconds); - -DXDEC void AILCALL AIL_set_timer_frequency (HTIMER timer, - U32 hertz); - -DXDEC void AILCALL AIL_set_timer_divisor (HTIMER timer, - U32 PIT_divisor); - -DXDEC void AILCALL AIL_start_timer (HTIMER timer); -DXDEC void AILCALL AIL_start_all_timers (void); - -DXDEC void AILCALL AIL_stop_timer (HTIMER timer); -DXDEC void AILCALL AIL_stop_all_timers (void); - -DXDEC void AILCALL AIL_release_timer_handle (HTIMER timer); -DXDEC void AILCALL AIL_release_all_timers (void); - -DXDEC S32 AILCALL AIL_timer_thread_handle(void* o_handle); - -#ifdef IS_MAC - #if defined(__PROCESSES__) - DXDEC ProcessSerialNumber AIL_Process(void); - #endif -#endif - -// -// high-level digital services -// - -#define AIL_OPEN_DIGITAL_FORCE_PREFERENCE 1 -#define AIL_OPEN_DIGITAL_NEED_HW_3D 2 -#define AIL_OPEN_DIGITAL_NEED_FULL_3D 4 -#define AIL_OPEN_DIGITAL_NEED_LIGHT_3D 8 -#define AIL_OPEN_DIGITAL_NEED_HW_REVERB 16 -#define AIL_OPEN_DIGITAL_NEED_REVERB 32 -#define AIL_OPEN_DIGITAL_USE_IOP_CORE0 64 - -#define AIL_OPEN_DIGITAL_USE_SPU0 (1<<24) -#define AIL_OPEN_DIGITAL_USE_SPU1 (2<<24) -#define AIL_OPEN_DIGITAL_USE_SPU2 (3<<24) -#define AIL_OPEN_DIGITAL_USE_SPU3 (4<<24) -#define AIL_OPEN_DIGITAL_USE_SPU4 (5<<24) -#define AIL_OPEN_DIGITAL_USE_SPU5 (6<<24) -#define AIL_OPEN_DIGITAL_USE_SPU6 (7<<24) - -#define AIL_OPEN_DIGITAL_USE_SPU( num ) ( ( num + 1 ) << 24 ) - -#ifdef IS_GENERICDIG - - struct _RadSoundSystem; - typedef S32 (*RADSS_OPEN_FUNC)(struct _RadSoundSystem* i_SoundSystem, U32 i_MinBufferSizeInMs, U32 i_Frequency, U32 i_ChannelCount, U32 i_MaxLockSize, U32 i_Flags); - - DXDEC HDIGDRIVER AILCALL AIL_open_generic_digital_driver(U32 frequency, S32 bits, S32 channel, U32 flags, RADSS_OPEN_FUNC dig_open); - - #ifdef IS_WIN32 - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_DSInstallDriver(UINTa, UINTa); - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_WOInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_DSInstallDriver(0, 0)) - - #elif defined(IS_3DS) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_3DSInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_3DSInstallDriver(0, 0)) - - #elif defined(__RADANDROID__) - - DXDEC void AILCALL AIL_set_asset_manager(void* asset_manager); - - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SLESInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SLESInstallDriver(0, 0)) - - - #elif defined(IS_PSP2) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSP2InstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSP2InstallDriver(0, 0)) - - #elif defined(__RADSEKRIT2__) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_SonyInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_SonyInstallDriver(0, 0)) - - #elif defined(IS_PSP) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_PSPInstallDriver(UINTa, UINTa); - - #define AIL_OPEN_DIGITAL_USE_SIMPLEAUDIO ~0U - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_PSPInstallDriver(0, 0)) - - #elif defined(IS_XENON) || defined(__RADWINRTAPI__) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_XAudio2InstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_XAudio2InstallDriver(0, 0)) - - #elif defined(IS_WIIU) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_AXInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_AXInstallDriver(0, 0)) - - #elif defined(IS_MAC) || defined(IS_IPHONE) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa); - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_CAInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_CAInstallDriver(0, 0)) - - #elif defined(IS_LINUX) - DXDEC RADSS_OPEN_FUNC AILCALL RADSS_OalInstallDriver(UINTa, UINTa); - - #define AIL_open_digital_driver(frequency, bits, channel, flags) \ - AIL_open_generic_digital_driver(frequency, bits, channel, flags, RADSS_OalInstallDriver(0, 0)) - #endif -#else // IS_GENERICDIG - -DXDEC HDIGDRIVER AILCALL AIL_open_digital_driver( U32 frequency, - S32 bits, - S32 channel, - U32 flags ); - -#endif // not IS_GENERICDIG - -DXDEC void AILCALL AIL_close_digital_driver( HDIGDRIVER dig ); - -#ifdef IS_LINUX - -#define AIL_MSS_version(str,len) \ -{ \ - strncpy(str, MSS_VERSION, len); \ -} - -DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - -DXDEC S32 AILCALL AIL_digital_handle_reacquire - (HDIGDRIVER drvr); -#elif defined( IS_WINDOWS ) - -#define AIL_MSS_version(str,len) \ -{ \ - HINSTANCE l=LoadLibrary(MSSDLLNAME); \ - if ((UINTa)l<=32) \ - *(str)=0; \ - else { \ - LoadString(l,1,str,len); \ - FreeLibrary(l); \ - } \ -} - -DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - -DXDEC S32 AILCALL AIL_digital_handle_reacquire - (HDIGDRIVER drvr); - -#elif defined( IS_MAC ) - -#if defined(__RESOURCES__) - - typedef MSS_STRUCT MSS_VersionType_ - { - Str255 version_name; - } MSS_VersionType; - - #define AIL_MSS_version(str,len) \ - { \ - long _res = HOpenResFile(0,0,"\p" MSSDLLNAME,fsRdPerm); \ - if (_res==-1) \ - { \ - str[0]=0; \ - } \ - else \ - { \ - Handle _H; \ - short _Err; \ - long _cur= CurResFile(); \ - UseResFile(_res); \ - _H = GetResource('vers', 2); \ - _Err = ResError(); \ - if((_Err != noErr) || (_H==0)) \ - { \ - str[0]=0; \ - UseResFile(_cur); \ - CloseResFile(_res); \ - } \ - else \ - { \ - if (GetHandleSize(_H)==0) \ - { \ - str[0]=0; \ - UseResFile(_cur); \ - CloseResFile(_res); \ - } \ - else \ - { \ - MSS_VersionType * _vt = (MSS_VersionType*)*_H; \ - if ((U32)_vt->version_name[6]>4) \ - _vt->version_name[6]-=4; \ - else \ - _vt->version_name[6]=0; \ - if (((U32)len) <= ((U32)_vt->version_name[6])) \ - _vt->version_name[6] = (U8)len-1; \ - memcpy( str, _vt->version_name+11, _vt->version_name[6] ); \ - str[_vt->version_name[6]]=0; \ - UseResFile(_cur); \ - CloseResFile(_res); \ - } \ - ReleaseResource(_H); \ - } \ - } \ - } - - #endif - - DXDEC S32 AILCALL AIL_digital_handle_release(HDIGDRIVER drvr); - - DXDEC S32 AILCALL AIL_digital_handle_reacquire - (HDIGDRIVER drvr); - -#endif - -DXDEC void AILCALL AIL_debug_log (char const * ifmt, ...); - -DXDEC S32 AILCALL AIL_sprintf(char *dest, - char const *fmt, ...); - -DXDEC char* AILCALL AIL_set_redist_directory(char const*dir); - -DXDEC S32 AILCALL AIL_background_CPU_percent (void); - -DXDEC S32 AILCALL AIL_digital_CPU_percent (HDIGDRIVER dig); - -#ifdef HOST_SPU_PROCESS -DXDEC S32 AILCALL AIL_digital_SPU_percent (HDIGDRIVER dig); -#endif - -DXDEC S32 AILCALL AIL_digital_latency (HDIGDRIVER dig); - -DXDEC HSAMPLE AILCALL AIL_allocate_sample_handle - (HDIGDRIVER dig); - - -EXPGROUP(Digital Audio Services) - -#define MILES_PUSH_REVERB 1 -#define MILES_PUSH_VOLUME 2 -#define MILES_PUSH_3D 4 -#define MILES_PUSH_RESET 8 - -DXDEC EXPAPI void AILCALL AIL_push_system_state(HDIGDRIVER dig, U32 flags, S16 crossfade_ms); -/* - Pushes the current system state, allowing for a temporary "clean" driver to use, and then - revert from. - - $:dig The driver to push - $:flags Logical "or" of options controlling the extent of the push. See discussion. - $:crossfade_ms The number of milliseconds to fade the transition over. [0, 32767] - - By default (ie flags == 0), effectively nothing happens. Since the operation neither affects - any subsystems nor resets the playing samples, a push immediately followed by a pop should - have no audible effects. - - However, any samples started during the push will be stopped (via $AIL_end_fade_sample) when the system is popped. - Streams will return SMP_DONE via $AIL_stream_status. It is up to the client code to perform any cleanup required. - - The flags can alter the above behavior in the following ways: - - $* MILES_PUSH_RESET - 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. - - $* MILES_PUSH_REVERB - 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. - - $* MILES_PUSH_3D - When present, 3d listener state will be affected in addition to sample state. - If MILES_PUSH_RESET is present, the 3d listener state will be reverted to the same state as a new driver. Otherwise - it will be retained and only affected when popped. - - $* MILES_PUSH_VOLUME - When present, master volume will be affected in addition to sample state. - If MILES_PUSH_RESET is present, the master volume will be set to 1.0f, otherwise it will be retained and only - affected when popped. - - $- - - If you want more control over whether a sample will be affected by a push or a pop operation, - see $AIL_set_sample_level_mask. - -*/ - -DXDEC EXPAPI void AILCALL AIL_pop_system_state(HDIGDRIVER dig, S16 crossfade_ms); -/* - Pops the current system state and returns the system to the way it - was before the last push. - - $:dig The driver to pop. - $:crossfade_ms The number of milliseconds to crossfade the transition over - [0, 32767] - - See $AIL_push_system_state for documentation. -*/ - -DXDEC EXPAPI U8 AILCALL AIL_system_state_level(HDIGDRIVER dig); -/* - Returns the current level the system has been pushed to. - - $:dig The driver to inspect - $:return A value between 0 and MILES_MAX_STATES, representing the depth of the current system stack. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_level_mask(HSAMPLE S, U8 mask); -/* - Sets the system levels at which a sample will play. - - $:S The sample to set the mask for. - $:mask The bitmask of levels for which the sample will play. - - Under normal push/pop operations, a sample's mask is set when it is - started to the level the system is at. If the system is pushed - without a reset, then the mask is adjusted to include the new level. - When a system is popped, if the sample is going to continue playing, - the state mask is adjusted to remove the level the system is popping - from. - - If you have a sample playing on a higher system level that needs - to continue after a pop, you can adjust the sample's mask by using - this function in conjunction with $AIL_system_state_level and - $AIL_sample_level_mask: - - ${ - AIL_set_sample_level_mask(S, AIL_sample_level_mask(S) |= (1 << (AIL_system_state_level(dig) - 1))); - $} -*/ - -DXDEC EXPAPI U8 AILCALL AIL_sample_level_mask(HSAMPLE S); -/* - Return the mask used to determine if the sample will play at a given system level. - - $:S The sample to inspect. - $:return The level mask for the sample. - - See $AIL_set_sample_level_mask. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_digital_mixed_samples(HDIGDRIVER dig); -/* - Returns the number of samples that have been mixed in to the hardware. - - Used for timing samples for start via $AIL_schedule_start_sample. -*/ - -#define AIL_digital_samples_per_second(dig) (dig->DMA_rate) - - -DXDEC EXPAPI void AILCALL AIL_enable_limiter(HDIGDRIVER dig, S32 on_off); -/* - Enables a basic limiter to prevent clipping. - - $:dig The driver to enable the limiter on. - $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled. - - By default limiters are off. Currently they are not configurable. They kick on around - -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to - the 16 bit clamp. - - See also $AIL_bus_enable_limiter. -*/ - -EXPGROUP(bus_section) - -DXDEC EXPAPI HSAMPLE AILCALL AIL_allocate_bus(HDIGDRIVER dig); -/* - Allocates a bus to mix samples to. - - $:dig The HDIGDRIVER to allocate the bus on. - $:return The HSAMPLE for the new bus. - - A bus allows you to treat a group of samples as one sample. With the bus sample you can - do almost all of the things you can do with a normal sample handle. The only exception - is you can't adjust the playback rate of the sample. - - Use $AIL_bus_sample_handle to get the HSAMPLE associated with a bus. - - Each call to AIL_allocate_bus adds a new bus, up to a total bus count of MAX_BUSSES. After - the first call, two busses exist - the main bus and the first aux bus. The HSAMPLE returned - is for the first aux bus (index 1) -*/ - -DXDEC EXPAPI void AILCALL AIL_bus_enable_limiter(HDIGDRIVER dig, S32 bus_index, S32 on_off); -/* - Enables a basic limiter to prevent clipping. - - $:dig The driver containing the bus to enable the limiter on. - $:bus_index The index of the bus to enable the limiter on. - $:on_off If non-zero, the limiter will be enabled, otherwise it will be disabled. - - By default limiters are off. Currently they are not configurable. They kick on around - -10 db, and with a 0db signal will attenuate by about -18 db. Limiters run prior to - the 16 bit clamp. - - See also $AIL_enable_limiter. -*/ - -DXDEC EXPAPI HSAMPLE AILCALL AIL_bus_sample_handle(HDIGDRIVER dig, S32 bus_index); -/* - Returns the HSAMPLE associated with a bus. - - $:dig The HDIGDRIVER the bus resides within. - $:bus_index The index of the bus to return the HSAMPLE for. - $:return The HSAMPLE for the bus index. - - If the bus has not been allocated, or no busses have been allocated, this returns 0. This - means that for the "Main Bus" - index 0 - it will still return zero if no additional busses - have been allocated. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_bus(HSAMPLE S, S32 bus_index); -/* - Assigns an HSAMPLE to a bus. - - $:S The HSAMPLE to assign. - $:bus_index The bus index to assign the sample to. - - If the given bus has not been allocated, this function has no effect. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_sample_bus(HSAMPLE S); -/* - Returns the bus an HSAMPLE is assigned to. - - $:S The HSAMPLE to check. - $:return The index of the bus the sample is assigned. - - All samples by default are assigned to bus 0. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); -/* - Installs the Compressor filter on to a bus, using another bus as the input for - compression/limiting. - - $:dig The driver the busses exist on. - $:bus_index The index of the bus the compressor will affect. - $:filter_stage The SAMPLESTAGE the compressor will use on the bus HSAMPLE. - $:input_bus_index The bus index the compressor will use as input. - - This installs a side chain compressor in to a given bus. It acts exactly like - any other filter you would put on an HSAMPLE, except the input_bus_index bus pipe's - its signal strength to the filter, allowing it to attenuate the bus_index bus based - on another bus's contents. - - To control the compressor parameters, access the bus's HSAMPLE via $AIL_bus_sample_handle and - use $AIL_sample_stage_property exactly as you would any other filter. The filter's properties - are documented under $(Compressor Filter) -*/ - -DXDEC void AILCALL AIL_set_speaker_configuration - (HDIGDRIVER dig, - MSSVECTOR3D *array, - S32 n_channels, - F32 falloff_power); - -DXDEC MSSVECTOR3D * - AILCALL AIL_speaker_configuration - (HDIGDRIVER dig, - S32 *n_physical_channels, - S32 *n_logical_channels, - F32 *falloff_power, - MSS_MC_SPEC *channel_spec); - -DXDEC void AILCALL AIL_set_listener_relative_receiver_array - (HDIGDRIVER dig, - MSS_RECEIVER_LIST *array, - S32 n_receivers); - -DXDEC MSS_RECEIVER_LIST * - AILCALL AIL_listener_relative_receiver_array - (HDIGDRIVER dig, - S32 *n_receivers); -DXDEC void AILCALL AIL_set_speaker_reverb_levels - (HDIGDRIVER dig, - F32 *wet_array, - F32 *dry_array, - MSS_SPEAKER const *speaker_index_array, - S32 n_levels); - -DXDEC S32 AILCALL AIL_speaker_reverb_levels (HDIGDRIVER dig, - F32 * *wet_array, - F32 * *dry_array, - MSS_SPEAKER const * *speaker_index_array); - - -DXDEC -void AILCALL AIL_set_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 const * levels, - S32 n_levels ); -DXDEC -void AILCALL AIL_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 * levels, - S32 n_levels ); - -DXDEC -S32 AILEXPORT AIL_set_sample_is_3D (HSAMPLE S, //) - S32 onoff); - -//DXDEC F32 AILEXPORT AIL_calculate_sample_final_attenuation(HSAMPLE S); -/* - Returns the attenuation that a sample will have. - - $:S Sample to compute. -*/ - -DXDEC -S32 AILEXPORT AIL_calculate_3D_channel_levels (HDIGDRIVER dig, //) - F32 *channel_levels, - MSS_SPEAKER const * *speaker_array, - MSSVECTOR3D *src_pos, - MSSVECTOR3D *src_face, - MSSVECTOR3D *src_up, - F32 src_inner_angle, - F32 src_outer_angle, - F32 src_outer_volume, - F32 src_max_dist, - F32 src_min_dist, - MSSVECTOR3D *listen_pos, - MSSVECTOR3D *listen_face, - MSSVECTOR3D *listen_up, - F32 rolloff_factor, - MSSVECTOR3D *doppler_velocity, - F32 *doppler_shift); - - -DXDEC void AILCALL AIL_release_sample_handle (HSAMPLE S); - -DXDEC S32 AILCALL AIL_init_sample (HSAMPLE S, - S32 format); - -DXDEC S32 AILCALL AIL_set_sample_file (HSAMPLE S, - void const *file_image, - S32 block); - -DXDEC S32 AILCALL AIL_set_sample_info (HSAMPLE S, - AILSOUNDINFO const * info); - -DXDEC S32 AILCALL AIL_set_named_sample_file (HSAMPLE S, - C8 const *file_type_suffix, - void const *file_image, - U32 file_size, - S32 block); - -DXDEC HPROVIDER AILCALL AIL_set_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage, - HPROVIDER provider); - -DXDEC HPROVIDER AILCALL AIL_set_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage, - HPROVIDER provider); - -DXDEC HPROVIDER AILCALL AIL_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage); - -DXDEC HPROVIDER AILCALL AIL_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage); - -DXDEC void AILCALL AIL_set_sample_adpcm_block_size - (HSAMPLE S, - U32 blocksize); - -DXDEC void AILCALL AIL_set_sample_address (HSAMPLE S, - void const *start, - U32 len); - -DXDEC void AILCALL AIL_start_sample (HSAMPLE S); - -EXPGROUP(Digital Audio Services) - -DXDEC EXPAPI void AILCALL AIL_schedule_start_sample(HSAMPLE S, U64 mix_time_to_start); -/* - Marks the specified sample to begin at the exact time specified. - - $:S The sample to start - $:mix_time_to_start The time to start the sample, in samples. - - Once set, the sample will have $AIL_start_sample called automatically - when the mixer reaches the specified time. The sample's delay will - be automatically adjusted such that the sample starts mid-block. - - ${ - // Get the current time. - U64 mix_time = AIL_digital_mixed_samples(dig); - - // Schedule to start 1 second out - mix_time += AIL_digital_samples_per_second(dig); - AIL_schedule_start_sample(S, mix_time ); - $} -*/ - -DXDEC EXPAPI U64 AILCALL AIL_sample_schedule_time(HSAMPLE S); -/* - Returns the mix time the sample is scheduled to start at, or 0 if not scheduled. - - $:S The sample to query. -*/ - -DXDEC void AILCALL AIL_stop_sample (HSAMPLE S); - -DXDEC void AILCALL AIL_end_fade_sample (HSAMPLE S); - -DXDEC void AILCALL AIL_resume_sample (HSAMPLE S); - -DXDEC void AILCALL AIL_end_sample (HSAMPLE S); - -DXDEC EXPAPI void AILCALL AIL_set_sample_id(HSAMPLE S, S32 id); -/* - Set an ID on a sample for use in synchronized control. - - $:S The sample to alter - $:id The id to use. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_sample_id(HSAMPLE S); -/* - Return the current ID for a sample. - - $:S Sample to access -*/ - -DXDEC EXPAPI void AILCALL AIL_start_sample_group(HDIGDRIVER dig, S32 start_id, S32 set_to_id); -/* - Start a group of samples at the same time. - - $:dig The driver the samples are allocated from. - $:start_id The ID to start - $:set_to_id The ID to set the samples to once they have started. - - This function atomically calls $AIL_start_sample on all the samples to ensure the samples start in sync. -*/ - -DXDEC EXPAPI void AILCALL AIL_stop_sample_group(HDIGDRIVER dig, S32 stop_id, S32 set_to_id); -/* - Stops a group of samples at the same time. - - $:dig The driver the samples are allocated from. - $:stop_id The ID to stop - $:set_to_id The ID to set the samples to once they have stopped. - - This function atomically calls $AIL_stop_sample on all the samples to ensure they stop at the same point. -*/ - -DXDEC EXPAPI void AILCALL AIL_resume_sample_group(HDIGDRIVER dig, S32 resume_id, S32 set_to_id); -/* - Resumes a group of samples at the same time. - - $:dig The driver the samples are allocated from. - $:resume_id The ID to resume - $:set_to_id The ID to set the samples to once they have resumed. - - This function atomically calls $AIL_resume_sample on all the samples to ensure the samples start in sync. -*/ - -DXDEC EXPAPI void AILCALL AIL_end_sample_group(HDIGDRIVER dig, S32 end_id); -/* - Ends a group of samples at the same time. - - $:dig The driver the samples are allocated from. - $:end_id The ID to end - - This function atomically calls $AIL_end_sample on all the samples. -*/ - -DXDEC void AILCALL AIL_set_sample_playback_rate - (HSAMPLE S, - S32 playback_rate); - -DXDEC void AILCALL AIL_set_sample_playback_rate_factor - (HSAMPLE S, - F32 playback_rate_factor); - -DXDEC void AILCALL AIL_set_sample_playback_delay - (HSAMPLE S, - S32 playback_delay); - -DXDEC void AILCALL AIL_set_sample_volume_pan (HSAMPLE S, - F32 volume, - F32 pan); - -DXDEC void AILCALL AIL_set_sample_volume_levels(HSAMPLE S, - F32 left_level, - F32 right_level); - -DXDEC void AILCALL AIL_set_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 const *levels, - S32 n_levels); - -DXDEC void AILCALL AIL_set_sample_reverb_levels(HSAMPLE S, - F32 dry_level, - F32 wet_level); - -DXDEC void AILCALL AIL_set_sample_low_pass_cut_off(HSAMPLE S, - S32 /*-1 or MSS_SPEAKER*/ channel, - F32 cut_off); - -DXDEC void AILCALL AIL_set_sample_loop_count (HSAMPLE S, - S32 loop_count); - -DXDEC void AILCALL AIL_set_sample_loop_block (HSAMPLE S, - S32 loop_start_offset, - S32 loop_end_offset); - -DXDEC EXPAPI S32 AILCALL AIL_set_sample_loop_samples(HSAMPLE S, S32 loop_start_samples, S32 loop_end_samples); -/* - Defines the loop points on a sample in samples rather than bytes. - - $:S The sample to alter. - $:loop_start_samples The sample count in to the file to start the looping. - $:loop_end_samples The sample count in the file to end the looping. - $:return 1 if successful, 0 otherwise. Check $AIL_last_error for details. - - For uncompressed samples, this largely reverts to $AIL_set_sample_loop_block, since the mapping - is straightforward. For compressed formats (like bink audio or mp3), looping in sample space is - non trivial and must be handled on a format-by-format basis. For the moment, only Bink Audio - supports this functionality - all other ASI formats will return failure. - - If a loop's length is too short, it may be extended. -*/ - - -DXDEC S32 AILCALL AIL_sample_loop_block (HSAMPLE S, - S32 *loop_start_offset, - S32 *loop_end_offset); - -DXDEC U32 AILCALL AIL_sample_status (HSAMPLE S); - -DXDEC U32 AILCALL AIL_sample_mixed_ms (HSAMPLE S); - -DXDEC S32 AILCALL AIL_sample_playback_rate (HSAMPLE S); - -DXDEC F32 AILCALL AIL_sample_playback_rate_factor (HSAMPLE S); - -DXDEC S32 AILCALL AIL_sample_playback_delay (HSAMPLE S); - -DXDEC void AILCALL AIL_sample_volume_pan (HSAMPLE S, F32* volume, F32* pan); - -DXDEC S32 AILCALL AIL_sample_channel_count (HSAMPLE S, U32 *mask); - -DXDEC void AILCALL AIL_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -DXDEC void AILCALL AIL_sample_volume_levels (HSAMPLE S, - F32 *left_level, - F32 *right_level); - -DXDEC void AILCALL AIL_sample_reverb_levels (HSAMPLE S, - F32 *dry_level, - F32 *wet_level); - -DXDEC F32 AILCALL AIL_sample_output_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -DXDEC F32 AILCALL AIL_sample_low_pass_cut_off(HSAMPLE S, S32 /*-1 or MSS_SPEAKER*/ channel); - -DXDEC S32 AILCALL AIL_sample_loop_count (HSAMPLE S); - -DXDEC void AILCALL AIL_set_digital_master_volume_level - (HDIGDRIVER dig, - F32 master_volume); - -DXDEC F32 AILCALL AIL_digital_master_volume_level (HDIGDRIVER dig); - -DXDEC void AILCALL AIL_set_sample_51_volume_pan( HSAMPLE S, - F32 volume, - F32 pan, - F32 fb_pan, - F32 center_level, - F32 sub_level ); - -DXDEC void AILCALL AIL_sample_51_volume_pan ( HSAMPLE S, - F32* volume, - F32* pan, - F32* fb_pan, - F32* center_level, - F32* sub_level ); - -DXDEC void AILCALL AIL_set_sample_51_volume_levels( HSAMPLE S, - F32 f_left_level, - F32 f_right_level, - F32 b_left_level, - F32 b_right_level, - F32 center_level, - F32 sub_level ); - -DXDEC void AILCALL AIL_sample_51_volume_levels ( HSAMPLE S, - F32* f_left_level, - F32* f_right_level, - F32* b_left_level, - F32* b_right_level, - F32* center_level, - F32* sub_level ); -DXDEC void AILCALL AIL_set_digital_master_reverb - (HDIGDRIVER dig, - S32 bus_index, - F32 reverb_decay_time, - F32 reverb_predelay, - F32 reverb_damping); - -DXDEC void AILCALL AIL_digital_master_reverb - (HDIGDRIVER dig, - S32 bus_index, - F32* reverb_time, - F32* reverb_predelay, - F32* reverb_damping); - -DXDEC void AILCALL AIL_set_digital_master_reverb_levels - (HDIGDRIVER dig, - S32 bus_index, - F32 dry_level, - F32 wet_level); - -DXDEC void AILCALL AIL_digital_master_reverb_levels - (HDIGDRIVER dig, - S32 bus_index, - F32 * dry_level, - F32 * wet_level); - - -// -// low-level digital services -// - -DXDEC S32 AILCALL AIL_minimum_sample_buffer_size(HDIGDRIVER dig, - S32 playback_rate, - S32 format); - -DXDEC S32 AILCALL AIL_set_sample_buffer_count (HSAMPLE S, - S32 n_buffers); - -DXDEC S32 AILCALL AIL_sample_loaded_len (HSAMPLE S); - -DXDEC S32 AILCALL AIL_sample_buffer_count (HSAMPLE S); - -DXDEC S32 AILCALL AIL_sample_buffer_available (HSAMPLE S); - -DXDEC S32 AILCALL AIL_load_sample_buffer (HSAMPLE S, - S32 buff_num, - void const *buffer, - U32 len); - -DXDEC void AILCALL AIL_request_EOB_ASI_reset (HSAMPLE S, - U32 buff_num, - S32 new_stream_position); - -DXDEC S32 AILCALL AIL_sample_buffer_info (HSAMPLE S, //) - S32 buff_num, - U32 *pos, - U32 *len, - S32 *head, - S32 *tail); - -DXDEC U32 AILCALL AIL_sample_granularity (HSAMPLE S); - -DXDEC void AILCALL AIL_set_sample_position (HSAMPLE S, - U32 pos); - -DXDEC U32 AILCALL AIL_sample_position (HSAMPLE S); - -DXDEC AILSAMPLECB AILCALL AIL_register_SOB_callback - (HSAMPLE S, - AILSAMPLECB SOB); - -DXDEC AILSAMPLECB AILCALL AIL_register_EOB_callback - (HSAMPLE S, - AILSAMPLECB EOB); - -DXDEC AILSAMPLECB AILCALL AIL_register_EOS_callback - (HSAMPLE S, - AILSAMPLECB EOS); - -DXDEC AILMIXERCB AILCALL AIL_register_mix_callback(HDIGDRIVER dig, AILMIXERCB mixcb); - -DXDEC AILFALLOFFCB AILCALL AIL_register_falloff_function_callback - (HSAMPLE S, - AILFALLOFFCB falloff_cb); - -DXDEC void AILCALL AIL_set_sample_user_data (HSAMPLE S, - U32 index, - SINTa value); - -DXDEC SINTa AILCALL AIL_sample_user_data (HSAMPLE S, - U32 index); - -DXDEC S32 AILCALL AIL_active_sample_count (HDIGDRIVER dig); - -DXDEC void AILCALL AIL_digital_configuration (HDIGDRIVER dig, - S32 *rate, - S32 *format, - char *string); - -DXDEC S32 AILCALL AIL_platform_property (void *object, - MSS_PLATFORM_PROPERTY property, - void *before_value, - void const *new_value, - void *after_value); - - -DXDEC void AILCALL AIL_set_sample_ms_position (HSAMPLE S, //) - S32 milliseconds); - -DXDEC U32 AILCALL AIL_sample_ms_lookup (HSAMPLE S, //) - S32 milliseconds, - S32* actualms); - -DXDEC void AILCALL AIL_sample_ms_position (HSAMPLE S, //) - S32 * total_milliseconds, - S32 * current_milliseconds); - -// -// Digital input services -// - -#if defined(IS_WINDOWS) - #define MSS_HAS_INPUT 1 -#elif defined(IS_MAC) - #define MSS_HAS_INPUT 1 -#else - #define MSS_HAS_INPUT 0 -#endif - -#if MSS_HAS_INPUT - -DXDEC HDIGINPUT AILCALL AIL_open_input (AIL_INPUT_INFO *info); - -DXDEC void AILCALL AIL_close_input (HDIGINPUT dig); - -DXDEC AIL_INPUT_INFO * - AILCALL AIL_get_input_info (HDIGINPUT dig); - -DXDEC S32 AILCALL AIL_set_input_state (HDIGINPUT dig, - S32 enable); -#endif - - -// -// High-level XMIDI services -// - -DXDEC HMDIDRIVER AILCALL AIL_open_XMIDI_driver( U32 flags ); - -#define AIL_OPEN_XMIDI_NULL_DRIVER 1 - -DXDEC void AILCALL AIL_close_XMIDI_driver( HMDIDRIVER mdi ); - -#if defined(IS_MAC) || defined(IS_LINUX) - -DXDEC S32 AILCALL AIL_MIDI_handle_release - (HMDIDRIVER mdi); - -DXDEC S32 AILCALL AIL_MIDI_handle_reacquire - (HMDIDRIVER mdi); - -#elif defined( IS_WINDOWS ) - -DXDEC S32 AILCALL AIL_midiOutOpen(HMDIDRIVER *drvr, - LPHMIDIOUT *lphMidiOut, - S32 dwDeviceID); - -DXDEC void AILCALL AIL_midiOutClose (HMDIDRIVER mdi); - -DXDEC S32 AILCALL AIL_MIDI_handle_release - (HMDIDRIVER mdi); - -DXDEC S32 AILCALL AIL_MIDI_handle_reacquire - (HMDIDRIVER mdi); - -#endif - -DXDEC HSEQUENCE AILCALL AIL_allocate_sequence_handle - (HMDIDRIVER mdi); - -DXDEC void AILCALL AIL_release_sequence_handle - (HSEQUENCE S); - -DXDEC S32 AILCALL AIL_init_sequence (HSEQUENCE S, - void const *start, - S32 sequence_num); - -DXDEC void AILCALL AIL_start_sequence (HSEQUENCE S); - -DXDEC void AILCALL AIL_stop_sequence (HSEQUENCE S); - -DXDEC void AILCALL AIL_resume_sequence (HSEQUENCE S); - -DXDEC void AILCALL AIL_end_sequence (HSEQUENCE S); - -DXDEC void AILCALL AIL_set_sequence_tempo (HSEQUENCE S, - S32 tempo, - S32 milliseconds); - -DXDEC void AILCALL AIL_set_sequence_volume (HSEQUENCE S, - S32 volume, - S32 milliseconds); - -DXDEC void AILCALL AIL_set_sequence_loop_count - (HSEQUENCE S, - S32 loop_count); - -DXDEC U32 AILCALL AIL_sequence_status (HSEQUENCE S); - -DXDEC S32 AILCALL AIL_sequence_tempo (HSEQUENCE S); - -DXDEC S32 AILCALL AIL_sequence_volume (HSEQUENCE S); - -DXDEC S32 AILCALL AIL_sequence_loop_count (HSEQUENCE S); - -DXDEC void AILCALL AIL_set_XMIDI_master_volume - (HMDIDRIVER mdi, - S32 master_volume); - -DXDEC S32 AILCALL AIL_XMIDI_master_volume (HMDIDRIVER mdi); - - -// -// Low-level XMIDI services -// - -DXDEC S32 AILCALL AIL_active_sequence_count (HMDIDRIVER mdi); - -DXDEC S32 AILCALL AIL_controller_value (HSEQUENCE S, - S32 channel, - S32 controller_num); - -DXDEC S32 AILCALL AIL_channel_notes (HSEQUENCE S, - S32 channel); - -DXDEC void AILCALL AIL_sequence_position (HSEQUENCE S, - S32 *beat, - S32 *measure); - -DXDEC void AILCALL AIL_branch_index (HSEQUENCE S, - U32 marker); - -DXDEC AILPREFIXCB AILCALL AIL_register_prefix_callback - (HSEQUENCE S, - AILPREFIXCB callback); - -DXDEC AILTRIGGERCB AILCALL AIL_register_trigger_callback - (HSEQUENCE S, - AILTRIGGERCB callback); - -DXDEC AILSEQUENCECB AILCALL AIL_register_sequence_callback - (HSEQUENCE S, - AILSEQUENCECB callback); - -DXDEC AILBEATCB AILCALL AIL_register_beat_callback (HSEQUENCE S, - AILBEATCB callback); - -DXDEC AILEVENTCB AILCALL AIL_register_event_callback (HMDIDRIVER mdi, - AILEVENTCB callback); - -DXDEC AILTIMBRECB AILCALL AIL_register_timbre_callback - (HMDIDRIVER mdi, - AILTIMBRECB callback); - -DXDEC void AILCALL AIL_set_sequence_user_data (HSEQUENCE S, - U32 index, - SINTa value); - -DXDEC SINTa AILCALL AIL_sequence_user_data (HSEQUENCE S, - U32 index); - -DXDEC void AILCALL AIL_register_ICA_array (HSEQUENCE S, - U8 *array); - -DXDEC S32 AILCALL AIL_lock_channel (HMDIDRIVER mdi); - -DXDEC void AILCALL AIL_release_channel (HMDIDRIVER mdi, - S32 channel); - -DXDEC void AILCALL AIL_map_sequence_channel (HSEQUENCE S, - S32 seq_channel, - S32 new_channel); - -DXDEC S32 AILCALL AIL_true_sequence_channel (HSEQUENCE S, - S32 seq_channel); - -DXDEC void AILCALL AIL_send_channel_voice_message - (HMDIDRIVER mdi, - HSEQUENCE S, - S32 status, - S32 data_1, - S32 data_2); - -DXDEC void AILCALL AIL_send_sysex_message (HMDIDRIVER mdi, - void const *buffer); - -DXDEC HWAVESYNTH - AILCALL AIL_create_wave_synthesizer (HDIGDRIVER dig, - HMDIDRIVER mdi, - void const *wave_lib, - S32 polyphony); - -DXDEC void AILCALL AIL_destroy_wave_synthesizer (HWAVESYNTH W); - -DXDEC void AILCALL AIL_set_sequence_ms_position (HSEQUENCE S, //) - S32 milliseconds); - -DXDEC void AILCALL AIL_sequence_ms_position(HSEQUENCE S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - - - -// -// red book functions -// - -#ifdef IS_WINDOWS - -#pragma pack(push, 1) - -typedef MSS_STRUCT _REDBOOK { - U32 DeviceID; - U32 paused; - U32 pausedsec; - U32 lastendsec; -} REDBOOK; - -#pragma pack(pop) - -typedef MSS_STRUCT _REDBOOK* HREDBOOK; - -#define REDBOOK_ERROR 0 -#define REDBOOK_PLAYING 1 -#define REDBOOK_PAUSED 2 -#define REDBOOK_STOPPED 3 - - -DXDEC HREDBOOK AILCALL AIL_redbook_open(U32 which); - -DXDEC HREDBOOK AILCALL AIL_redbook_open_drive(S32 drive); - -DXDEC void AILCALL AIL_redbook_close(HREDBOOK hand); - -DXDEC void AILCALL AIL_redbook_eject(HREDBOOK hand); - -DXDEC void AILCALL AIL_redbook_retract(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_status(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_tracks(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_track(HREDBOOK hand); - -DXDEC void AILCALL AIL_redbook_track_info(HREDBOOK hand,U32 tracknum, - U32* startmsec,U32* endmsec); - -DXDEC U32 AILCALL AIL_redbook_id(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_position(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_play(HREDBOOK hand,U32 startmsec, U32 endmsec); - -DXDEC U32 AILCALL AIL_redbook_stop(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_pause(HREDBOOK hand); - -DXDEC U32 AILCALL AIL_redbook_resume(HREDBOOK hand); - -DXDEC F32 AILCALL AIL_redbook_volume_level(HREDBOOK hand); - -DXDEC F32 AILCALL AIL_redbook_set_volume_level(HREDBOOK hand, F32 volume); - -#endif - -DXDEC U32 AILCALL AIL_ms_count(void); -DXDEC U32 AILCALL AIL_us_count(void); -DXDEC U64 AILCALL AIL_ms_count64(void); -DXDEC U64 AILCALL AIL_us_count64(void); -DXDEC U64 AILCALL AIL_get_time(void); -DXDEC U64 AILCALL AIL_time_to_ms(U64 time); -DXDEC U64 AILCALL AIL_ms_to_time(U64 ms); - -DXDEC void AILCALL MilesUseTelemetry( void * context ); -DXDEC void AILCALL MilesUseTmLite( void* context ); - -// -// -// - -#define MSSIO_FLAGS_DONT_CLOSE_HANDLE 1 -#define MSSIO_FLAGS_QUERY_SIZE_ONLY 2 -#define MSSIO_FLAGS_DONT_USE_OFFSET 4 - -#define MSSIO_STATUS_COMPLETE 1 -#define MSSIO_STATUS_ERROR_FAILED_OPEN 0x1003 -#define MSSIO_STATUS_ERROR_FAILED_READ 0x1004 -#define MSSIO_STATUS_ERROR_SHUTDOWN 0x1005 -#define MSSIO_STATUS_ERROR_CANCELLED 0x1006 -#define MSSIO_STATUS_ERROR_MEMORY_ALLOC_FAIL 0x1007 -#define MSSIO_STATUS_ERROR_MASK 0x1000 - -// returns percent full (1.0 = 100%) -typedef F32 (AILCALLBACK *MilesAsyncStreamCallback)(void* i_User); - -struct MilesAsyncRead -{ - char FileName[256]; - U64 Offset; - S64 Count; - void* Buffer; - void* StreamUserData; - MilesAsyncStreamCallback StreamCB; - char const * caller; - U32 caller_line; - UINTa FileHandle; - S32 Flags; - S32 ReadAmt; // current read amt. - S32 AdditionalBuffer; - S32 volatile Status; // This is only valid after a call to MilesAsyncFileWait or MilesAsyncFileCancel has succeeded. - char Internal[48+128]; -}; - -DXDEC S32 AILCALL MilesAsyncFileRead(struct MilesAsyncRead* i_Request); -DXDEC S32 AILCALL MilesAsyncFileCancel(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed. -DXDEC S32 AILCALL MilesAsyncFileStatus(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded. -DXDEC S32 AILCALL MilesAsyncStartup(); -DXDEC S32 AILCALL MilesAsyncShutdown(); -DXDEC S32 AILCALL AIL_IO_thread_handle(void* o_Handle); -DXDEC void AILCALL MilesAsyncSetPaused(S32 i_IsPaused); - -typedef S32 (AILCALLBACK * MilesAsyncFileRead_callback)(struct MilesAsyncRead* i_Request); -typedef S32 (AILCALLBACK * MilesAsyncFileCancel_callback)(struct MilesAsyncRead* i_Request); // 1 if the request has completed, 0 otherwise. Use Wait if needed. -typedef S32 (AILCALLBACK * MilesAsyncFileStatus_callback)(struct MilesAsyncRead* i_Request, U32 i_MS); // 1 if complete, 0 if timeout exceeded. -typedef S32 (AILCALLBACK * MilesAsyncStartup_callback)(); -typedef S32 (AILCALLBACK * MilesAsyncShutdown_callback)(); -typedef void (AILCALLBACK * MilesAsyncSetPaused_callback)(S32 i_IsPaused); -typedef S32 (AILCALLBACK * AIL_IO_thread_handle_callback)(void* o_Handle); - -DXDEC void AILCALL AIL_set_async_callbacks( - MilesAsyncFileRead_callback read, - MilesAsyncFileCancel_callback cancel, - MilesAsyncFileStatus_callback status, - MilesAsyncStartup_callback startup, - MilesAsyncShutdown_callback shutdown, - MilesAsyncSetPaused_callback setpaused, - AIL_IO_thread_handle_callback threadhandle); - -// -// -// - -typedef struct _STREAM* HSTREAM; // Handle to stream - -typedef void (AILCALLBACK* AILSTREAMCB) (HSTREAM stream); - -#define MSS_STREAM_CHUNKS 8 - -typedef struct _STREAM -{ - S32 block_oriented; // 1 if this is an ADPCM or ASI-compressed stream - S32 using_ASI; // 1 if using ASI decoder to uncompress stream data - ASISTAGE *ASI; // handy pointer to our ASI coded - - HSAMPLE samp; // the sample handle - - UINTa fileh; // the open file handle - - U8* bufs[MSS_STREAM_CHUNKS]; // the data buffers - S32 reset_ASI[MSS_STREAM_CHUNKS]; // should we reset the ASI at the end of the buffer? - S32 reset_seek_pos[MSS_STREAM_CHUNKS]; // new stream position after reset - S32 bufstart[MSS_STREAM_CHUNKS]; // offset of where this buffer started - S32 loadedsizes[MSS_STREAM_CHUNKS]; // sizes of the data to be started - - struct MilesAsyncRead asyncs[MSS_STREAM_CHUNKS]; - S32 asyncs_loaded[MSS_STREAM_CHUNKS]; // 0=unloaded, 1=loading, 2=loaded, but not started - S32 next_read_offset; // offset to pass to the next read, so the seek occurs internally. -1 to not seek. - - S32 into_Miles_index; // index of buffer that we will async into next - S32 read_IO_index; // index of buffer to be loaded into Miles next - - S32 bufsize; // size of each buffer - - U32 datarate; // datarate in bytes per second - S32 filerate; // original datarate of the file - S32 filetype; // file format type - U32 filemask; // channel mask for stream file - S32 totallen; // total length of the sound data - - S32 substart; // subblock loop start - S32 sublen; // subblock loop len - - U32 blocksize; // ADPCM block size - - S32 loadedsome; // have we done any loads? - - U32 startpos; // point that the sound data begins - U32 async_pos; // position if the last async completed - - U32 loopsleft; // how many loops are left - - U32 error; // read error has occurred - - S32 preload; // preload the file into the first buffer - U32 preloadpos; // position to use in preload - U32 noback; // no background processing - S32 alldone; // alldone - S32 primeamount; // amount to load after a seek - S32 primeleft; // amount to read before starting - - S32 playcontrol; // control: 0=stopped, 1=started, |8=paused, |16=sample paused - - AILSTREAMCB callback; // end of stream callback - - SINTa user_data[8]; // Miscellaneous user data - void* next; // pointer to next stream - - S32 autostreaming; // are we autostreaming this stream - - F32 level; // io percent full - F32 last_level; // old io percent - F32 percent_mult; // factor to scale by - S32 stream_count; // unique number of the stream - - S32 docallback; // set when it time to poll for a callback - - S32 was_popped; // set to 1 if the stream needs to be freed due to a system push/pop - causes SMP_DONE to be stream_status -} MSTREAM_TYPE; - - -DXDEC HSTREAM AILCALL AIL_open_stream(HDIGDRIVER dig, char const * filename, S32 stream_mem); - -DXDEC void AILCALL AIL_close_stream(HSTREAM stream); - -DXDEC HSAMPLE AILCALL AIL_stream_sample_handle(HSTREAM stream); - -DXDEC S32 AILCALL AIL_service_stream(HSTREAM stream, S32 fillup); - -DXDEC void AILCALL AIL_start_stream(HSTREAM stream); - -DXDEC void AILCALL AIL_pause_stream(HSTREAM stream, S32 onoff); - -DXDEC S32 AILCALL AIL_stream_loop_count(HSTREAM stream); - -DXDEC void AILCALL AIL_set_stream_loop_count(HSTREAM stream, S32 count); - -DXDEC void AILCALL AIL_set_stream_loop_block (HSTREAM S, - S32 loop_start_offset, - S32 loop_end_offset); - -DXDEC S32 AILCALL AIL_stream_status(HSTREAM stream); - -DXDEC F32 AILCALL AIL_stream_filled_percent(HSTREAM stream); - -DXDEC void AILCALL AIL_set_stream_position(HSTREAM stream,S32 offset); - -DXDEC S32 AILCALL AIL_stream_position(HSTREAM stream); - -DXDEC void AILCALL AIL_stream_info(HSTREAM stream, S32* datarate, S32* sndtype, S32* length, S32* memory); - -DXDEC AILSTREAMCB AILCALL AIL_register_stream_callback(HSTREAM stream, AILSTREAMCB callback); - -DXDEC void AILCALL AIL_auto_service_stream(HSTREAM stream, S32 onoff); - -DXDEC void AILCALL AIL_set_stream_user_data (HSTREAM S, - U32 index, - SINTa value); - -DXDEC SINTa AILCALL AIL_stream_user_data (HSTREAM S, - U32 index); - -DXDEC void AILCALL AIL_set_stream_ms_position (HSTREAM S, - S32 milliseconds); - -DXDEC void AILCALL AIL_stream_ms_position (HSTREAM S, //) - S32 * total_milliseconds, - S32 * current_milliseconds); - -//! \todo MSS_FILE not needed anymore? -typedef char MSS_FILE; - -typedef U32 (AILCALLBACK*AIL_file_open_callback) (MSS_FILE const* Filename, - UINTa* FileHandle); - -typedef void (AILCALLBACK*AIL_file_close_callback) (UINTa FileHandle); - -#define AIL_FILE_SEEK_BEGIN 0 -#define AIL_FILE_SEEK_CURRENT 1 -#define AIL_FILE_SEEK_END 2 - -typedef S32 (AILCALLBACK*AIL_file_seek_callback) (UINTa FileHandle, - S32 Offset, - U32 Type); - -typedef U32 (AILCALLBACK*AIL_file_read_callback) (UINTa FileHandle, - void* Buffer, - U32 Bytes); - -DXDEC void AILCALL AIL_set_file_callbacks (AIL_file_open_callback opencb, - AIL_file_close_callback closecb, - AIL_file_seek_callback seekcb, - AIL_file_read_callback readcb); - -DXDEC void AILCALL AIL_file_callbacks(AIL_file_open_callback* opencb, - AIL_file_close_callback* closecb, - AIL_file_seek_callback* seekcb, - AIL_file_read_callback* readcb); - -#ifdef IS_32 - -typedef void* (AILCALLBACK *AIL_file_async_read_callback) (UINTa FileHandle, - void* Buffer, - U32 Bytes); - -typedef S32 (AILCALLBACK*AIL_file_async_status_callback) (void* async, - S32 wait, - U32* BytesRead); - -DXDEC void AILCALL AIL_set_file_async_callbacks (AIL_file_open_callback opencb, - AIL_file_close_callback closecb, - AIL_file_seek_callback seekcb, - AIL_file_async_read_callback areadcb, - AIL_file_async_status_callback statuscb); - -#endif - -// -// High-level DLS functions -// - -typedef struct _DLSFILEID { - SINTa id; - struct _DLSFILEID* next; -} DLSFILEID; - -typedef struct _DLSFILEID* HDLSFILEID; - -typedef struct _DLSDEVICE { - VOIDFUNC* pGetPref; - VOIDFUNC* pSetPref; - VOIDFUNC* pMSSOpen; - VOIDFUNC* pOpen; - VOIDFUNC* pClose; - VOIDFUNC* pLoadFile; - VOIDFUNC* pLoadMem; - VOIDFUNC* pUnloadFile; - VOIDFUNC* pUnloadAll; - VOIDFUNC* pGetInfo; - VOIDFUNC* pCompact; - VOIDFUNC* pSetAttr; - SINTa DLSHandle; - U32 format; - U32 buffer_size; - void* buffer[2]; - HSAMPLE sample; - HMDIDRIVER mdi; - HDIGDRIVER dig; - HDLSFILEID first; -#if defined(__RADNT__) - - #ifdef MSS_STATIC_RIB - #error "Bad defines - can't have a static rib on NT" - #endif - HMODULE lib; -#elif defined(MSS_STATIC_RIB) - char* DOSname; -#endif -} DLSDEVICE; - -typedef struct _DLSDEVICE* HDLSDEVICE; - -typedef struct _AILDLSINFO { - char Description[128]; - S32 MaxDLSMemory; - S32 CurrentDLSMemory; - S32 LargestSize; - S32 GMAvailable; - S32 GMBankSize; -} AILDLSINFO; - -#ifdef MSS_STATIC_RIB - -typedef struct _AILSTATICDLS { - char* description; - VOIDFUNC* pDLSOpen; - VOIDFUNC* pMSSOpen; - VOIDFUNC* pOpen; - VOIDFUNC* pClose; - VOIDFUNC* pLoadFile; - VOIDFUNC* pLoadMem; - VOIDFUNC* pUnloadFile; - VOIDFUNC* pUnloadAll; - VOIDFUNC* pGetInfo; - VOIDFUNC* pCompact; - VOIDFUNC* pSetAttr; -} AILSTATICDLS; - -#endif // MSS_STATIC_RIB - - -DXDEC HDLSDEVICE AILCALL AIL_DLS_open(HMDIDRIVER mdi, HDIGDRIVER dig, -#ifdef MSS_STATIC_RIB - AILSTATICDLS const * staticdls, -#elif defined(__RADNT__) - char const * libname, -#endif - U32 flags, U32 rate, S32 bits, S32 channels); - -// -// Parameters for the dwFlag used in DLSClose() and flags in AIL_DLS_close -// - -#define RETAIN_DLS_COLLECTION 0x00000001 -#define RETURN_TO_BOOTUP_STATE 0x00000002 -#define RETURN_TO_GM_ONLY_STATE 0x00000004 -#define DLS_COMPACT_MEMORY 0x00000008 - -DXDEC void AILCALL AIL_DLS_close(HDLSDEVICE dls, U32 flags); - -DXDEC HDLSFILEID AILCALL AIL_DLS_load_file(HDLSDEVICE dls, char const* filename, U32 flags); - -DXDEC HDLSFILEID AILCALL AIL_DLS_load_memory(HDLSDEVICE dls, void const* memfile, U32 flags); - -// -// other parameters for AIL_DLS_unload -// - -#define AIL_DLS_UNLOAD_MINE 0 -#define AIL_DLS_UNLOAD_ALL ((HDLSFILEID)(UINTa)(SINTa)-1) - -DXDEC void AILCALL AIL_DLS_unload(HDLSDEVICE dls, HDLSFILEID dlsid); - -DXDEC void AILCALL AIL_DLS_compact(HDLSDEVICE dls); - -DXDEC void AILCALL AIL_DLS_get_info(HDLSDEVICE dls, AILDLSINFO* info, S32* PercentCPU); - -DXDEC HSAMPLE AILCALL AIL_DLS_sample_handle(HDLSDEVICE dls); - - -// -// Quick-integration service functions and data types -// - -typedef struct -{ - U32 const *data; - S32 size; - S32 type; - void *handle; - S32 status; - void* next; - S32 speed; - F32 volume; - F32 extravol; - F32 dry; - F32 wet; - F32 cutoff; - HDLSFILEID dlsid; - void* dlsmem; - void* dlsmemunc; - S32 milliseconds; - S32 length; - SINTa userdata; -} -AUDIO_TYPE; - - -#define QSTAT_DONE 1 // Data has finished playing -#define QSTAT_LOADED 2 // Data has been loaded, but not yet played -#define QSTAT_PLAYING 3 // Data is currently playing - -typedef AUDIO_TYPE * HAUDIO; // Generic handle to any audio data type - -#define AIL_QUICK_USE_WAVEOUT 2 -#define AIL_QUICK_MIDI_AND_DLS 2 -#define AIL_QUICK_DLS_ONLY 3 -#define AIL_QUICK_MIDI_AND_VORTEX_DLS 4 -#define AIL_QUICK_MIDI_AND_SONICVIBES_DLS 5 - -DXDEC S32 AILCALL - AIL_quick_startup ( - S32 use_digital, - S32 use_MIDI, - U32 output_rate, - S32 output_bits, - S32 output_channels); - -DXDEC void AILCALL AIL_quick_shutdown (void); - -DXDEC void AILCALL AIL_quick_handles (HDIGDRIVER* pdig, - HMDIDRIVER* pmdi, - HDLSDEVICE* pdls ); - -DXDEC HAUDIO AILCALL AIL_quick_load (char const *filename); - -DXDEC HAUDIO AILCALL AIL_quick_load_mem (void const *mem, - U32 size); - -DXDEC HAUDIO AILCALL AIL_quick_load_named_mem (void const *mem, - char const *filename, - U32 size); - -DXDEC HAUDIO AILCALL AIL_quick_copy (HAUDIO audio); - -DXDEC void AILCALL AIL_quick_unload (HAUDIO audio); - -DXDEC S32 AILCALL AIL_quick_play (HAUDIO audio, - U32 loop_count); - -DXDEC void AILCALL AIL_quick_halt (HAUDIO audio); - -DXDEC S32 AILCALL AIL_quick_status (HAUDIO audio); - -DXDEC HAUDIO AILCALL AIL_quick_load_and_play (char const *filename, - U32 loop_count, - S32 wait_request); - -DXDEC void AILCALL AIL_quick_set_speed (HAUDIO audio, S32 speed); - -DXDEC void AILCALL AIL_quick_set_volume (HAUDIO audio, F32 volume, F32 extravol); - -DXDEC void AILCALL AIL_quick_set_reverb_levels (HAUDIO audio, - F32 dry_level, - F32 wet_level); - -DXDEC void AILCALL AIL_quick_set_low_pass_cut_off(HAUDIO S, - S32 channel, - F32 cut_off); - -DXDEC void AILCALL AIL_quick_set_ms_position(HAUDIO audio,S32 milliseconds); - -DXDEC S32 AILCALL AIL_quick_ms_position(HAUDIO audio); - -DXDEC S32 AILCALL AIL_quick_ms_length(HAUDIO audio); - - -#define AIL_QUICK_XMIDI_TYPE 1 -#define AIL_QUICK_DIGITAL_TYPE 2 -#define AIL_QUICK_DLS_XMIDI_TYPE 3 -#define AIL_QUICK_MPEG_DIGITAL_TYPE 4 -#define AIL_QUICK_OGG_VORBIS_TYPE 5 -#define AIL_QUICK_V12_VOICE_TYPE 6 -#define AIL_QUICK_V24_VOICE_TYPE 7 -#define AIL_QUICK_V29_VOICE_TYPE 8 -#define AIL_QUICK_OGG_SPEEX_TYPE 9 -#define AIL_QUICK_S8_VOICE_TYPE 10 -#define AIL_QUICK_S16_VOICE_TYPE 11 -#define AIL_QUICK_S32_VOICE_TYPE 12 -#define AIL_QUICK_BINKA_TYPE 13 - -DXDEC S32 AILCALL AIL_quick_type(HAUDIO audio); - -DXDEC S32 AILCALL AIL_WAV_info(void const* WAV_image, AILSOUNDINFO* info); - -DXDEC S32 AILCALL AIL_WAV_marker_count(void const *WAV_image); - -DXDEC S32 AILCALL AIL_WAV_marker_by_index(void const *WAV_image, S32 n, C8 const **name); - -DXDEC S32 AILCALL AIL_WAV_marker_by_name(void const *WAV_image, C8 *name); - -DXDEC S32 AILCALL AIL_size_processed_digital_audio( - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO const * src); - -DXDEC S32 AILCALL AIL_process_digital_audio( - void *dest_buffer, - S32 dest_buffer_size, - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO* src); - -#define AIL_LENGTHY_INIT 0 -#define AIL_LENGTHY_SET_PROPERTY 1 -#define AIL_LENGTHY_UPDATE 2 -#define AIL_LENGTHY_DONE 3 - -typedef S32 (AILCALLBACK* AILLENGTHYCB)(U32 state,UINTa user); - -typedef S32 (AILCALLBACK* AILCODECSETPROP)(char const* property,void const * value); - -DXDEC S32 AILCALL AIL_compress_ASI(AILSOUNDINFO const * info, //) - char const* filename_ext, - void** outdata, - U32* outsize, - AILLENGTHYCB callback); - -DXDEC S32 AILCALL AIL_decompress_ASI(void const* indata, //) - U32 insize, - char const* filename_ext, - void** wav, - U32* wavsize, - AILLENGTHYCB callback); - -DXDEC S32 AILCALL AIL_compress_ADPCM(AILSOUNDINFO const * info, - void** outdata, U32* outsize); - -DXDEC S32 AILCALL AIL_decompress_ADPCM(AILSOUNDINFO const * info, - void** outdata, U32* outsize); - -DXDEC S32 AILCALL AIL_compress_DLS(void const* dls, - char const* compression_extension, - void** mls, U32* mlssize, - AILLENGTHYCB callback); - -DXDEC S32 AILCALL AIL_merge_DLS_with_XMI(void const* xmi, void const* dls, - void** mss, U32* msssize); - -DXDEC S32 AILCALL AIL_extract_DLS( void const *source_image, //) - U32 source_size, - void * *XMI_output_data, - U32 *XMI_output_size, - void * *DLS_output_data, - U32 *DLS_output_size, - AILLENGTHYCB callback); - -#define AILFILTERDLS_USINGLIST 1 - -DXDEC S32 AILCALL AIL_filter_DLS_with_XMI(void const* xmi, void const* dls, - void** dlsout, U32* dlssize, - S32 flags, AILLENGTHYCB callback); - -#define AILMIDITOXMI_USINGLIST 1 -#define AILMIDITOXMI_TOLERANT 2 - -DXDEC S32 AILCALL AIL_MIDI_to_XMI (void const* MIDI, - U32 MIDI_size, - void* *XMIDI, - U32 * XMIDI_size, - S32 flags); - -#define AILDLSLIST_ARTICULATION 1 -#define AILDLSLIST_DUMP_WAVS 2 - -#if defined(IS_WIN32) || defined(IS_MAC) || defined(IS_LINUX) - -DXDEC S32 AILCALL AIL_list_DLS (void const* DLS, - char** lst, - U32 * lst_size, - S32 flags, - C8 * title); - -#define AILMIDILIST_ROLANDSYSEX 1 -#define AILMIDILIST_ROLANDUN 2 -#define AILMIDILIST_ROLANDAB 4 - -DXDEC S32 AILCALL AIL_list_MIDI (void const* MIDI, - U32 MIDI_size, - char** lst, - U32 * lst_size, - S32 flags); -#endif - -#define AILFILETYPE_UNKNOWN 0 -#define AILFILETYPE_PCM_WAV 1 -#define AILFILETYPE_ADPCM_WAV 2 -#define AILFILETYPE_OTHER_WAV 3 -#define AILFILETYPE_VOC 4 -#define AILFILETYPE_MIDI 5 -#define AILFILETYPE_XMIDI 6 -#define AILFILETYPE_XMIDI_DLS 7 -#define AILFILETYPE_XMIDI_MLS 8 -#define AILFILETYPE_DLS 9 -#define AILFILETYPE_MLS 10 -#define AILFILETYPE_MPEG_L1_AUDIO 11 -#define AILFILETYPE_MPEG_L2_AUDIO 12 -#define AILFILETYPE_MPEG_L3_AUDIO 13 -#define AILFILETYPE_OTHER_ASI_WAV 14 -#define AILFILETYPE_XBOX_ADPCM_WAV 15 -#define AILFILETYPE_OGG_VORBIS 16 -#define AILFILETYPE_V12_VOICE 17 -#define AILFILETYPE_V24_VOICE 18 -#define AILFILETYPE_V29_VOICE 19 -#define AILFILETYPE_OGG_SPEEX 20 -#define AILFILETYPE_S8_VOICE 21 -#define AILFILETYPE_S16_VOICE 22 -#define AILFILETYPE_S32_VOICE 23 -#define AILFILETYPE_BINKA 24 - -DXDEC S32 AILCALL AIL_file_type(void const* data, U32 size); - -DXDEC S32 AILCALL AIL_file_type_named(void const* data, char const* filename, U32 size); - -DXDEC S32 AILCALL AIL_find_DLS (void const* data, U32 size, - void** xmi, U32* xmisize, - void** dls, U32* dlssize); -typedef struct -{ - // - // File-level data accessible to app - // - // This is valid after AIL_inspect_MP3() is called (even if the file contains no valid frames) - // - - U8 *MP3_file_image; // Original MP3_file_image pointer passed to AIL_inspect_MP3() - S32 MP3_image_size; // Original MP3_image_size passed to AIL_inspect_MP3() - - U8 *ID3v2; // ID3v2 tag, if not NULL - S32 ID3v2_size; // Size of tag in bytes - - U8 *ID3v1; // ID3v1 tag, if not NULL (always 128 bytes long if present) - - U8 *start_MP3_data; // Pointer to start of data area in file (not necessarily first valid frame) - U8 *end_MP3_data; // Pointer to last valid byte in MP3 data area (before ID3v1 tag, if any) - - // - // Information about current frame being inspected, valid if AIL_enumerate_MP3_frames() returns - // TRUE - // - - S32 sample_rate; // Sample rate in Hz (normally constant across all frames in file) - S32 bit_rate; // Bits/second for current frame - S32 channels_per_sample; // 1 or 2 - S32 samples_per_frame; // Always 576 or 1152 samples in each MP3 frame, depending on rate - - S32 byte_offset; // Offset of frame from start_MP3_data (i.e., suitable for use as loop point) - S32 next_frame_expected; // Anticipated offset of next frame to be enumerated, if any - S32 average_frame_size; // Average source bytes per frame, determined solely by bit rate and sample rate - S32 data_size; // # of data-only bytes in this particular frame - S32 header_size; // 4 or 6 bytes, depending on CRC - S32 side_info_size; // Valid for layer 3 side info only - S32 ngr; // Always 2 for MPEG1, else 1 - S32 main_data_begin; // Always 0 in files with no bit reservoir - S32 hpos; // Current bit position in header/side buffer - - S32 MPEG1; // Data copied directly from frame header, see ISO docs for info... - S32 MPEG25; - S32 layer; - S32 protection_bit; - S32 bitrate_index; - S32 sampling_frequency; - S32 padding_bit; - S32 private_bit; - S32 mode; - S32 mode_extension; - S32 copyright; - S32 original; - S32 emphasis; - - // - // LAME/Xing info tag data - // - - S32 Xing_valid; - S32 Info_valid; - U32 header_flags; - S32 frame_count; - S32 byte_count; - S32 VBR_scale; - U8 TOC[100]; - S32 enc_delay; - S32 enc_padding; - - // - // Private (undocumented) data used during frame enumeration - // - - U8 *ptr; - S32 bytes_left; - - S32 check_valid; - S32 check_MPEG1; - S32 check_MPEG25; - S32 check_layer; - S32 check_protection_bit; - S32 check_sampling_frequency; - S32 check_mode; - S32 check_copyright; - S32 check_original; -} -MP3_INFO; - -DXDEC void AILCALL AIL_inspect_MP3 (MP3_INFO *inspection_state, - U8 *MP3_file_image, - S32 MP3_image_size); - -DXDEC S32 AILCALL AIL_enumerate_MP3_frames (MP3_INFO *inspection_state); - -typedef struct -{ - // - // File-level data accessible to app - // - // This is valid after AIL_inspect_Ogg() is called (even if the file contains no valid pages) - // - - U8 *Ogg_file_image; // Originally passed to AIL_inspect_Ogg() - S32 Ogg_image_size; // Originally passed to AIL_inspect_Ogg() - - U8 *start_Ogg_data; // Pointer to start of data area in file - U8 *end_Ogg_data; // Pointer to last valid byte in data area - - // Information lifted from the header after AIL_inspect_Ogg() is called. - S32 channel_count; - S32 sample_rate; - - // - // Information about current page being inspected, valid if AIL_enumerate_Ogg_pages() returns - // TRUE - // - - S32 page_num; // 32-bit page sequence number from OggS header at byte offset 16 - - S32 sample_count; // Total # of samples already generated by encoder at the time the current page was written - - S32 byte_offset; // Offset of page from start_Ogg_data (i.e., suitable for use as loop point) - S32 next_page_expected; // Anticipated offset of next page to be enumerated, if any - - // - // Private (undocumented) data used during page enumeration - // - - U8 *ptr; - S32 bytes_left; -} -OGG_INFO; - -DXDEC void AILCALL AIL_inspect_Ogg (OGG_INFO *inspection_state, - U8 *Ogg_file_image, - S32 Ogg_file_size); - -DXDEC S32 AILCALL AIL_enumerate_Ogg_pages (OGG_INFO *inspection_state); - -typedef struct -{ - const char* file_image; - S32 image_size; - - S32 channel_count; - S32 sample_rate; - - S32 total_samples; - S32 samples_per_frame; - - const char* current_frame; - - // output data - byte offset for current frame. - S32 byte_offset; -} BINKA_INFO; - -DXDEC U32 AILCALL AIL_inspect_BinkA(BINKA_INFO* state, char const* file_image, S32 file_size); -DXDEC S32 AILCALL AIL_enumerate_BinkA_frames(BINKA_INFO* state); - -// -// RAD room types - currently the same as EAX -// - -enum -{ - ENVIRONMENT_GENERIC, // factory default - ENVIRONMENT_PADDEDCELL, - ENVIRONMENT_ROOM, // standard environments - ENVIRONMENT_BATHROOM, - ENVIRONMENT_LIVINGROOM, - ENVIRONMENT_STONEROOM, - ENVIRONMENT_AUDITORIUM, - ENVIRONMENT_CONCERTHALL, - ENVIRONMENT_CAVE, - ENVIRONMENT_ARENA, - ENVIRONMENT_HANGAR, - ENVIRONMENT_CARPETEDHALLWAY, - ENVIRONMENT_HALLWAY, - ENVIRONMENT_STONECORRIDOR, - ENVIRONMENT_ALLEY, - ENVIRONMENT_FOREST, - ENVIRONMENT_CITY, - ENVIRONMENT_MOUNTAINS, - ENVIRONMENT_QUARRY, - ENVIRONMENT_PLAIN, - ENVIRONMENT_PARKINGLOT, - ENVIRONMENT_SEWERPIPE, - ENVIRONMENT_UNDERWATER, - ENVIRONMENT_DRUGGED, - ENVIRONMENT_DIZZY, - ENVIRONMENT_PSYCHOTIC, - - ENVIRONMENT_COUNT // total number of environments -}; - -// -// enumerated values for EAX -// - -#ifndef EAX_H_INCLUDED - -enum -{ - EAX_ENVIRONMENT_GENERIC, // factory default - EAX_ENVIRONMENT_PADDEDCELL, - EAX_ENVIRONMENT_ROOM, // standard environments - EAX_ENVIRONMENT_BATHROOM, - EAX_ENVIRONMENT_LIVINGROOM, - EAX_ENVIRONMENT_STONEROOM, - EAX_ENVIRONMENT_AUDITORIUM, - EAX_ENVIRONMENT_CONCERTHALL, - EAX_ENVIRONMENT_CAVE, - EAX_ENVIRONMENT_ARENA, - EAX_ENVIRONMENT_HANGAR, - EAX_ENVIRONMENT_CARPETEDHALLWAY, - EAX_ENVIRONMENT_HALLWAY, - EAX_ENVIRONMENT_STONECORRIDOR, - EAX_ENVIRONMENT_ALLEY, - EAX_ENVIRONMENT_FOREST, - EAX_ENVIRONMENT_CITY, - EAX_ENVIRONMENT_MOUNTAINS, - EAX_ENVIRONMENT_QUARRY, - EAX_ENVIRONMENT_PLAIN, - EAX_ENVIRONMENT_PARKINGLOT, - EAX_ENVIRONMENT_SEWERPIPE, - EAX_ENVIRONMENT_UNDERWATER, - EAX_ENVIRONMENT_DRUGGED, - EAX_ENVIRONMENT_DIZZY, - EAX_ENVIRONMENT_PSYCHOTIC, - - EAX_ENVIRONMENT_COUNT // total number of environments -}; - -#define EAX_REVERBMIX_USEDISTANCE (-1.0F) - -#endif - -#define MSS_BUFFER_HEAD (-1) - -// -// Auxiliary 2D interface calls -// - -DXDEC HDIGDRIVER AILCALL AIL_primary_digital_driver (HDIGDRIVER new_primary); - -// -// 3D-related calls -// - -DXDEC S32 AILCALL AIL_room_type (HDIGDRIVER dig, - S32 bus_index); - -DXDEC void AILCALL AIL_set_room_type (HDIGDRIVER dig, - S32 bus_index, - S32 room_type); - -DXDEC F32 AILCALL AIL_3D_rolloff_factor (HDIGDRIVER dig); - -DXDEC void AILCALL AIL_set_3D_rolloff_factor (HDIGDRIVER dig, - F32 factor); - -DXDEC F32 AILCALL AIL_3D_doppler_factor (HDIGDRIVER dig); - -DXDEC void AILCALL AIL_set_3D_doppler_factor (HDIGDRIVER dig, - F32 factor); - -DXDEC F32 AILCALL AIL_3D_distance_factor (HDIGDRIVER dig); - -DXDEC void AILCALL AIL_set_3D_distance_factor (HDIGDRIVER dig, - F32 factor); - -DXDEC void AILCALL AIL_set_sample_obstruction (HSAMPLE S, - F32 obstruction); - -DXDEC void AILCALL AIL_set_sample_occlusion (HSAMPLE S, - F32 occlusion); - -DXDEC void AILCALL AIL_set_sample_exclusion (HSAMPLE S, - F32 exclusion); - -DXDEC F32 AILCALL AIL_sample_obstruction (HSAMPLE S); - -DXDEC F32 AILCALL AIL_sample_occlusion (HSAMPLE S); - -DXDEC F32 AILCALL AIL_sample_exclusion (HSAMPLE S); - -EXPGROUP(3D Digital Audio Services) - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_volume_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -/* - Sets a sample's volume falloff graph. - - $:S Sample to affect - $:graph The array of points to use as the graph. - $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - - This marks a sample as having a volume falloff graph. If a sample has a volume graph, it no - longer attenuates as per the default falloff function, and as such, its "minimum distance" no - longer has any effect. However, the "max distance" still clamps the sample to full attenuation. - - A graph with only one point is treated as a line, returning graph[0].Y always. - - Otherwise, the graph is evaluated as follows: - - - - The distance to the listener is evaluated. - - The two points with X values bounding "distance" are located. - - If the distance is past the last graph point, graph[pointcount-1].Y is returned. - - If either the output tangent type of the previous point, or the input tangent type of the next point are - MILES_TANGENT_STEP, previous->Y is returned. - - Otherwise, the segment is evaluated as a hermite curve. ITX and ITY are ignore if ITYpe is MILES_TANGENT_LINEAR, - and likewise OTX and OTY are ignored if OType is MILES_TANGENT_LINEAR. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_lowpass_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -/* - Sets a sample's low pass cutoff falloff graph. - - $:S Sample to affect - $:graph The array of points to use as the graph. - $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - - This marks a sample as having a low pass cutoff that varies as a function of distance to the listener. If - a sample has such a graph, $AIL_set_sample_low_pass_cut_off will be called constantly, and thus shouldn't be - called otherwise. - - The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_exclusion_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -/* - Sets a sample's exclusion falloff graph. - - $:S Sample to affect - $:graph The array of points to use as the graph. - $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - - This marks a sample as having an exclusion that varies as a function of distance to the listener. If - a sample has such a graph, auto_3D_wet_atten will be disabled to prevent double affects, as exclusion - affects reverb wet level. - - The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread_falloff(HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -/* - Sets a sample's spread falloff graph. - - $:S Sample to affect - $:graph The array of points to use as the graph. - $:pointcount The number of points passed in. Must be less than or equal to MILES_MAX_FALLOFF_GRAPH_POINTS. Passing 0 removes the graph. - - This marks a sample as having a spread that varies as a function of distance to the listener. See - $AIL_set_sample_3D_spread. - - The graph is evaluated the same as $AIL_set_sample_3D_volume_falloff. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_position_segments(HSAMPLE S, MSSVECTOR3D* points, S32 point_count); -/* - Sets a sample's position as a series of line segments. - - $:S Sample to affect - $:points The 3D points representing the line segments. 0 reverts to classic point based positioning. All - segments are connected - N points represents N - 1 chained line segments. - $:point_count Size of points array. Minimum 2 (unless removing), max MILES_MAX_SEGMENT_COUNT - - This marks a sample as having a position that is not a single point. When 3D attenuation is computed, - the closest point to the listener is found by walking each segment. That position is then used in all - other computations (cones, falloffs, etc). Spatialization is done using all segments as a directional - source. - - If there is neither spread falloff nor volume falloff specified, spread will be automatically applied - when the listener is within min_distance to the closest point. See $AIL_set_sample_3D_spread_falloff - and $AIL_set_sample_3D_volume_falloff. - -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sample_3D_spread(HSAMPLE S, F32 spread); -/* - Sets a sample's "spread" value. - - $:S Sample to affect. - $:spread The value to set the spread to. - - Spread is how much the directionality of a sample "spreads" to more speakers - emulating - the effect a sound has when it occupies more than a point source. For instance, a sound - point source that sits directly to the left of the listener would have a very strong left - speaker signal, and a fairly weak right speaker signal. Via spread, the signal would be - more even, causing the source to feel as though it is coming from an area, rather than - a point source. - - A spread of 1 will effectively negate any spatialization effects other than distance attenuation. -*/ - -DXDEC void AILCALL AIL_set_sample_3D_distances (HSAMPLE S, - F32 max_dist, - F32 min_dist, - S32 auto_3D_wet_atten); - - -DXDEC void AILCALL AIL_sample_3D_distances (HSAMPLE S, - F32 * max_dist, - F32 * min_dist, - S32 * auto_3D_wet_atten); - -DXDEC void AILCALL AIL_set_sample_3D_cone (HSAMPLE S, - F32 inner_angle, - F32 outer_angle, - F32 outer_volume_level); - -DXDEC void AILCALL AIL_sample_3D_cone (HSAMPLE S, - F32* inner_angle, - F32* outer_angle, - F32* outer_volume_level); - -DXDEC void AILCALL AIL_set_sample_3D_position (HSAMPLE obj, - F32 X, - F32 Y, - F32 Z); - -DXDEC void AILCALL AIL_set_sample_3D_velocity (HSAMPLE obj, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -DXDEC void AILCALL AIL_set_sample_3D_velocity_vector (HSAMPLE obj, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -DXDEC void AILCALL AIL_set_sample_3D_orientation (HSAMPLE obj, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -DXDEC S32 AILCALL AIL_sample_3D_position (HSAMPLE obj, - F32 *X, - F32 *Y, - F32 *Z); - -DXDEC void AILCALL AIL_sample_3D_velocity (HSAMPLE obj, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -DXDEC void AILCALL AIL_sample_3D_orientation (HSAMPLE obj, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -DXDEC void AILCALL AIL_update_sample_3D_position (HSAMPLE obj, - F32 dt_milliseconds); - -DXDEC void AILCALL AIL_set_listener_3D_position (HDIGDRIVER dig, - F32 X, - F32 Y, - F32 Z); - -DXDEC void AILCALL AIL_set_listener_3D_velocity (HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -DXDEC void AILCALL AIL_set_listener_3D_velocity_vector (HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -DXDEC void AILCALL AIL_set_listener_3D_orientation (HDIGDRIVER dig, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -DXDEC void AILCALL AIL_listener_3D_position (HDIGDRIVER dig, - F32 *X, - F32 *Y, - F32 *Z); - -DXDEC void AILCALL AIL_listener_3D_velocity (HDIGDRIVER dig, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -DXDEC void AILCALL AIL_listener_3D_orientation (HDIGDRIVER dig, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -DXDEC void AILCALL AIL_update_listener_3D_position (HDIGDRIVER dig, - F32 dt_milliseconds); - -#if defined( HOST_SPU_PROCESS ) - -DXDEC S32 AILCALL MilesStartAsyncThread( S32 thread_num, void const * param ); - -DXDEC S32 AILCALL MilesRequestStopAsyncThread( S32 thread_num ); - -DXDEC S32 AILCALL MilesWaitStopAsyncThread( S32 thread_num ); - -#endif - - -//----------------------------------------------------------------------------- -// -// MSS 8 Bank API -// -//----------------------------------------------------------------------------- - -EXPGROUP(Miles High Level Event System) - -// misc character maxes. -#define MSS_MAX_ASSET_NAME_BYTES 512 -#define MSS_MAX_PATH_BYTES 512 - -#ifdef DOCS_ONLY - -EXPTYPE typedef struct MSSSOUNDBANK {}; -/* - Internal structure. - - Use $HMSOUNDBANK instead. -*/ - -#endif - -EXPTYPE typedef struct SoundBank *HMSOUNDBANK; -/* - Describes a handle to an open sound bank. - - This handle typedef refers to an open soundbank which is usually obtained from the $AIL_add_soundbank function. -*/ - -EXPGROUP(highlevel_util) - -DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_open_soundbank(char const *filename, char const* name); -/* - Open a sound bank. If you are using the event execution engine, use the add soundbank function - provided there. - - $:return 0 on fail, or a valid HMSOUNDBANK. - $:filename The filename of the soundbank to open. - - Opens a sound bank for use with the MSS8 high level functions. The sound bank must be - closed with $AIL_close_soundbank. Use $AIL_add_soundbank if the Miles Event system is used. -*/ - -DXDEC EXPAPI void AILCALL AIL_close_soundbank(HMSOUNDBANK bank); -/* - Close a soundbank previously opened with $AIL_open_soundbank. - - $:bank Soundbank to close. - - Close a soundbank previously opened with $AIL_open_soundbank. Presets/events loaded from - this soundbank are no longer valid. -*/ - -DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_filename(HMSOUNDBANK bank); -/* - Return the filename used to open the given soundbank. - - $:bank Soundbank to query. - - $:return A pointer to the filename for the given soundbank, or 0 if bank is invalid. - - Returns a pointer to the filename for a soundbank. This pointer should not be deleted. -*/ - -DXDEC EXPAPI char const * AILCALL AIL_get_soundbank_name(HMSOUNDBANK bank); -/* - Return the name of the given soundbank. - - $:bank Soundbank to query. - - $:return A pointer to the name of the sound bank, or 0 if the bank is invalid. - - The name of the bank is the name used in asset names. This is distinct from the - file name of the bank. - - The return value should not be deleted. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_get_soundbank_mem_usage(HMSOUNDBANK bank); -/* - Returns the amount of data used by the soundbank management structures. - - $:bank Soundbank to query. - $:return Total memory allocated. - - Returns the memory used via AIL_mem_alloc_lock during the creation of this structure. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name); -/* - Enumerate the sound presets stored in a soundbank. - - $:bank Containing soundbank. - $:next Enumeration token. Prior to first call, initialize to MSS_FIRST - $:list Optional filter. If specified, presets will only enumerate from the given preset sound preset list. - $:name The pointer to the currently enumerated preset name. This should not be deleted. - - $:return Returns 0 when enumeration is complete. - - Enumerates the sound presets available inside of a bank file. Example usage: - - ${ - HMSSENUM Token = MSS_FIRST; - const char* PresetName = 0; - while (AIL_enumerate_sound_presets(MyBank, &Token, 0, &PresetName)) - { - printf("Found a preset named %s!", PresetName); - - $AIL_apply_sound_preset(MySample, MyBank, PresetName); - } - $} - - Note that name should NOT be deleted by the caller - this points at memory owned by - Miles. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_environment_presets(HMSOUNDBANK bank, HMSSENUM* next, char const* list, char const** name); -/* - Enumerate the environment presets stored in a soundbank. - - $:bank Containing soundbank. - $:next Enumeration token. Prior to first call, initialize to MSS_FIRST - $:list Optional filter. If specified, presets will only enumerate from the given environment preset list. - $:name The pointer to the currently enumerated preset name. This should not be deleted. - $:return Returns 0 when enumeration is complete. - - Enumerates the environment presets available inside of a bank file. Example usage: - - ${ - HMSSENUM Token = MSS_FIRST; - const char* PresetName = 0; - while (AIL_enumerate_environment_presets(MyBank, &Token, 0, &PresetName)) - { - printf("Found a preset named %s!", PresetName); - - AIL_apply_environment_preset(MyDriver, MyBank, PresetName); - } - $} - - Note that name should NOT be deleted by the caller - this points at memory owned by - Miles. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_assets(HMSOUNDBANK bank, HMSSENUM* next, char const** name); -/* - Enumerate sounds stored in a soundbank. - - $:bank Containing soundbank. - $:next Enumeration token. Prior to first call, initialize to MSS_FIRST - $:name The pointer to the currently enumerated sound name. This should not be deleted. - $:return Returns 0 when enumeration is complete. - - Enumerates the sounds available inside of a bank file. Example usage: - - ${ - HMSSENUM Token = MSS_FIRST; - const char* SoundName = 0; - while (AIL_enumerate_sound_assets(MyBank, &Token, &SoundName)) - { - char filename[MSS_MAX_PATH_BYTES]; - AIL_sound_asset_filename(MyBank, SoundName, filename); - - printf("Found a sound named %s!", SoundName); - - S32* pData = (S32*)AIL_file_read(filename, FILE_READ_WITH_SIZE); - AIL_mem_free_lock(pData); - } - $} - - Note that name should NOT be deleted by the caller - this points at memory owned by - Miles. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_events(HMSOUNDBANK bank, HMSSENUM* next, char const * list, char const ** name); -/* - Enumerate the events stored in a soundbank. - - $:bank Soundbank to enumerate within. - $:next Enumeration token. Prior to first call, initialize to MSS_FIRST - $:list Optional filter. If specified, event will only enumerate from the given event list. - $:name The pointer to the currently enumerated preset name. This should not be deleted. - $:return Returns 0 when enumeration is complete. - - Enumerates the events available inside of a bank file. Example usage: - - ${ - HMSSENUM Token = MSS_FIRST; - const char* EventName = 0; - while (AIL_enumerate_events(MyBank, &Token, 0, &EventName)) - { - printf("Found an event named %s!", EventName); - - const U8* EventContents = 0; - AIL_get_event_contents(MyBank, EventName, &EventContents); - - AIL_enqueue_event(EventContents, 0, 0, 0, 0); - } - $} - - Note that name should NOT be deleted by the caller - this points at memory owned by - Miles. -*/ - -DXDEC EXPAPI void* AILCALL AIL_find_environment_preset(HMSOUNDBANK bank, char const *name); -/* - Returns the raw environment data associated with the given name. - - $:bank The bank to look within - $:name The name of the asset to search for, including bank name. - - $:return Raw environment data. This should not be deleted. - - This function is designed to be used with $AIL_apply_raw_environment_preset. -*/ - -DXDEC EXPAPI void* AILCALL AIL_find_sound_preset(HMSOUNDBANK bank, char const* name); -/* - Returns the raw preset data associated with the given name. - - $:bank The bank to look within - $:name The name of the asset to search for, including bank name. - - $:return Raw preset data. This should not be deleted. - - This function is designed to be used with $AIL_apply_raw_sound_preset. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_apply_raw_sound_preset(HSAMPLE sample, void* preset); -/* - Applies the sound preset to the given sample. - - $:sample The sample to modify. - $:preset The raw preset data to apply, returned from $AIL_find_sound_preset - - Updates sample properties based on the desired settings specified in the given preset. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_apply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name); -/* - Apply the sound preset to the given sample. - - $:sample The sample that will have its properties updated by the preset. - $:bank The sound bank containing the named preset. - $:name The name of the preset to apply. - $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. - - This will alter the properties on a given sample, based on the given preset. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_sound_preset(HSAMPLE sample, void* preset); -/* - Returns the properties altered by the preset to their default state. - - $:sample The sample to update. - $:preset The raw preset data to unapply, returned from $AIL_find_sound_preset -*/ - -DXDEC EXPAPI S32 AILCALL AIL_unapply_sound_preset(HSAMPLE sample, HMSOUNDBANK bank, char const *name); -/* - Restore the properties affected by the given preset to defaults. - - $:sample The sample that will have its properties updated by the preset. - $:bank The sound bank containing the named preset. - $:name The name of the preset to apply. - $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. - - Presets may or may not affect any given property. Only the properties affected by the specified - preset will have their values restored to default. -*/ - -typedef S32 (*MilesResolveFunc)(void* context, char const* exp, S32 explen, EXPOUT void* output, S32 isfloat); -/* - Callback type for resolving variable expressions to values. - - $:context Value passed to AIL_resolve_raw_*_preset(). - $:exp The string expression to resolve. - $:explen Length of exp. - $:output Pointer to the memory to receive the result value. - $:isfloat nonzero if the output needs to be a float. - - The function callback should convert variable expressions in to an output value of the - requested type. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_sound_preset(void* preset, void* context, MilesResolveFunc eval); -/* - Compute the value of properties for the current value of variables using the given lookup function. - - $:preset The raw preset as returns from $AIL_find_sound_preset. - $:context The context to pass in to the resolution function. - $:eval A function pointer to use for resolving expressions to values. - $:return 0 if the preset is invalid. - - This function converts variable expressions that were stored in the preset in to values - that can be used by the event system. The values are stored in the preset itself, all that - has to happen is this is called with a valid resolve function prior to calling - $AIL_apply_raw_sound_preset. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_resolve_raw_environment_preset(void* env, MilesResolveFunc eval); -/* - Compute the value of properties for the current value of variables using the given lookup function. - - $:env The raw preset as returns from $AIL_find_environment_preset. - $:context The context to pass in to the resolution function. - $:eval A function pointer to use for resolving expressions to values. - $:return 0 if the preset is invalid. - - This function converts variable expressions that were stored in the environment in to values - that can be used by the event system. The values are stored in the environment itself, all that - has to happen is this is called with a valid resolve function prior to calling - $AIL_apply_raw_environment_preset. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_apply_raw_environment_preset(HDIGDRIVER dig, void* environment); -/* - Applies the environment to the given driver. - - $:dig The driver to modify. - $:environment The raw environment data to apply, returned from $AIL_find_environment_preset - - Updates driver properties based on the desired settings specified in the given environment. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_apply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name); -/* - Apply the environment preset to the given driver. - - $:dig The driver that will have its properties updated by the preset. - $:bank The sound bank containing the named preset. - $:name The name of the preset to apply. - $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. - - This will alter properties on a given driver, based on the given preset. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_unapply_raw_environment_preset(HDIGDRIVER dig, void* environment); -/* - Returns the properties the environment affects to default state. - - $:dig The driver to modify. - $:environment The raw environment data to unapply, returned from $AIL_find_environment_preset -*/ - -DXDEC EXPAPI S32 AILCALL AIL_unapply_environment_preset(HDIGDRIVER dig, HMSOUNDBANK bank, char const *name); -/* - Restore the properties affected by the given preset to defaults. - - $:dig The driver that will have its properties updated by the preset. - $:bank The sound bank containing the named preset. - $:name The name of the preset to apply. - $:return Returns 0 on fail - check for sample/bank validity, and that the preset is in the correct bank. - - Presets may or may not affect any given property. Only the properties affected by the specified - preset will have its value restored to default. -*/ - -EXPTYPE typedef struct _MILESBANKSOUNDINFO -{ - // If this changes at all, compiled banks must be versioned... - S32 ChannelCount; - U32 ChannelMask; - S32 Rate; - S32 DataLen; - S32 SoundLimit; - S32 IsExternal; - U32 DurationMs; - S32 StreamBufferSize; - S32 IsAdpcm; - S32 AdpcmBlockSize; - F32 MixVolumeDAC; -} MILESBANKSOUNDINFO; -/* - Structure containing all metadata associated with a sound asset. - - $:ChannelCount The number of channels the sound assets contains. - $:ChannelMask The channel mask for the sound asset. - $:Rate The sample rate for the sound asset. - $:DataLen The byte count the asset requires if fully loaded. - $:SoundLimit The maximum number of instances of this sound that is allowed to play at once. - $:IsExternal Nonzero if the sound is stored external to the sound bank. See the eventexternal sample. - $:DurationMs The length of the sound asset, in milliseconds. - $:StreamBufferSize If the sound is played as a stream, this is the buffer to use for this sound. - $:IsAdpcm Nonzero if the asset is an adpcm sound, and needs to be initialized as such. - $:AdpcmBlockSize The adpcm block size if the asset is adpcm encoded. - $:MixVolumeDAC The attenuation to apply to all instances of this sound, as a DAC scalar. - - See $AIL_sound_asset_info. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_sound_asset_info(HMSOUNDBANK bank, char const* name, char* out_name, MILESBANKSOUNDINFO* out_info); -/* - Return the meta data associated with a sound assets in a sound bank. - - $:bank The soundbank containing the sound asset. - $:name The name of the sound asset to find. - $:out_name Optional - Pointer to a buffer that is filled with the sound filename to use for loading. - $:out_info Pointer to a $MILESBANKSOUNDINFO structure that is filled with meta data about the sound asset. - $:return Returns the byte size of the buffer required for out_name. - - This function must be called in order to resolve the sound asset name to - something that can be used by miles. To ensure safe buffer containment, call - once with out_name as null to get the size needed. - - For external deployment see the eventexternal example program. -*/ - -DXDEC EXPAPI SINTa AILCALL AIL_get_marker_list(HMSOUNDBANK bank, char const* sound_name); -/* - Return an opaque value representing the list of markers attached to a given sound name. - - $:bank The bank containing the sound asset. - $:sound_name The name of the sound asset. - - $:return on fail/nonexistent list, or a nonzero opaque value to be passed to $AIL_find_marker_in_list. - - Returns the marker list for a given sound asset. This value should just be passed directly to $AIL_find_marker_in_list - to retrieve the offset for a marker by name. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_find_marker_in_list(SINTa marker_list, char const * marker_name, S32* is_samples); -/* - Returns the byte offset into a sample corresponding to the given marker name. - - $:marker_list The marker list returned from $AIL_get_marker_list. - $:marker_name The name of the marker to look up. - $:is_samples returns whether the marker is at a sample location instead of a byte location. - - $:return -1 if the marker was not found, or the byte offset of the marker. - - Looks up an offset to use in functions such as $AIL_set_sample_position. marker_list can be retrieved with - $AIL_get_marker_list. -*/ - -// ---------------------------- -// End MSS8 declarations -// ---------------------------- - -// -// Event routines -// -typedef struct _MEMDUMP* HMEMDUMP; -#define HMSSEVENTCONSTRUCT HMEMDUMP - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_create_event", "Creates an empty event to be filled with steps." - - ReturnType = "HMSSEVENTCONSTRUCT", "An empty event to be passed to the various step addition functions, or 0 if out of memory." - - Discussion = "Primarily designed for offline use, this function is the first step in - creating an event that can be consumed by the MilesEvent system. Usage is as follows: - - HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); - - // misc add functions - AIL_add_start_sound_event_step(hEvent, ...); - AIL_add_control_sounds_event_step(hEvent, ...); - // etc - - char* pEvent = AIL_close_event(hEvent); - - // Do something with the event - - AIL_mem_free_lock(pEvent); - - Note that if immediately passed to AIL_enqueue_event(), the memory must remain valid until the following - $AIL_complete_event_queue_processing. - - Events are generally tailored to the MilesEvent system, even though there is nothing preventing you - from writing your own event system, or creation ui. - " - } -*/ -DXDEC HMSSEVENTCONSTRUCT AILCALL AIL_create_event(void); - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_close_event", "Returns a completed event, ready for enqueueing in to the MilesEvent system." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to complete." - - ReturnType = "char*", "An allocated event string that can be passed to AIL_next_event_step or enqueued in the - MilesEvent system via AIL_enqueue_event." - - Discussion = "The returned pointer must be deleted via AIL_mem_free_lock(). Note that if the MilesEvent system - is used, the event pointer must remain valid through the following $AIL_complete_event_queue_processing call." - - } -*/ -DXDEC U8* AILCALL AIL_close_event(HMSSEVENTCONSTRUCT i_Event); - -EXPTYPEBEGIN typedef S32 MILES_START_STEP_EVICTION_TYPE; -#define MILES_START_STEP_PRIORITY 0 -#define MILES_START_STEP_DISTANCE 1 -#define MILES_START_STEP_VOLUME 2 -#define MILES_START_STEP_OLDEST 3 -EXPTYPEEND -/* - Determines the behavior of a sound if it encounters a limit trying to play. - - $:MILES_START_STEP_PRIORITY Evict a sound less than our priority. - $:MILES_START_STEP_DISTANCE Evict the farthest sound from the listener. - $:MILES_START_STEP_VOLUME Evict the quietest sound after mixing, using the loudest channel as the qualifier. - $:MILES_START_STEP_OLDEST Evict the sound that has been playing the longest. - - See also $AIL_add_start_sound_event_step. -*/ - -EXPTYPEBEGIN typedef S32 MILES_START_STEP_SELECTION_TYPE; -#define MILES_START_STEP_RANDOM 0 -#define MILES_START_STEP_NO_REPEATS 1 -#define MILES_START_STEP_IN_ORDER 2 -#define MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT 3 -#define MILES_START_STEP_BLENDED 4 -#define MILES_START_STEP_SELECT_MASK 0x7 -#define MILES_START_STEP_SELECT_BITS 3 -EXPTYPEEND -/* - Determines the usage of the sound names list in the $AIL_add_start_sound_event_step. - - $:MILES_START_STEP_RANDOM Randomly select from the list, and allow the same - sound to play twice in a row. This is the only selection type that doesn't require - a state variable. - $:MILES_START_STEP_NO_REPEATS Randomly select from the list, but prevent the last sound from being the same. - $:MILES_START_STEP_IN_ORDER Play the list in order, looping. - $:MILES_START_STEP_RANDOM_ALL_BEFORE_REPEAT Randomly select from the list, but don't allow duplicates until all sounds have been played. - $:MILES_START_STEP_BLENDED Play *all* of the sounds, using the state variable as both the variable name to poll, - and the name of the blend function to look up. The blend should have been specified prior to execution of - this step in the runtime, see $AIL_add_setblend_event_step. - $:MILES_START_STEP_SELECT_MASK Expect a value from the game to determine which sound to play, added in to the other selection type. -*/ - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_start_sound_event_step", "Adds a step to a given event to start a sound with the given specifications." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add the step to." - In = "const char*", "i_SoundNames", "The names and associated weights for the event step to choose from. - If there are multiple names listed, the sound will be chosen at random based on the given weights. This - string is of the form 'BankName1/SoundName1:Weight1:BankName2/SoundName2:Weight2:' etc. The string must always - terminate in a ':'. Weight must be between 0 and 200. To provide a null sound to randomly choose to not play anything, use - an empty string as an entry." - - In = "const char*", "i_PresetName", "[optional] The name of the preset, of the form 'PresetList/PresetName'" - In = "U8", "i_PresetIsDynamic", "Nonzero if the preset should poll the value of variables every frame, instead of only when applied." - In = "const char*", "i_EventName", "[optional] The name of the event to execute upon completion of the sound, of the form 'PresetList/PresetName'" - In = "const char*", "i_StartMarker", "[optional] The name of a marker to use as the loop start point." - In = "const char*", "i_EndMarker", "[optional] The name of a marker to use as the loop end point." - In = "const char*", "i_StateVar", "[optional] The name of a variable to use for storing state associated with this start sound step." - In = "char const*", "i_VarInit", "[optional] A list of variable names, mins, and maxes to use for randomizing the sound instance state." - In = "const char*", "i_Labels", "[optional] A comma delimited list of labels to assign to the sound." - In = "U32", "i_Streaming", "If nonzero, the sound will be set up and started as a stream." - In = "U8", "i_CanLoad", "If nonzero, the sound is allowed to hit the disk instead of only accessing cached sounds. If true, this might cause a hitch." - In = "U16", "i_Delay", "The minimum delay in ms to apply to the sound before start." - In = "U16", "i_DelayMax", "The maximum delay in ms to apply to the sound before start." - In = "U8", "i_Priority", "The priority to assign to the sound. If a sound encounters a limit based on its labels, it will evict any sound - with a priority strictly less than the given priority." - In = "U8", "i_LoopCount", "The loop count as per AIL_set_sample_loop_count." - In = "const char*", "i_StartOffset", "[optional] The name of the marker to use as the sound's initial offset." - In = "F32", "i_VolMin", "The min volume value to randomly select for initial volume for the sound. In LinLoud." - In = "F32", "i_VolMax", "The max volume value to randomly select for initial volume for the sound. In LinLoud." - In = "F32", "i_PitchMin", "The min pitch to randomly select from for initial playback. In sT." - In = "F32", "i_PitchMax", "The max pitch to randomly select from for initial playback. In sT." - In = "F32", "i_FadeInTime", "The time to fade the sound in over. Interpolation is linear in loudness." - In = "U8", "i_EvictionType", "The basis for deciding what sound will get kicked out if a limit is hit when trying to play this sound. See $MILES_START_STEP_EVICTION_TYPE." - In = "U8", "i_SelectType", "The method to use for selecting the sound to play from the sound name list. See $MILES_START_SOUND_SELECTION_TYPE." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "Adds an event that can start a sound. If the sound names list contains multiple entries, one will be selected - randomly based on the given weights and the selection type. Weights are effectively ratios for likelihood. A sound with 100 weight will be twice as likely - as a sound with 50 weight. Some times you may want to have an event that only *might* play a sound. To do this, add a empty sound name - with an associated weight. - " - } -*/ -DXDEC -S32 -AILCALL -AIL_add_start_sound_event_step( - HMSSEVENTCONSTRUCT i_Event, - const char* i_SoundNames, - const char* i_PresetName, - U8 i_PresetIsDynamic, - const char* i_EventName, - const char* i_StartMarker, const char* i_EndMarker, - char const* i_StateVar, char const* i_VarInit, - const char* i_Labels, U32 i_Streaming, U8 i_CanLoad, - U16 i_Delay, U16 i_DelayMax, U8 i_Priority, U8 i_LoopCount, - const char* i_StartOffset, - F32 i_VolMin, F32 i_VolMax, F32 i_PitchMin, F32 i_PitchMax, - F32 i_FadeInTime, - U8 i_EvictionType, - U8 i_SelectType - ); - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_cache_sounds_event_step", "Adds a step to an event to load a list of sounds in to memory for play." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "bankName", "The bank filename containing all of the sounds." - In = "const char*", "i_Sounds", "A list of colon separated sounds to load from the bank file." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "In general events are not allowed to hit the disk in order to prevent unexpected hitching during - gameplay. In order to facilitate that, sounds need to be preloaded by this event. Each cache step can only - load sounds from a single bank file, so for multiple bank files, multiple steps will be needed. - - In order to release the data loaded by this event, AIL_add_uncache_sounds_event_step() needs to - be called with the same parameters. - - If you are using MilesEvent, the data is refcounted so the sound will not be freed until all - samples using it complete." - } -*/ -DXDEC -S32 -AILCALL -AIL_add_cache_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds); - - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_uncache_sounds_event_step", "Adds a step to an event to free a list of sounds previously loaded in to memory for play." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "bankName", "The bank filename containing all of the sounds." - In = "const char*", "i_Sounds", "A list of colon separated sounds from the bank file to uncache." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "This event released sounds loaded via AIL_add_cache_sounds_event_step()" - } -*/ -DXDEC -S32 -AILCALL -AIL_add_uncache_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, const char* bankName, const char* i_Sounds); - - -EXPTYPEBEGIN typedef S32 MILES_CONTROL_STEP_TYPE; -#define MILES_CONTROL_STEP_STOP 3 -#define MILES_CONTROL_STEP_STOP_NO_EVENTS 4 -#define MILES_CONTROL_STEP_PASS 0 -#define MILES_CONTROL_STEP_PAUSE 1 -#define MILES_CONTROL_STEP_RESUME 2 -#define MILES_CONTROL_STEP_STOP_FADE 5 - -EXPTYPEEND -/* - Determines how the playhead is adjusted during a $AIL_add_control_sounds_event_step. - - $:MILES_CONTROL_STEP_STOP Stop the affected sounds. - $:MILES_CONTROL_STEP_PASS Do not change the playhead. - $:MILES_CONTROL_STEP_PAUSE Pause the affected sounds. - $:MILES_CONTROL_STEP_RESUME Resume the affected sounds. - $:MILES_CONTROL_STEP_STOP_NO_EVENTS Stop the affected sounds, and prevent their completion events from playing. - $:MILES_CONTROL_STEP_STOP_FADE Stop the sound after fading the sound out linearly in loudness. -*/ - -#define MILES_CONTROL_STEP_IGNORELOOP 255 - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_control_sounds_event_step", "Adds a step to an event to control sample playback by label." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "i_Labels", "[optional] A comma seperated list of labels to control." - In = "const char*", "i_MarkerStart", "[optional] If exists, sets the loop start to the marker's offset." - In = "const char*", "i_MarkerEnd", "[optional] If exists, sets the loop end to the marker's offset." - In = "const char*", "i_Position", "[optional] If exists, sets the current playback position to the marker's offset." - In = "const char*", "i_PresetName", "[optional] The name of the preset to apply, of the form Bank/PresetList/PresetName." - In = "U8", "i_PresetApplyType", "If nonzero, the preset is applied dynamically(the variables are polled every frame)." - In = "U8", "i_LoopCount", "If the loop count is not to be affected, pass MILES_CONTROL_STEP_IGNORELOOP. Otherwise, the sample's loop count will be set to this value." - In = "U8", "i_Type", "The control type requested. See $MILES_CONTROL_STEP_TYPE." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "Controls playback of current instances. The sounds are matched either on name or label. If - i_Labels is null, all sounds will be controlled. - " - } -*/ -DXDEC -S32 -AILCALL -AIL_add_control_sounds_event_step( - HMSSEVENTCONSTRUCT i_Event, - const char* i_Labels, const char* i_MarkerStart, const char* i_MarkerEnd, const char* i_Position, - const char* i_PresetName, - U8 i_PresetApplyType, - F32 i_FadeOutTime, - U8 i_LoopCount, U8 i_Type); - - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_apply_environment_event_step", "Adds a step to an event to apply an environment preset." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "i_EnvName", "The name of the environment preset to apply, of the form EnvList/EnvName." - In = "U8", "i_IsDynamic", "If nonzero, any variables in the environment are polled every frame." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "Applies the specified environment preset to the current HDIGDRIVER." - } -*/ -DXDEC S32 AILCALL AIL_add_apply_environment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_EnvName, U8 i_IsDynamic); - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_comment_event_step", "Adds a step that represents a comment to the user of the editing tool." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "i_Comment", "A string to display in the editing tool." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "This event is ignored in the runtime, and only exist for editing convenience." - } -*/ -DXDEC S32 AILCALL AIL_add_comment_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_Comment); - -EXPTYPEBEGIN typedef S32 MILES_RAMP_TYPE; -#define MILES_RAMPTYPE_VOLUME 0 -#define MILES_RAMPTYPE_WET 1 -#define MILES_RAMPTYPE_LOWPASS 2 -#define MILES_RAMPTYPE_RATE 3 -EXPTYPEEND -/* - The different values the ramps can affect. - - $:MILES_RAMPTYPE_VOLUME The ramp will adjust the sample's volume, and will interpolate in loudness level. Target is in dB. - $:MILES_RAMPTYPE_WET The ramp will affect the sample's reverb wet level, and will interpolate in loudness. Target is in dB. - $:MILES_RAMPTYPE_LOWPASS The ramp will affect the sample's low pass cutoff. Interpolation and target are in Hz. - $:MILES_RAMPTYPE_RATE The ramp will affect the sample's playback rate. Interpolation and target are in sT. -*/ - -EXPTYPEBEGIN typedef S32 MILES_INTERP_TYPE; -#define MILES_INTERP_LINEAR 0 -#define MILES_INTERP_EXP 1 -#define MILES_INTERP_SCURVE 2 -EXPTYPEEND -/* - The different ways the interpolation occurs for a ramp. - - $:MILES_INTERP_LINEAR The ramp will lerp between the current value and the target. - $:MILES_INTERP_EXP The ramp will move toward the target slowly at first, then faster as it closes on its total time. - $:MILES_INTERP_SCURVE The ramp will quickly move to about halfway, then slowly move, then move more quickly as it ends. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_ramp_event_step( - HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Labels, - F32 i_Time, char const* i_Target, U8 i_Type, U8 i_ApplyToNew, U8 i_InterpolationType); -/* - Add an event step that updates or creates a new ramp in the runtime. - - $:i_Event The event to add the step to. - $:i_Name The name of the ramp. If this name already exists, the ramp will shift its target to the new value. - $:i_Labels The label query determining the sounds the ramp will affect. - $:i_Time The length the time in seconds the ramp will take to reach its target. - $:i_Target The target value, or a variable expression representing the target value. The target's type is - dependent on i_Type. - $:i_Type One of the $MILES_RAMP_TYPE values. - $:i_ApplyToNew If 1, the ramp will affect sounds that start after the ramp is created. If not, it will only affect sounds that - are playing when the ramp is created. This value can not be changed once the ramp has been created. - $:i_InterpolationType The method the ramp will affect the target values. One of $MILES_INTERP_TYPE values. - - Ramps are means of interpolating aspects of samples. They are removed from the system if they are targeted to - a value for their type that is a non-op - meaning 0 dB, 0 sT, or >24000 Hz. - - Ramps use the current value as the start point for the interpolation. They stay at the target point, - so you can use the same ramp name to adjust a sound's volume down, and later ramp it back up. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_setblend_event_step(HMSSEVENTCONSTRUCT i_Event, - char const* i_Name, S32 i_SoundCount, F32 const* i_InMin, F32 const* i_InMax, - F32 const* i_OutMin, F32 const* i_OutMax, F32 const* i_MinP, F32 const* i_MaxP); -/* - Defines a named blend function to be referenced by a blended sound later. - - $:i_Event The event to add the step to. - $:i_Name The name of the blend. This is the name that will be - referenced by the state variable in start sound, as well as the variable name - to set by the game to update the blend for an instance. - $:i_SoundCount The number of sounds this blend will affect. Max 10. - $:i_InMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade in. - $:i_InMax Array of length i_SoundCount representing the value of the blend variable the sound will reach full volume. - $:i_OutMin Array of length i_SoundCount representing the value of the blend variable the sound will start to fade out. - $:i_OutMax Array of length i_SoundCount representing the value of the blend variable the sound will cease to be audible. - $:i_MinP Array of length i_SoundCount representing the pitch of the sound when it starts to fade in. - $:i_MaxP Array of length i_SoundCount representing the pitch of the sound when it has completed fading out. - - This step only sets up the lookup for when a blended sound is actually started. When a blended sound plays, every frame it - polls its state variable, then searches for a blend of the same name. If it finds both, then it uses its index in - the start sounds list to find its relevant values from the blended sound definition. - - Once it has the correct values, it uses them to affect the sample as stated in the parameter docs above. -*/ - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_sound_limit_event_step", "Adds a step that defines the maximum number of playing sounds per label." - - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "i_SoundLimits", "A string of the form `"label count:anotherlabel count`"." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "Defines limits for instances of sounds on a per label basis. Sounds with multiple labels - must fit under the limits for all of their labels. By default sounds are not limited other than the - Miles max sample count." - } -*/ -DXDEC S32 AILCALL -AIL_add_sound_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName, const char* i_SoundLimits); - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_add_persist_preset_event_step", "Adds a preset that applies to current sound instances, and continues to be applied to new sounds as they are started." - In = "HMSSEVENTCONSTRUCT", "i_Event", "The event to add on to." - In = "const char*", "i_PresetName", "The name of the preset, of the form PresetList/PresetName. See discussion." - In = "const char*", "i_PersistName", "The name of this persisted preset, for future removal." - In = "const char*", "i_Labels", "The labels to apply this preset to." - In = "U8", "i_IsDynamic", "If nonzero, the preset polls its variables every frame." - - ReturnType = "S32", "Returns 1 on success." - - Discussion = "Defines a preset by name that remains in the system, testing against all started sounds for label match. If a - match occurs, then the preset is applied to the new sound, before the preset specified in the startsound step itself. - - In order to remove a persisted preset, refer to it by name, but leave all other parameters null. - - Example: - - // Persist a preset for players. - AIL_add_persist_preset_event_step(hEvent, , `"Bank/PlayerEffects/Underwater`", `"Underwater`", `"player`"); - - // Remove the above preset. - AIL_add_persist_preset_event_step(hEvent, 0, `"Underwater`", 0);" - } -*/ -DXDEC S32 AILCALL -AIL_add_persist_preset_event_step(HMSSEVENTCONSTRUCT i_Event, const char* i_PresetName, const char* i_PersistName, - const char* i_Labels, U8 i_IsDynamic - ); - -DXDEC EXPAPI S32 AILCALL AIL_get_event_contents(HMSOUNDBANK bank, char const * name, U8 const** event); -/* - Return the event data for an event, by name. - - $:bank Soundbank containing the event. - $:name Name of the event to retrieve. - $:event Returns an output pointer to the event contents. Note that this string isn't null terminated, and - thus shouldn't be checked via strlen, etc. - $:return Returns 0 on fail. - - Normally, event contents are meant to be handled by the Miles high-level system via $AIL_enqueue_event, - rather than inspected directly. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_clear_state_event_step(HMSSEVENTCONSTRUCT i_Event); -/* - Clears all persistent state in the runtime. - - $:i_Event The event to add the step to. - - This removes all state that can stick around after an event in done executing. Ramps, Blends, Persisted - Preset, etc. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_exec_event_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_EventName); -/* - Adds a step to run another named event. - - $:i_Event The event to add the step to. - $:i_EventName The name of the event, of the form "Bank/Path/To/Event". - - When this step is encountered, the event is enqueued, so it will be executed the following frame (currently). It has the same parent - event mechanics as a completion event, so the QueuedId for a sound started by it will be for the event - that fired this step. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_add_enable_limit_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_LimitName); -/* - Adds a step to set the currently active limit. - - $:i_Event The event to add the step to. - $:i_EventName The name of the limit, as defined by a set_limits event. - -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_set_lfo_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, char const* i_Base, char const* i_Amp, char const* i_Freq, S32 i_Invert, S32 i_Polarity, S32 i_Waveform, S32 i_DutyCycle, S32 i_IsLFO); -/* - Adds a step to define a variable that oscillates over time. - - $:i_Event The event to add the step to. - $:i_Name The nane of the variable to oscillate. - $:i_Base The value to oscillate around, or a variable name to use as the base. - $:i_Amp The maximum value to reach, or a variable name to use as the amplitude. - $:i_Freq The rate at which the oscillation occurs, or a variable name to use as the rate. Rate should not exceed game tick rate / 2. - $:i_Invert Whether the waveform should be inverted. - $:i_Polarity Bipolar (1) or Unipolar (0) - whether the waveform goes around the base or only above it. - $:i_Waveform Sine wave (0), Triangle (1), Saw (2), or Square(3) - $:i_DutyCycle Only valid for square, determines what percent of the wave is "on". (0-100) - $:i_IsLFO If zero, Base is the default value to assign the variable when the settings are applied, and the rest of the parameters are ignored. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_add_move_var_event_step(HMSSEVENTCONSTRUCT i_Event, char const* i_Name, const F32 i_Times[2], const S32 i_InterpolationTypes[2], const F32 i_Values[3]); -/* - Adds a step to set and move a variable over time on a curve. - - $:i_Event The event to add the step to. - $:i_Name The variable to move. - $:i_Times The midpoint and final times for the curves - $:i_InterpolationTypes The curve type for the two curves - Curve In (0), Curve Out (1), S-Curve (2), Linear (3) - $:i_Values The initial, midpoint, and final values for the variable. - - The variable is locked to this curve over the timeperiod - no interpolation from a previous value is done. - - If an existing move var exists when the new one is added, the old one is replaced. -*/ - -enum EVENT_STEPTYPE -{ - EVENT_STEPTYPE_STARTSOUND = 1, - EVENT_STEPTYPE_CONTROLSOUNDS, - EVENT_STEPTYPE_APPLYENV, - EVENT_STEPTYPE_COMMENT, - EVENT_STEPTYPE_CACHESOUNDS, - EVENT_STEPTYPE_PURGESOUNDS, - EVENT_STEPTYPE_SETLIMITS, - EVENT_STEPTYPE_PERSIST, - EVENT_STEPTYPE_VERSION, - EVENT_STEPTYPE_RAMP, - EVENT_STEPTYPE_SETBLEND, - EVENT_STEPTYPE_CLEARSTATE, - EVENT_STEPTYPE_EXECEVENT, - EVENT_STEPTYPE_ENABLELIMIT, - EVENT_STEPTYPE_SETLFO, - EVENT_STEPTYPE_MOVEVAR -}; - -//! Represents an immutable string that is not null terminated, and shouldn't be deleted. -struct _MSSSTRINGC -{ - const char* str; - S32 len; -}; -typedef struct _MSSSTRINGC MSSSTRINGC; - - -/*! - Represents a single step that needs to be executed for an event. - - All of the members in the structures share the same definition as - their counterpart params in the functions that added them during - event construction. -*/ -struct EVENT_STEP_INFO -{ - //! type controls which struct in the union is accessed. - enum EVENT_STEPTYPE type; - union - { - struct - { - MSSSTRINGC soundname; - MSSSTRINGC presetname; - MSSSTRINGC eventname; - MSSSTRINGC labels; - MSSSTRINGC markerstart; - MSSSTRINGC markerend; - MSSSTRINGC startoffset; - MSSSTRINGC statevar; - MSSSTRINGC varinit; - U32 stream; - F32 volmin,volmax,pitchmin,pitchmax; - F32 fadeintime; - U16 delaymin; - U16 delaymax; - U8 canload; - U8 priority; - U8 loopcount; - U8 evictiontype; - U8 selecttype; - U8 presetisdynamic; - } start; - - struct - { - MSSSTRINGC labels; - MSSSTRINGC markerstart; - MSSSTRINGC markerend; - MSSSTRINGC position; - MSSSTRINGC presetname; - F32 fadeouttime; - U8 presetapplytype; - U8 loopcount; - U8 type; - } control; - - struct - { - MSSSTRINGC envname; - U8 isdynamic; - } env; - - struct - { - MSSSTRINGC comment; - } comment; - - struct - { - MSSSTRINGC lib; - const char** namelist; - S32 namecount; - } load; - - struct - { - MSSSTRINGC limits; - MSSSTRINGC name; - } limits; - - struct - { - MSSSTRINGC name; - MSSSTRINGC presetname; - MSSSTRINGC labels; - U8 isdynamic; - } persist; - - struct - { - MSSSTRINGC name; - MSSSTRINGC labels; - MSSSTRINGC target; - F32 time; - U8 type; - U8 apply_to_new; - U8 interpolate_type; - } ramp; - - struct - { - MSSSTRINGC name; - F32 inmin[10]; - F32 inmax[10]; - F32 outmin[10]; - F32 outmax[10]; - F32 minp[10]; - F32 maxp[10]; - U8 count; - } blend; - - struct - { - MSSSTRINGC eventname; - } exec; - - struct - { - MSSSTRINGC limitname; - } enablelimit; - - struct - { - MSSSTRINGC name; - MSSSTRINGC base; - MSSSTRINGC amplitude; - MSSSTRINGC freq; - S32 invert; - S32 polarity; - S32 waveform; - S32 dutycycle; - S32 islfo; - } setlfo; - - struct - { - MSSSTRINGC name; - F32 time[2]; - S32 interpolate_type[2]; - F32 value[3]; - } movevar; - }; -}; - -/*! - function - { - ExcludeOn = 1 - - Name = "AIL_next_event_step", "Retrieves the next step in the event buffer, parsing it in to a provided buffer." - - In = "const U8*", "i_EventString", "The event returned by $AIL_close_event, or a previous call to $AIL_next_event_step" - Out = "const EVENT_STEP_INFO*", "o_Step", "A pointer to the step struct will be stored here." - In = "void*", "i_Buffer", "A working buffer for the function to use for parsing." - In = "S32", "i_BufferSize", "The size in bytes of the working buffer." - - ReturnType = "U8 char*", "Returns 0 on fail or when the event string has been exhausted of steps. Otherwise, returns - the string location of the next event step in the buffer." - - Discussion = "This function parses the event string in to a struct for usage by the user. This function should only be - used by the MilesEvent system. It returns the pointer to the next step to be passed to this function to get the - next step. In this manner it can be used in a loop: - - // Create an event to stop all sounds. - HMSSEVENTCONSTRUCT hEvent = AIL_create_event(); - AIL_add_control_sound_event_step(hEvent, 0, 0, 0, 0, 0, 0, 255, 3); - char* pEvent = AIL_close_event(hEvent); - - char EventBuffer[4096]; - EVENT_STEP_INFO* pStep = 0; - char* pCurrentStep = pEvent; - - while (pCurrentStep) - { - pStep = 0; - pCurrentStep = AIL_next_event_step(pCurrentStep, &pStep, EventBuffer, 4096); - if (pStep == 0) - { - // Error, or an empty event. If $AIL_last_error is an empty string, then it was an empty event. - break; - } - - // Handle event step. - switch (pStep->type) - { - default: break; - } - } - - AIL_mem_free_lock(pEvent); - " - } -*/ -DXDEC const U8* AILCALL AIL_next_event_step(const U8* i_EventString, struct EVENT_STEP_INFO** o_Step, void* i_Buffer, S32 i_BufferSize); - - -// Old style names. -#define AIL_find_event MilesFindEvent -#define AIL_clear_event_queue MilesClearEventQueue -#define AIL_register_random MilesRegisterRand -#define AIL_enumerate_sound_instances MilesEnumerateSoundInstances -#define AIL_enumerate_preset_persists MilesEnumeratePresetPersists -#define AIL_enqueue_event MilesEnqueueEvent -#define AIL_enqueue_event_system MilesEnqueueEventContext -#define AIL_enqueue_event_by_name MilesEnqueueEventByName -#define AIL_begin_event_queue_processing MilesBeginEventQueueProcessing -#define AIL_complete_event_queue_processing MilesCompleteEventQueueProcessing -#define AIL_startup_event_system MilesStartupEventSystem -#define AIL_shutdown_event_system MilesShutdownEventSystem -#define AIL_add_soundbank MilesAddSoundBank -#define AIL_release_soundbank MilesReleaseSoundBank -#define AIL_set_sound_label_limits MilesSetSoundLabelLimits -#define AIL_text_dump_event_system MilesTextDumpEventSystem -#define AIL_event_system_state MilesGetEventSystemState -#define AIL_get_event_length MilesGetEventLength -#define AIL_stop_sound_instances MilesStopSoundInstances -#define AIL_pause_sound_instances MilesPauseSoundInstances -#define AIL_resume_sound_instances MilesResumeSoundInstances -#define AIL_start_sound_instance MilesStartSoundInstance -#define AIL_set_event_error_callback MilesSetEventErrorCallback -#define AIL_set_event_bank_functions MilesSetBankFunctions -#define AIL_get_event_bank_functions MilesGetBankFunctions - -#define AIL_set_variable_int MilesSetVarI -#define AIL_set_variable_float MilesSetVarF -#define AIL_variable_int MilesGetVarI -#define AIL_variable_float MilesGetVarF - -#define AIL_set_sound_start_offset MilesSetSoundStartOffset -#define AIL_requeue_failed_asyncs MilesRequeueAsyncs -#define AIL_add_event_system MilesAddEventSystem - -#define AIL_audition_local_host MilesAuditionLocalHost -#define AIL_audition_connect MilesAuditionConnect -#define AIL_audition_startup MilesAuditionStartup -#define AIL_audition_shutdown MilesAuditionShutdown -EXPGROUP(Miles High Level Event System) - -EXPTYPE typedef void* HEVENTSYSTEM; -/* - The type used to distinguish between running event systems. - - Only used if multiple event systems are running. See the eventmultiple example. -*/ - -DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_startup_event_system(HDIGDRIVER dig, S32 command_buf_len, EXPOUT char* memory_buf, S32 memory_len); -/* - Initializes the Miles Event system and associates it with an open digital driver. - - $:dig The digital sound driver that this event system should use. - $:command_buf_len An optional number of bytes to use for the command buffer. If you pass 0, a reasonable default will be used (currently 5K). - $:memory_buf An optional pointer to a memory buffer buffer that the event system will use for all event allocations. - Note that the sound data itself is not stored in this buffer - it is only for internal buffers, the command buffer, and instance data. - Use 0 to let Miles to allocate this buffer itself. - $:memory_len If memory_buf is non-null, then this parameter provides the length. If memory_buf is null, the Miles will - allocate this much memory for internal buffers. If both memory_buf and memory_len are null, the Miles will allocate reasonable default (currently 64K). - $:return Returns 0 on startup failure. - - This function starts up the Miles Event System, which is used to trigger events throughout your game. - You call it after $AIL_open_digital_driver. -*/ - -DXDEC EXPAPI HEVENTSYSTEM AILCALL AIL_add_event_system(HDIGDRIVER dig); -/* - Creates an additional event system attached to a different driver, in the event that you need to trigger events - tied to different sound devices. - - $:dig The digital sound driver to attach the new event system to. - $:return A handle to the event system to use in various high level functions. - - Both systems will access the same set of loaded soundbanks, and are updated when $AIL_begin_event_queue_processing is called. - - To enqueue events to the new system, use $AIL_enqueue_event_system. - - To iterate the sounds for the new system, pass the $HEVENTSYSTEM as the first parameter to $AIL_enumerate_sound_instances. - - To access or set global variables for the new system, pass the $HEVENTSYSTEM as the context in the variable access functions. - - See also the eventmultiple.cpp example program. -*/ - -DXDEC EXPAPI void AILCALL AIL_shutdown_event_system( void ); -/* - Shuts down the Miles event system. - - This function will closes everything in the event system - it ignores reference counts. It will free - all event memory, sound banks, and samples used by the system. -*/ - -DXDEC EXPAPI HMSOUNDBANK AILCALL AIL_add_soundbank(char const * filename, char const* name); -/* - Open and add a sound bank for use with the event system. - - $:filename Filename of the bank to load. - $:name The name of the soundbank to load - this is only used for auditioning. - $:return The handle to the newly loaded soundbank (zero on failure). - - This function opens the sound bank and makes it available to the event system. The filename - is the name on the media, and the name is the symbolic name you used in the Miles Sound Studio. - You might, for example, be using a soundbank with a platform extension, like: 'gamebank_ps3.msscmp', - and while using the name 'gamebank' for authoring and auditioning. - - Sound data is not loaded when this function is called - it is only loaded when the relevant Cache Sounds - is played, or a sound requiring it plays. - - This function will access the disc, so you will usually call it at level load time. - - If you are using the Auditioner, $AIL_audition_startup and $AIL_audition_connect must be called prior - to this function. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_release_soundbank(HMSOUNDBANK bank); -/* - Releases a sound bank from the event system. - - $:bank The bank to close. - $:return Returns non-zero for success (zero on failure). - - This function closes a given soundbank. Any data references in the event system need to be removed beforehand - with - $AIL_enqueue_event_by_name usage this should only be pending sounds with completion events. - - Any other data references still existing (queued events, persisted presets, etc) will report errors when used, - but will not crash. - - Releasing a sound bank does not free any cached sounds loaded from the bank - any sounds from the bank should be freed - via a Purge Sounds event step. If this does not occur, the sound data will still be loaded, but the - sound metadata will be gone, so Start Sound events will not work. Purge Sounds will still work. - - This is different from Miles 8, which would maintain a reference count for all data. -*/ - -DXDEC U8 const * AILCALL AIL_find_event(HMSOUNDBANK bank,char const* event_name); -/* - (EXPAPI removed to prevent release in docs) - - Searches for an event by name in the event system. - - $:bank The soundbank to search within, or 0 to search all open banks (which is the normal case). - $:event_name The name of the event to find. This name should be of the form "soundbank/event_list/event_name". - $:return A pointer to the event contents (or 0, if the event isn't found). - - This function is normally used as the event parameter for $AIL_enqueue_event. It - searches one or all open soundbanks for a particular event name. - - This is deprecated. If you know the event name, you should use $AIL_enqueue_event_by_name, or $AIL_enqueue_event with - MILESEVENT_ENQUEUE_BY_NAME. - - Events that are not enqueued by name can not be tracked by the Auditioner. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_system(HEVENTSYSTEM system, U8 const * event, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); -/* - Enqueue an event to a specific system. Used only if you have multiple event systems running. - - $:system The event system to attach the event to. - $:return See $AIL_enqueue_event for return description. - - For full information on the parameters, see $AIL_enqueue_event. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_by_name(char const* name); -/* - Enqueue an event by name. - - $:name The full name of the event, eg "soundbank/path/to/event". - $:return See $AIL_enqueue_event for return description. - - This is the most basic way to enqueue an event. It enqueues an event by name, and as a result the event will be tracked by the auditioner. - - For when you need more control over the event, but still want it to be tracked by the auditioner, it is equivalent - to calling $AIL_enqueue_event_end_named($AIL_enqueue_event_start(), name) - - For introduction to the auditioning system, see $integrating_events. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_start(); -/* - Start assembling a packet to use for enqueuing an event. - - $:return A token used for passing to functions that add data to the event. - - This is used to pass more data to an event that will be executed. For instance, if - an event is going to spatialize a sound, but there's no need to move the sound over the course of - its lifetime, you can add positional data to the event via $AIL_enqueue_event_position. When a - sound is started it will use that for its initial position, and there is no need to do any - game object <-> event id tracking. - - ${ - // Start the enqueue. - S32 enqueue_token = AIL_enqueue_event_start(); - - // Tell all sounds started by the event to position at (100, 100, 100) - AIL_enqueue_event_position(&enqueue_token, 100, 100, 100); - - // Complete the token and enqueue the event to the command buffer. - AIL_enqueue_event_end_named(enqueue_token); - $} - - The enqueue process is still completely thread safe. No locks are used, however only 8 - enqueues can be "assembling" at the same time - if more than that occur, the $AIL_enqueue_event_start - will yield the thread until a slot is open. - - The ONLY time that should happen is if events enqueues are started but never ended: - - ${ - // Start the enqueue - S32 enqueue_token = AIL_enqueue_event_start(); - - // Try to get the game position - Vector3* position = GetPositionOfSomething(my_game_object); - if (position == 0) - return; // OOPS! enqueue_token was leaked here, never to be reclaimed. - - $} - - Each event has a limit to the amount of data that can be attached to it. Currently this - amount is 512 bytes - which should cover all use cases. If any enqueue functions return 0, - then this amount has been reached. The ErrorHandler will be called as well, with $AIL_last_error - reporting that the enqueue buffer was filled. -*/ - -DXDEC EXPAPI void AILCALL AIL_enqueue_event_cancel(S32 token); -/* - Clears a enqueue token without passing it to the command buffer - - $:token A token created with $AIL_enqueue_event_start. - - Used to handle the case where you decided to not actually enqueue the event you've assembled. - - In general it's better to handle anything that can fail before actually starting - to create the enqueue. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_position(S32* token, F32 x, F32 y, F32 z); -/* - Pass an initial position to an event to use for sound spatialization. - - $:token A token created with $AIL_enqueue_event_start. - $:return 0 if the enqueue buffer is full - - If the event queued starts a sound, the sound's position will be set to the given coordinates. - - Setting the position of a sample automatically enables 3D spatialization. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_velocity(S32* token, F32 vx, F32 vy, F32 vz, F32 mag); -/* - Pass an initial velocity to an event to use for sound spatialization. - - $:token A token created with $AIL_enqueue_event_start. - $:return 0 if the enqueue buffer is full - - If the event queued starts a sound, the sound's velocity will be set to the given vector. - - Setting the velocity of a sample does NOT automatically enable 3D spatialization. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_buffer(S32* token, void* user_buffer, S32 user_buffer_len, S32 user_buffer_is_ptr); -/* - Attaches a user buffer to the event. - - $:token A token created with $AIL_enqueue_event_start. - $:user_buffer Pointer to a user buffer to pass with the event. If user_buffer_is_ptr is 1, the pointer is copied - directly and user_buffer_len is ignored. - $:user_buffer_len The size of the user_buffer to attach to the event. - $:user_buffer_is_ptr If 1, the pointer is copied and user_buffer_len is ignored. - $:return 0 if the enqueue buffer is full - - User buffers are helpful for bridging the gap between game objects and sound objects. - - There are two use cases available in this function - - $* Pointer 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. - $* Buffer If user_buffer_is_ptr is 0, then user_buffer_len bytes are copied from user_buffer and - carried with the event. During sound enumeration this buffer is made available, and you never have to - worry about memory management. - $- - - Pointer- - ${ - struct useful_data - { - S32 game_stat; - S32 needed_info; - }; - - useful_data* data = (useful_data*)malloc(sizeof(useful_data)); - data->game_stat = 1; - data->needed_info = 2; - - // Pointer - the "data" pointer will be copied directly, so we can't free() "data" until after the sound - // completes and we're done using it in the enumeration loop. - S32 ptr_token = AIL_enqueue_event_start(); - AIL_enqueue_event_buffer(&ptr_token, data, 0, 1); - AIL_enqueue_event_end_named(ptr_token, "mybank/myevent"); - $} - - Buffer- - ${ - struct useful_data - { - S32 game_stat; - S32 needed_info; - }; - - useful_data data; - data.game_stat = 1; - data.needed_info = 2; - - // Buffer - the "data" structure will be copied internally, so we can free() the data - or just use - // a stack variable like this - S32 buf_token = AIL_enqueue_event_start(); - AIL_enqueue_event_buffer(&buf_token, &data, sizeof(data), 0); - AIL_enqueue_event_end_named(buf_token, "mybank/myevent"); - $} - - As noted in $AIL_enqueue_event_start(), there's only 512 bytes available to an enqueue, so that - places an upper limit on the amount of data you can pass along. If the data is huge, then you - should use user_buffer_is_ptr. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_variablef(S32* token, char const* name, F32 value); -/* - Attaches a variable's value to the event enqueue. - - $:token A token created with $AIL_enqueue_event_start - $:name The variable name to set. - $:value The value of the variable to set. - $:return 0 if the enqueue buffer is full - - When a sound starts, the given variable will be set to the given value prior to any possible - references being used by presets. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_filter(S32* token, U64 apply_to_ID); -/* - Limits the effects of the event to sounds started by the given ID. - - $:token A token created with $AIL_enqueue_event_start - $:apply_to_ID The ID to use for filtering. This can be either a sound or event ID. For an - event, it will apply to all sounds started by the event, and any events queued by that event. - $:return 0 if the enqueue buffer is full - - IDs are assigned to events and sounds - for events, it is returned via the $AIL_enqueue_event_end_named function - (or any other enqueue function). For sounds, you can access the assigned id during the enumeration process. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_context(S32* token, HEVENTSYSTEM system); -/* - Causes the event to run on a separate running event system. - - $:token A token created with $AIL_enqueue_event_start - $:system An event system $AIL_add_event_system - $:return 0 if the enqueue buffer is full - - If you are running multiple event systems, this is required to get events - to queue on the additional event systems. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enqueue_event_selection(S32* token, U32 selection); -/* - Passes in a selection value for start sound events to use for picking sounds. - - $:token A token created with $AIL_enqueue_event_start. - $:selection The value to use for selecting the sound to play. - $:return 0 if the enqueue buffer is full - - The selection index is used to programatically select a sound from the - loaded banks. The index passed in replaces any numeric value at the end - of the sound name existing in any start sound event step. For example, if - a start sound event plays "mybank/sound1", and the event is queued with - a selection, then the selection will replace the "1" with the number passed in: - - ${ - // Enqueue with a selection of 5 - S32 token = AIL_enqueue_event_start(); - AIL_enqueue_event_selection(&token, 50; - AIL_enqueue_event_end_named(token, "mybank/myevent"); - $} - - Assuming mybank/myevent starts sound "mybank/sound1", the sound - that will actually be played will be "mybank/sound5". If the sound does - not exist, it is treated the same as if any other sound was not found. - - The selection process replaces ALL trailing numbers with a representation - of the selection index using the same number of digits, meaning in the above - example, "mybank/sound123" would have become "mybank/sound005". -*/ - -DXDEC EXPAPI U64 AILCALL AIL_enqueue_event_end_named(S32 token, char const* event_name); -/* - Completes assembling the event and queues it to the command buffer to be run during next tick. - - $:token A token created with $AIL_enqueue_event_start. - $:event_name The name of the event to run. - $:return A unique ID for the event that can be used to identify sounds started by this event, - or for filtering future events to the sounds started by this event. - - This function takes all of the data accumulated via the various enqueue functions and assembles - it in to the command buffer to be run during the next $AIL_begin_event_queue_processing. - - As with all of the enqueue functions it is completely thread-safe. - - Upon completion of this function, the enqueue slot is release and available for another - $AIL_enqueue_event_start. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_enqueue_event(U8 const * event_or_name, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags, U64 apply_to_ID ); -/* - Enqueue an event to be processed by the next $AIL_begin_event_queue_processing function. - - $:event_or_name Pointer to the event contents to queue, or the name of the event to find and queue. - If an event, the contents must be valid until the next call to $AIL_begin_event_queue_processing. - If a name, the string is copied internally and does not have any lifetime requirements, and MILES_ENQUEUE_BY_NAME must be present in enqueue_flags. - $:user_buffer Pointer to a user buffer. Depending on $(AIL_enqueue_event::enqueue_flags), this pointer can be saved directly, or its contents copied into the sound instance. - This data is then accessible later, when enumerating the instances. - $:user_buffer_len Size of the buffer pointed to by user_buffer. - $:enqueue_flags Optional $MILESEVENTENQUEUEFLAGS logically OR'd together that control how to enqueue this event (default is 0). - $:apply_to_ID Optional value that is used for events that affect sound instances. Normally, - when Miles triggers one of these event steps, it matches the name and labels stored with the event step. However, if - you specify an apply_to_ID value, then event step will only run on sounds that matches this QueuedID,InstanceID,or EventID too. This is how you - execute events only specific sound instances. QueuedIDs are returned from each call $AIL_enqueue_event. - InstanceIDs and EventIDs are returned from $AIL_enumerate_sound_instances. - $:return On success, returns QueuedID value that is unique to this queued event for the rest of this - program run (you can use this ID to uniquely identify sounds triggered from this event). - - This function enqueues an event to be triggered - this is how you begin execution of an event. First, you - queue it, and then later (usually once a game frame), you call $AIL_begin_event_queue_processing to - execute an event. - - This function is very lightweight. It does nothing more than post the event and data to a - command buffer that gets executed via $AIL_begin_event_queue_processing. - - The user_buffer parameter can be used in different ways. If no flags are passed in, then - Miles will copy the data from user_buffer (user_buffer_len bytes long) and store the data with - the queued sound - you can then free the user_buffer data completely! This lets Miles keep track - of all your sound related memory directly and is the normal way to use the system (it is very - convenient once you get used to it). - - If you instead pass the MILESEVENT_ENQUEUE_BUFFER_PTR flag, then user_buffer pointer will - simply be associated with each sound that this event may start. In this case, user_buffer_len - is ignored. - - In both cases, when you later enumerate the sound instances, you can access your sound data - with the $(MILESEVENTSOUNDINFO::UserBuffer) field. - - You can call this function from any number threads - it's designed to be called from anywhere in your game. - - If you want events you queue to be captured by Miles Studio, then they have to be passed by name. This can be done - by either using the convenience function $AIL_enqueue_event_by_name, or by using the MILESEVENT_ENQUEUE_BY_NAME flag and - passing the name in event_or_name. For introduction to the auditioning system, see $integrating_events. -*/ - -EXPTYPEBEGIN typedef S32 MILESEVENTENQUEUEFLAGS; -#define MILESEVENT_ENQUEUE_BUFFER_PTR 0x1 -#define MILESEVENT_ENQUEUE_FREE_EVENT 0x2 -#define MILESEVENT_ENQUEUE_BY_NAME 0x4 -// 0x8 can't be used, internal. -EXPTYPEEND -/* - The available flags to pass in $AIL_enqueue_event or $AIL_enqueue_event_system. - - $:MILESEVENT_ENQUEUE_BUFFER_PTR The user_buffer parameter passed in should not be duplicated, and instead - should just tranparently pass the pointer on to the event, so that the $(MILESEVENTSOUNDINFO::UserBuffer) - during sound iteration is just the same pointer. user_buffer_len is ignored in this case. - - $:MILESEVENT_ENQUEUE_FREE_EVENT The ownership of the memory for the event is passed to the event system. If this - is present, once the event completes $AIL_mem_free_lock will be called on the raw pointer passed in to $AIL_enqueue_event or - $AIL_enqueue_event_system. This is rarely used. - - $:MILESEVENT_ENQUEUE_BY_NAME The event passed in is actually a string. The event system will then look for this event - in the loaded sound banks during queue processing. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_begin_event_queue_processing( void ); -/* - Begin execution of all of the enqueued events. - - $:return Return 0 on failure. The only failures are unrecoverable errors in the queued events - (out of memory, bank file not found, bad data, etc). You can get the specific error by - calling $AIL_last_error. - - This function executes all the events currently in the queue. This is where all major - processing takes place in the event system. - - Once you execute this functions, then sound instances will be in one of three states: - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were - created by events that had a "Start Sound Step". Note that these instances aren't audible yet, - so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously - started and are continuing to play (you might update the 3D position for these, for example). - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing - since the last this frame (you might use this status to free any game related memory, for example). - - You will normally enumerate the active sound instances in-between calls to $AIL_begin_event_queue_processing - and $AIL_complete_event_queue_processing with $AIL_enumerate_sound_instances. - - $AIL_complete_event_queue_processing must be called after this function to commit - all the changes. - - Example usage: -${ - // enqueue an event - $AIL_enqueue_event( EventThatStartsSounds, game_data_ptr, 0, MILESEVENT_ENQUEUE_BUFFER_PTR, 0 ); - - // now process that event - $AIL_begin_event_queue_processing( ); - - // next, enumerate the pending and complete sounds for game processing - MILESEVENTSOUNDINFO Info; - - HMSSENUM SoundEnum = MSS_FIRST; - while ( $AIL_enumerate_sound_instances( &SoundEnum, MILESEVENT_SOUND_STATUS_PENDING | MILESEVENT_SOUND_STATUS_COMPLETE, 0, &Info ) ) - { - game_type * game_data = (game_type*) Info.UserBuffer; // returns the game_data pointer from the enqueue - - if ( Info.Status == MILESEVENT_SOUND_STATUS_PENDING ) - { - // setup initial state - AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_data->z ); - } - else if ( Info.Status == MILESEVENT_SOUND_STATUS_COMPLETE ) - { - // Free some state we have associated with the sound now that its done. - game_free( game_data ); - } - } - - $AIL_complete_event_queue_processing( ); - $} - - Note that if any event step drastically fails, the rest of the command queue is - skipped, and this function returns 0! For this reason, you shouldn't assume - that a start sound event will always result in a completed sound later. - - Therefore, you should allocate memory that you want associated with a sound instance - during the enumeration loop, rather than at enqueue time. Otherwise, you - need to detect that the sound didn't start and then free the memory (which can be complicated). -*/ - -// Returned by AIL_enumerate_sound_instances() -EXPTYPE typedef struct _MILESEVENTSOUNDINFO -{ - U64 QueuedID; - U64 InstanceID; - U64 EventID; - HSAMPLE Sample; - HSTREAM Stream; - void* UserBuffer; - S32 UserBufferLen; - S32 Status; - U32 Flags; - S32 UsedDelay; - F32 UsedVolume; - F32 UsedPitch; - char const* UsedSound; - S32 HasCompletionEvent; -} MILESEVENTSOUNDINFO; -/* - Sound instance data that is associated with each active sound instance. - - $:QueuedID A unique ID that identifies the queued event that started this sound. Returned from each call to $AIL_enqueue_event. - $:EventID A unique ID that identifies the actual event that started this sound. This is the same as QueuedID unless the sound - was started by a completion event or a event exec step. In that case, the QueuedID represents the ID returned from - $AIL_enqueue_event, and EventID represents the completion event. - $:InstanceID A unique ID that identified this specific sound instance (note that one QueuedID can trigger multiple InstanceIDs). - $:Sample The $HSAMPLE for this playing sound. - $:Stream The $HSTREAM for this playing sound (if it is being streamed, zero otherwise). - $:UserBuffer A pointer to the user data for this sound instance. - $:UserBufferLen The length in bytes of the user data (if known by Miles). - $:Status One of the $MILESEVENTSOUNDSTATUS status values. - $:Flags One or more of the $MILESEVENTSOUNDFLAG flags. - $:UsedDelay The value actually used as a result of the randomization of delay for this instance - $:UsedVolume The value actually used as a result of the randomization of pitch for this instance - $:UsedPitch The value actually used as a result of the randomization of volume for this instance - $:UsedSound The name of the sound used as a result of randomization. This pointer should NOT be deleted - and is only valid for the until the next call in to Miles. - $:HasCompletionEvent Nonzero if the sound will fire an event upon completion. - - This structure is returned by the $AIL_enumerate_sound_instances function. It - returns information about an active sound instance. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_variable_int(UINTa context, char const* name, S32 value); -/* - Sets a named variable that the designer can reference in the tool. - - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM - to set a global variable for a specific system, 0 to set a global variable - for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. - $:name The name of the variable to set. - $:value The value of the variable to set. - - Variables are tracked per sound instance and globally, and when a variable is needed - by an event, it will check the relevant sound instance first, before falling back to - the global variable list: - - ${ - $HMSSENUM FirstSound = MSS_FIRST; - $MILESEVENTSOUNDINFO Info; - - // Grab the first sound, whatever it is. - $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info); - - // Set a variable on that sound. - $AIL_set_variable_int(FirstSound, "MyVar", 10); - - // Set a global variable by the same name. - $AIL_set_variable_int(0, "MyVar", 20); - - // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will - // get 20. - $} - -*/ - -DXDEC EXPAPI void AILCALL AIL_set_variable_float(UINTa context, char const* name, F32 value); -/* - Sets a named variable that the designer can reference in the tool. - - $:context The context the variable is set for. Can be either a $HEVENTSYSTEM - to set a global variable for a specific system, 0 to set a global variable - for the default system, or an $HMSSENUM from $AIL_enumerate_sound_instances. - $:name The name of the variable to set. - $:value The value of the variable to set. - - Variables are tracked per sound instance and globally, and when a variable is needed - by an event, it will check the relevant sound instance first, before falling back to - the global variable list. - - ${ - $HMSSENUM FirstSound = MSS_FIRST; - $MILESEVENTSOUNDINFO Info; - - // Grab the first sound, whatever it is. - $AIL_enumerate_sound_instances(0, &FirstSound, 0, 0, 0, &Info); - - // Set a variable on that sound. - $AIL_set_variable_float(FirstSound, "MyVar", 10.0); - - // Set a global variable by the same name. - $AIL_set_variable_float(0, "MyVar", 20.0); - - // A preset referencing "MyVar" for FirstSound will get 10. Any other sound will - // get 20. - $} -*/ - -DXDEC EXPAPI S32 AILCALL AIL_variable_int(UINTa context, char const* name, S32* value); -/* - Retrieves a named variable. - - $:context The context to start the lookup at, same as $AIL_set_variable_int. - $:name The name to look up. - $:value Pointer to an int to store the value in. - $:return 1 if the variable was found, 0 otherwise. - - This function follows the same lookup pattern as the runtime - if the context is a - sound instance, it checks the instance before falling back to global variables. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_variable_float(UINTa context, char const* name, F32* value); -/* - Retrieves a named variable. - - $:context The context to start the lookup at, same as $AIL_set_variable_float. - $:name The name to look up. - $:value Pointer to a float to store the value in. - $:return 1 if the variable was found, 0 otherwise. - - This function follows the same lookup pattern as the runtime - if the context is a - sound instance, it checks the instance before falling back to global variables. -*/ - -DXDEC EXPAPI void AILCALL AIL_requeue_failed_asyncs(); -/* - Requeues any failed asynchronous loads for sound sources. - - Use this function when a disc error causes a slew of failed caches. Any sound source that - has failed due to asynchronous load will get retried. -*/ - -DXDEC EXPAPI void AILCALL AIL_set_sound_start_offset(HMSSENUM sound, S32 offset, S32 isms); -/* - Specify the starting position for a pending sound. - - $:sound The enumeration from $AIL_enumerate_sound_instances representing the desired sound. - The sound must be in the pending state. - $:offset The offset to use for the starting position of the sound. - $:isms If nonzero, the offset is in milliseconds, otherwise bytes. - - Use this function instead of manipulating the sample position directly via low level Miles calls prior to - the sound starting. Generally you don't need to do this manually, since the sound designer should do - this, however if you need to restart a sound that stopped - for example a stream that went to error - - you will have to set the start position via code. - - However, since there can be a delay between the time the sound is first seen in the sound iteration and - the time it gets set to the data, start positions set via the low level miles calls can get lost, so - use this. - - See the eventstreamerror.cpp example program for usage. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_sound_instances(HEVENTSYSTEM system, HMSSENUM* next, S32 statuses, char const* label_query, U64 search_for_ID, EXPOUT MILESEVENTSOUNDINFO* info); -/* - Enumerated the active sound instances managed by the event system. - - $:next Enumeration token - initialize to MSS_FIRST before the first call. You can pass 0 here, if you just want the first instance that matches. - $:statuses Or-ed list of status values to enumerate. Use 0 for all status types. - $:label_query A query to match sound instance labels against. Use 0 to skip label matching. - $:search_for_ID Match only instances that have a QueuedID,InstanceID,or EventID that matches this value. Use 0 to skip ID matching. - $:info Returns the data for each sound instance. - $:return Returns 0 when enumeration is complete. - - Enumerates the sound instances. This will generally be used between - calls to $AIL_begin_event_queue_processing and $AIL_complete_event_queue_processing to - manage the sound instances. - - The label_query is a list of labels to match, separated by commas. By default, comma-separated - values only have to match at least one label. So, if you used "level1, wind", then all sound instances - that had either "level1" or "wind" would match. If you want to match all labels, - then use the + sign first (for example, "+level1, +wind" would only match sound instances that - had both "level1" and "wind"). You can also use the - sign before a label to not - match that label (so, "level1, -wind" would match all "level1" labeled sound instances that didn't have - a "wind" label). Finally, you can also use * and ? to match wildcard style labels (so, "gun*" - would match any sound instance with a label that starts with "gun"). - - Valid status flags are: - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PENDING)[MILESEVENT_SOUND_STATUS_PENDING] - these are new sound instances that were - created by events that had a "Start Sound Step". Note that these instances aren't audible yet, - so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_PLAYING)[MILESEVENT_SOUND_STATUS_PLAYING] - these are sound instances that were previously - started and are continuing to play (you might update the 3D position for these, for example). - - $(MILESEVENTSOUNDSTATUS::MILESEVENT_SOUND_STATUS_COMPLETE)[MILESEVENT_SOUND_STATUS_COMPLETE] - these are sound instances that finished playing - since the last this frame (you might use this status to free any game related memory, for example). - - Example Usage: -${ - HMSSENUM SoundEnum = MSS_FIRST; - MILESEVENTSOUNDINFO Info; - - while ( $AIL_enumerate_sound_instances( &SoundEnum, 0, 0, &Info ) ) - { - if ( Info.Status != MILESEVENT_SOUND_STATUS_COMPLETE ) - { - game_SoundState* game_data= (game_SoundState*)( Info.UserBuffer ); - $AIL_set_sample_is_3D( Info.Sample, 1 ); - $AIL_set_sample_3D_position( Info.Sample, game_data->x, game_data->y, game_date->z ); - } - } - -$} -*/ - -EXPTYPEBEGIN typedef S32 MILESEVENTSOUNDSTATUS; -#define MILESEVENT_SOUND_STATUS_PENDING 0x1 -#define MILESEVENT_SOUND_STATUS_PLAYING 0x2 -#define MILESEVENT_SOUND_STATUS_COMPLETE 0x4 -EXPTYPEEND -/* - Specifies the status of a sound instance. - - $:MILESEVENT_SOUND_STATUS_PENDING New sound instances that were - created by events that had a "Start Sound Step". Note that these instances aren't audible yet, - so that you have a chance to modify game driven properties (like the 3D position) - on the sound before Miles begins to play it. - - $:MILESEVENT_SOUND_STATUS_PLAYING Sound instances that were previously - started and are continuing to play (you might update the 3D position for these, for example). - - $:MILESEVENT_SOUND_STATUS_COMPLETE Sound instances that finished playing - since the last this frame (you might use this status to free any game related memory, for example). - - These are the status values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. -*/ - -EXPTYPEBEGIN typedef U32 MILESEVENTSOUNDFLAG; -#define MILESEVENT_SOUND_FLAG_MISSING_SOUND 0x1 -#define MILESEVENT_SOUND_FLAG_EVICTED 0x2 -#define MILESEVENT_SOUND_FLAG_WAITING_ASYNC 0x4 -#define MILESEVENT_SOUND_FLAG_PENDING_ASYNC 0x8 -#define MILESEVENT_SOUND_FLAG_FAILED_HITCH 0x10 -#define MILESEVENT_SOUND_FLAG_FAILED_ASYNC 0x20 -EXPTYPEEND -/* - Specifies the status of a sound instance. - - $:MILESEVENT_SOUND_FLAG_MISSING_SOUND The event system tried to look up the sound requested from a Start Sound event - and couldn't find anything in the loaded banks. - $:MILESEVENT_SOUND_FLAG_EVICTED The sound was evicted due to a sound instance limit being hit. Another sound was selected - as being higher priority, and this sound was stopped as a result. This can be the result of either a Label Sound Limit, - or a limit on the sound itself. - $:MILESEVENT_SOUND_FLAG_WAITING_ASYNC The sound is pending because the data for it is currently being loaded. - The sound will start when sufficient data has been loaded to hopefully avoid a skip. - $:MILESEVENT_SONUD_FLAG_PENDING_ASYNC The sound has started playing, but the data still isn't completely loaded, and it's possible - that the sound playback will catch up to the read position under poor I/O conditions. - $:MILESEVENT_SOUND_FLAG_FAILED_HITCH The sound meta data was found, but the sound was not in memory, and the Start Sound event - was marked as "Must Be Cached". To prevent this, either clear the flag in the event, which will cause a start delay as the - sound data is asynchronously loaded, or specify the sound in a Cache Sounds step prior to attempting to start it. - $:MILESEVENT_SOUND_FLAG_FAILED_ASYNC The sound tried to load and the asynchronous I/O operation failed - most likely either the media - was removed during load, or the file was not found. - - These are the flag values that each sound instance can have. Use $AIL_enumerate_sound_instances to retrieve them. Instances - may have more than one flag, logically 'or'ed together. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_complete_event_queue_processing( void ); -/* - Completes the queue processing (which is started with $AIL_begin_event_queue_processing ). - - $:return Returns 0 on failure. - - This function must be called as a pair with $AIL_begin_event_queue_processing. - - In $AIL_begin_event_queue_processing, all the new sound instances are queued up, but they haven't - started playing yet. Old sound instances that have finished playing are still valid - they - haven't been freed yet. $AIL_complete_event_queue_processing actually starts the sound instances - and frees the completed ones - it's the 2nd half of the event processing. - - Usually you call $AIL_enumerate_sound_instances before this function to manage all the sound - instances. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_stop_sound_instances(char const * label_query, U64 apply_to_ID); -/* - Allows the programmer to manually enqueue a stop sound event into the event system. - - $:label_query A query to match sound instance labels against. Use 0 to skip label matching. - $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that - tells Miles to stop only those instances who's QueuedID,InstanceID,or EventID matches this value. - $:return Returns a non-zero queue ID on success. - - Enqueues an event to stop all sounds matching the specified label query (see $AIL_enumerate_sound_instances - for a description of the label_query format). - - Usually the programmer should trigger a named event that the sound designed can fill out to stop the necessary sounds, - however, if a single sound (for example associated with an enemy that the player just killed) needs to be stopped, - this function accomplishes that, and is captured by the auditioner for replay. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_pause_sound_instances(char const * label_query, U64 apply_to_ID); -/* - Allows the programmer to manually enqueue a pause sound event into the event system. - - $:label_query A query to match sound instance labels against. Use 0 to skip label matching. - $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that - tells Miles to pause only those instances who's QueuedID,InstanceID,or EventID matches this value. - $:return Returns a non-zero queue ID on success. - - Enqueues an event to pause all sounds matching the specified label query (see $AIL_enumerate_sound_instances - for a description of the label_query format). - - Usually the programmer should trigger a named event that the sound designed can fill out to pause the necessary sounds, - however, if a single sound (for example associated with an enemy that has been put in to stasis) needs to be paused, - this function accomplishes that, and is captured by the auditioner for replay. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_resume_sound_instances(char const * label_query, U64 apply_to_ID); -/* - Allows the programmer to manually enqueue a resume sound event into the event system. - - $:label_query A query to match sound instance labels against. Use 0 to skip label matching. - $:apply_to_ID An optional value returned from a previous $AIL_enqueue_event or $AIL_enumerate_sound_instances that - tells Miles to resume only those instances who's QueuedID,InstanceID,or EventID matches this value. - $:return Returns a non-zero enqueue ID on success. - - Enqueues an event to resume all sounds matching the specified label query (see $AIL_enumerate_sound_instances - for a description of the label_query format). - - Usually the programmer should trigger a named event that the sound designed can fill out to resume the necessary sounds, - however, if a single sound (for example associated with an enemy that has been restored from stasis) needs to be resumed, - this function accomplishes that, and is captured by the auditioner for replay. -*/ - -DXDEC EXPAPI U64 AILCALL AIL_start_sound_instance(HMSOUNDBANK bank, char const * sound, U8 loop_count, - S32 should_stream, char const * labels, void* user_buffer, S32 user_buffer_len, S32 enqueue_flags ); -/* - Allows the programmer to manually enqueue a start sound event into the event system. - - $:bank The bank containing the sound to start. - $:sound The name of the sound file to start, including bank name, e.g. "BankName/SoundName" - $:loop_count The loop count to assign to the sound. 0 for infinite, 1 for play once, or just the number of times to loop. - $:stream Non-zero if the sound playback should stream off the disc. - $:labels An optional comma-delimited list of labels to assign to the sound playback. - $:user_buffer See the user_buffer description in $AIL_enqueue_event. - $:user_buffer_len See the user_buffer_len description in $AIL_enqueue_event. - $:enqueue_flags See the enqueue_flags description in $AIL_enqueue_event. - $:return Returns a non-zero EnqueueID on success. - - Enqueues an event to start the specified sound asset. - - Usually the programmer should trigger an event that the sound designer has specifically - create to start the appropriate sounds, but this function gives the programmer - manual control, if necessary. This function is not captured by the auditioner. -*/ - -DXDEC EXPAPI void AILCALL AIL_clear_event_queue( void ); -/* - Removes all pending events that you have enqueued. - - This function will clears the list of all events that you have previously enqueued. -*/ - - -DXDEC EXPAPI S32 AILCALL AIL_set_sound_label_limits(HEVENTSYSTEM system, char const* sound_limits); -/* - Sets the maximum number of sounds that matches a particular label. - - $:sound_limits A string that defines one or more limits on a label by label basis. The string should - be of the form "label1name label1count:label2name label2count". - $:return Returns 0 on failure (usually a bad limit string). - - Every time an event triggers a sound to be played, the sound limits are checked, and, if exceeded, a sound is dropped (based - on the settings in the event step). - - Usually event limits are set by a sound designer via an event, but this lets the programmer override the limits at runtime. - Note that this replaces those events, it does not supplement. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_enumerate_preset_persists(HEVENTSYSTEM system, HMSSENUM* next, EXPOUT char const ** name); -/* - Enumerates the current persisted presets that active in the system. - - $:system The system to enumerate the persists for, or 0 to use the default system. - $:next Enumeration token - initialize to MSS_FIRST before the first call. - $:name Pointer to a char* that receives the name of the persist. NOTE - that this pointer can change frame to frame and should be immediately copied to a client-allocated - buffer if persistence is desired. - $:return Returns 0 when enumeration is complete. - - This function lets you enumerate all the persisting presets that are currently active in the system. It - is mostly a debugging aid. -*/ - -DXDEC EXPAPI char * AILCALL AIL_text_dump_event_system(void); -/* - Returns a big string describing the current state of the event system. - - $:return String description of current systems state. - - This function is a debugging aid - it can be used to show all of the active allocations, - active sounds, etc. - - You must delete the pointer returned from this function with $AIL_mem_free_lock. -*/ - -EXPTYPE typedef struct _MILESEVENTSTATE -{ - S32 CommandBufferSize; - S32 HeapSize; - S32 HeapRemaining; - S32 LoadedSoundCount; - S32 PlayingSoundCount; - S32 LoadedBankCount; - S32 PersistCount; - - S32 SoundBankManagementMemory; - S32 SoundDataMemory; -} MILESEVENTSTATE; -/* - returns the current state of the Miles Event System. - - $:CommandBufferSize The size of the command buffer in bytes. See also the $AIL_startup_event_system. - $:HeapSize The total size of memory used by the event system for management structures, and is allocated during startup. This does not include loaded file sizes. - $:HeapRemaining The number of bytes in HeapSize that is remaining. - $:LoadedSoundCount The number of sounds loaded and ready to play via cache event steps. - $:PlayingSoundCount The number of sounds currently playing via start sound event steps. - $:LoadedBankCount The number of sound banks loaded in the system via cache event steps, or AIL_add_soundbank. - $:PersistCount The number of presets persisted via the persist event step. - $:SoundBankManagementMemory The number of bytes used for the management of the loaded sound banks. - $:SoundDataMemory The number of bytes used in file sizes - remember this is not included in HeapSize. Streaming overhead is not included in this number, only fully loaded sounds. - - This structure returns debugging info about the event system. It is used with $AIL_event_system_state. -*/ - -EXPGROUP(Miles High Level Callbacks) - -EXPAPI typedef void AILCALLBACK MilesBankFreeAll( void ); -/* - callback to free all user managed bank memory. -*/ - -EXPAPI typedef void * AILCALLBACK MilesBankGetPreset( char const * name ); -/* - callback to retrieve a sound preset. -*/ - -EXPAPI typedef void * AILCALLBACK MilesBankGetEnvironment( char const * name ); -/* - callback to retrieve an environment preset. -*/ -EXPAPI typedef S32 AILCALLBACK MilesBankGetSound(char const* SoundAssetName, char* SoundFileName, MILESBANKSOUNDINFO* o_SoundInfo ); -/* - callback to return whether the sound asset is in the bank, and, if so, what the final data filename is. - - In order to externally deploy sound files, you will need to register your own GetSound callback. This is detailed in the - eventexternal example program. - - This returns the len of the buffer required for the output file name if SoundFileName is zero. -*/ - -EXPAPI typedef void * AILCALLBACK MilesBankGetEvent( char const * name ); -/* - callback to retrieve an event. -*/ - -EXPAPI typedef void * AILCALLBACK MilesBankGetMarkerList( char const * name ); -/* - callback to retrieve a sound marker list. -*/ - -EXPAPI typedef S32 AILCALLBACK MilesBankGetLoadedCount( void ); -/* - callback to retrieve the number of loaded sound banks. -*/ - -EXPAPI typedef S32 AILCALLBACK MilesBankGetMemUsage( void ); -/* - callback to retrieve the total memory in use. -*/ - -EXPAPI typedef char const * AILCALLBACK MilesBankGetLoadedName( S32 index ); -/* - callback to retrieve the file name of a sound index. -*/ - - -EXPTYPE typedef struct _MILESBANKFUNCTIONS -{ - MilesBankFreeAll * FreeAll; - MilesBankGetPreset * GetPreset; - MilesBankGetEnvironment * GetEnvironment; - MilesBankGetSound * GetSound; - MilesBankGetEvent * GetEvent; - MilesBankGetMarkerList * GetMarkerList; - MilesBankGetLoadedCount * GetLoadedCount; - MilesBankGetMemUsage * GetMemUsage; - MilesBankGetLoadedName * GetLoadedName; -} MILESBANKFUNCTIONS; -/* - specifies callbacks for each of the Miles event system. - - $:FreeAll Callback that tells you to free all user-side bank memory. - $:GetPreset Callback to retrieve a sound preset. - $:GetEnvironment Callback to retrieve an environment preset. - $:GetSound Callback to return the actual filename of a sound asset. - $:GetEvent Callback to retrieve a sound event. - $:GetMarkerList Callback to retrieve a sound marker list. - $:GetLoadedCount Callback to retrieve a count of loaded sound banks. - $:GetMemUsage Callback to retrieve the amount of memory in use. - $:GetLoadedName Callback to retrieve the filename for a sound asset index. - - This structure is used to provide overrides for all of the high-level loading - functionality. -*/ - -EXPGROUP(Miles High Level Event System) - -DXDEC EXPAPI void AILCALL AIL_set_event_sample_functions(HSAMPLE (*CreateSampleCallback)(char const* SoundName, char const* SoundFileName, HDIGDRIVER dig, void* UserBuffer, S32 UserBufferLen), void (*ReleaseSampleCallback)(HSAMPLE)); -/* - Allows you to manage sound data availability and sample handles. - - $:CreateSampleCallback Function that will be called when a sample handle is needed. - $:ReleaseSampleCallback Function that will be called when a sample is no longer needed. - - A created sample is required to have all data pointers necessary to play - e.g. - the event system needs to be able to just do a AIL_start_sample() on the returned - handle and have it work. - - In the callback, SoundName is the name of the asset in Miles Studio, and SoundFileName - is the value returned from Container_GetSound() (see also $AIL_set_event_bank_functions). - -*/ - -DXDEC EXPAPI void AILCALL AIL_set_event_bank_functions(MILESBANKFUNCTIONS const * Functions); -/* - Allows you to override the internal bank file resource management.. - - $:Functions A pointer to a structure containing all the callback functions. - - This function is used to completely override the high-level resource management system. - It's not for overriding the IO - it's when you need much higher-level of control. Primarily - targeted internally for the Auditioner to use, it also is used when deploying sound files - externally. -*/ - -DXDEC EXPAPI MILESBANKFUNCTIONS const* AILCALL AIL_get_event_bank_functions(); -/* - Returns the current functions used to retrieve and poll bank assets. -*/ - - -typedef S32 AILCALLBACK AuditionStatus(); -typedef S32 AILCALLBACK AuditionPump(); -typedef void* AILCALLBACK AuditionOpenBank(char const* i_FileName); -typedef S32 AILCALLBACK AuditionOpenComplete(void* i_Bank); -typedef void AILCALLBACK AuditionCloseBank(void* i_Bank); - -typedef void AILCALLBACK AuditionSuppress(S32 i_IsSuppressed); -typedef void AILCALLBACK AuditionFrameStart(); -typedef void AILCALLBACK AuditionFrameEnd(); -typedef void AILCALLBACK AuditionDefragStart(); -typedef void AILCALLBACK AuditionSetBlend(U64 i_EventId, char const* i_Name); -typedef void AILCALLBACK AuditionSetPersist(U64 i_EventId, char const* i_Name, char const* i_Preset); -typedef void AILCALLBACK AuditionEvent(char const* i_EventName, U64 i_EventId, U64 i_Filter, S32 i_Exists, void* i_InitBlock, S32 i_InitBlockLen); -typedef void AILCALLBACK AuditionSound(U64 i_EventId, U64 i_SoundId, char const* i_Sound, char const* i_Labels, float i_Volume, S32 i_Delay, float i_Pitch); -typedef void AILCALLBACK AuditionSoundComplete(U64 i_SoundId); -typedef void AILCALLBACK AuditionSoundPlaying(U64 i_SoundId); -typedef void AILCALLBACK AuditionSoundFlags(U64 i_SoundId, S32 i_Flags); -typedef void AILCALLBACK AuditionSoundLimited(U64 i_SoundId, char const* i_Label); -typedef void AILCALLBACK AuditionSoundEvicted(U64 i_SoundId, U64 i_ForSound, S32 i_Reason); -typedef void AILCALLBACK AuditionControl(U64 i_EventId, char const* i_Labels, U8 i_ControlType, U64 i_Filter); -typedef void AILCALLBACK AuditionSoundBus(U64 i_SoundId, U8 i_BusIndex); - -typedef void AILCALLBACK AuditionError(U64 i_Id, char const* i_Details); - -typedef void AILCALLBACK AuditionAsyncQueued(U64 i_RelevantId, S32 i_AsyncId, char const* i_Asset); -typedef void AILCALLBACK AuditionAsyncLoad(S32 i_AsyncId, S32 i_ExpectedData); -typedef void AILCALLBACK AuditionAsyncError(S32 i_AsyncId); -typedef void AILCALLBACK AuditionAsyncComplete(S32 i_AsyncId, S32 i_DataLoaded); -typedef void AILCALLBACK AuditionAsyncCancel(S32 i_AsyncId); -typedef void AILCALLBACK AuditionListenerPosition(float x, float y, float z); -typedef void AILCALLBACK AuditionSoundPosition(U64 i_Sound, float x, float y, float z); -typedef void AILCALLBACK AuditionSendCPU(HDIGDRIVER i_Driver); -typedef void AILCALLBACK AuditionUpdateDataCount(S32 i_CurrentDataLoaded); -typedef void AILCALLBACK AuditionSendCount(S32 i_Count); -typedef void AILCALLBACK AuditionHandleSystemLoad(S32 i_Avail, S32 i_Total); -typedef void AILCALLBACK AuditionVarState(char const* i_Var, U64 i_SoundId, S32 i_Int, void* i_4ByteValue); -typedef void AILCALLBACK AuditionRampState(char const* i_Ramp, U64 i_SoundId, S32 i_Type, float i_Current); -typedef void AILCALLBACK AuditionSoundState(U64 i_SoundId, float i_FinalVol, float i_3DVol, float i_BlendVol, float i_BlendPitch, float i_RampVol, float i_RampWet, float i_RampLp, float i_RampRate); - -typedef void AILCALLBACK AuditionClearState(); -typedef void AILCALLBACK AuditionCompletionEvent(U64 i_CompletionEventId, U64 i_ParentSoundId); -typedef void AILCALLBACK AuditionAddRamp(U64 i_ParentSoundId, S32 i_Type, char const* i_Name, char const* i_Query, U64 i_EventId); - -typedef struct _MILESAUDITIONFUNCTIONS -{ - AuditionStatus* Status; - AuditionPump* Pump; - AuditionOpenBank* OpenBank; - AuditionOpenComplete* OpenComplete; - AuditionCloseBank* CloseBank; - - AuditionSuppress* Suppress; - AuditionFrameStart* FrameStart; - AuditionFrameEnd* FrameEnd; - AuditionDefragStart* DefragStart; - AuditionSetBlend* SetBlend; - AuditionSetPersist* SetPersist; - AuditionEvent* Event; - AuditionSound* Sound; - AuditionSoundComplete* SoundComplete; - AuditionSoundPlaying* SoundPlaying; - AuditionSoundFlags* SoundFlags; - AuditionSoundLimited* SoundLimited; - AuditionSoundEvicted* SoundEvicted; - AuditionControl* Control; - AuditionSoundBus* SoundBus; - - AuditionError* Error; - - AuditionAsyncQueued* AsyncQueued; - AuditionAsyncLoad* AsyncLoad; - AuditionAsyncError* AsyncError; - AuditionAsyncComplete* AsyncComplete; - AuditionAsyncCancel* AsyncCancel; - AuditionListenerPosition* ListenerPosition; - AuditionSoundPosition* SoundPosition; - AuditionSendCPU* SendCPU; - AuditionSendCount* SendCount; - AuditionUpdateDataCount* UpdateDataCount; - AuditionHandleSystemLoad* HandleSystemLoad; - AuditionVarState* VarState; - AuditionRampState* RampState; - AuditionSoundState* SoundState; - - AuditionClearState* ClearState; - AuditionCompletionEvent* CompletionEvent; - AuditionAddRamp* AddRamp; -} MILESAUDITIONFUNCTIONS; - -DXDEC void AILCALL MilesEventSetAuditionFunctions(MILESAUDITIONFUNCTIONS const* i_Functions); - -// Auditioner lib functions. -EXPGROUP(auditioning) - -EXPTYPEBEGIN typedef S32 MILESAUDITIONCONNECTRESULT; -#define MILES_CONNECTED 0 -#define MILES_CONNECT_FAILED 1 -#define MILES_HOST_NOT_FOUND 2 -#define MILES_SERVER_ERROR 3 -EXPTYPEEND -/* - Return values for $AIL_audition_connect. - - $:MILES_CONNECTED The Auditioner connected and successfully executed the handshake. - $:MILES_CONNECT_FAILED The Auditioner couldn't connect - either the IP wasn't valid, or Miles Sound Studio wasn't accepting connections. - $:MILES_HOST_NOT_FOUND The given host name could not be resolved to an IP. - $:MILES_SERVER_ERROR We connected, but the server was either another app on the same port, or the server version was incorrect. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_audition_connect(char const* i_Address); -/* - Connect to a currently running Miles Sound Studio. - - $:i_Address The IP or host name of the computer running Miles Sound Studio. Use $AIL_audition_local_host to connect to the same machine as the runtime. - $:return One of $MILESAUDITIONCONNECTRESULT - - The is a synchronous connection attempt to Miles Sound Studio - it will not return until it is happy with the connection - and the server, or a failure occurs. - - This must be called before any $AIL_add_soundbank calls. -*/ - -DXDEC EXPAPI char const* AILCALL AIL_audition_local_host(); -/* - Return the host name of the local machine. -*/ - -// Defines - must match values in studio/Common.h -EXPTYPEBEGIN typedef S32 MILESAUDITIONLANG; -#define MILES_LANG_ENGLISH 1 -#define MILES_LANG_FRENCH 2 -#define MILES_LANG_GERMAN 3 -#define MILES_LANG_SPANISH 4 -#define MILES_LANG_ITALIAN 5 -#define MILES_LANG_JAPANESE 6 -#define MILES_LANG_KOREAN 7 -#define MILES_LANG_CHINESE 8 -#define MILES_LANG_RUSSIAN 9 -EXPTYPEEND -/* - Values representing the various languages the high level tool allows. - - $:MILES_LANG_ENGLISH English - $:MILES_LANG_FRENCH French - $:MILES_LANG_GERMAN German - $:MILES_LANG_SPANISH Spanish - $:MILES_LANG_ITALIAN Italian - $:MILES_LANG_JAPANESE Japanese - $:MILES_LANG_KOREAN Korean - $:MILES_LANG_CHINESE Chinese - $:MILES_LANG_RUSSIAN Russian - - Values representing the various languages the high level tool allows. -*/ - -EXPTYPEBEGIN typedef S32 MILESAUDITIONPLAT; -#define MILES_PLAT_WIN 1 -#define MILES_PLAT_MAC 2 -#define MILES_PLAT_PS3 3 -#define MILES_PLAT_360 4 -#define MILES_PLAT_3DS 5 -#define MILES_PLAT_PSP 6 -#define MILES_PLAT_IPHONE 7 -#define MILES_PLAT_LINUX 8 -#define MILES_PLAT_WII 9 -#define MILES_PLAT_PSP2 10 -#define MILES_PLAT_WIIU 11 -#define MILES_PLAT_SEKRIT 12 -#define MILES_PLAT_SEKRIT2 13 -#define MILES_PLAT_WIN64 14 -#define MILES_PLAT_LINUX64 15 -#define MILES_PLAT_MAC64 16 -#define MILES_PLAT_WINRT32 17 -#define MILES_PLAT_WINRT64 18 -#define MILES_PLAT_WINPH32 19 -#define MILES_PLAT_ANDROID 20 - -EXPTYPEEND -/* - Values representing the various platforms the high level tool allows. - - $:MILES_PLAT_WIN Microsoft Win32/64 - $:MILES_PLAT_MAC Apple OSX - $:MILES_PLAT_PS3 Sony PS3 - $:MILES_PLAT_360 Microsoft XBox360 - $:MILES_PLAT_3DS Nintendo 3DS - $:MILES_PLAT_PSP Sony PSP - $:MILES_PLAT_IPHONE Apple iDevices - $:MILES_PLAT_LINUX Linux Flavors - $:MILES_PLAT_WII Nintendo Wii - $:MILES_PLAT_PSP2 Sony NGP - - Values representing the various platforms the high level tool allows. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_audition_startup(S32 i_ProfileOnly, S32 i_Language, S32 i_Platform); -/* - Binds the Auditioner to the Miles Event Runtime. - - $:i_ProfileOnly Specify 0 to use assets from the connected Miles Sound Studio, and 1 to use assets from disc. - $:i_Language One of $MILESAUDITIONLANG, or zero to use Default assets. See comments below. - $:i_Platform One of $MILESAUDITIONPLAT, or zero to use the current platform. See comments below. - - The Auditioner can run in one of two modes - the first is standard mode, where all assets - are loaded from the server, and profiling data is sent back to the server. The second is - Profiling mode, where the assets are loaded exactly as they would be under normal execution, - but all of the profiling data is sent to the server. - - The $(AIL_audition_startup::i_Language) and the $(AIL_audition_startup::i_Platform) are used to determine what assets Miles Sound Studio sends - the Auditioner, and as a result are not used in Profiling Mode. Otherwise these are equivalent to - the options selected for compiling banks. - - This must be called before any $AIL_add_soundbank calls. -*/ - -DXDEC EXPAPI void AILCALL AIL_audition_shutdown(); -/* - Removes the Auditioner from the Miles Event Runtime. -*/ - -EXPGROUP(Miles High Level Event System) - -DXDEC EXPAPI void AILCALL AIL_event_system_state(HEVENTSYSTEM system, MILESEVENTSTATE* state); -/* - Returns an information structure about the current state of the Miles Event System. - - $:system The system to retrieve information for, or zero for the default system. - $:state A pointer to a structure to receive the state information. - - This function is a debugging aid - it returns information for the event system. -*/ - -DXDEC EXPAPI U32 AILCALL AIL_event_system_command_queue_remaining(); -/* - Returns the number of bytes remaining in the command buffer. - - This can be invalid for a number of reasons - first, if the - command buffer will need to wrap for the next queue, the effective - bytes remaining will be lower. Second, if an enqueue occurs on another - thread in the interim, the value will be outdated. -*/ - -DXDEC EXPAPI S32 AILCALL AIL_get_event_length(char const* i_EventName); -/* - Returns the length of the first sound referenced in the named event, in milliseconds. - - $:i_EventName The name of an event that starts a sound. - $:return The length in milliseconds, or 0 if there is an error, or the event has no sound references, or the sound was not found. - - This looks up the given event and searches for the first Start Sound event step, then - uses the first sound name in its list to look up the length. As such, if the start sound - step has multiple sounds, the rest will be ignored. -*/ - -// Callback for the error handler. -EXPAPI typedef void AILCALLBACK AILEVENTERRORCB(S64 i_RelevantId, char const* i_Resource); -/* - The function prototype to use for a callback that will be made when the event system - encounters an unrecoverable error. - - $:i_RelevantId The ID of the asset that encountered the error, as best known. EventID or SoundID. - $:i_Resource A string representing the name of the resource the error is in regards to, or 0 if unknown. - - The error description can be retrieved via $AIL_last_error. -*/ - - - -EXPAPI typedef S32 AILCALLBACK MSS_USER_RAND( void ); -/* - The function definition to use when defining your own random function. - - You can define a function with this prototype and pass it to $AIL_register_random - if you want to tie the Miles random calls in with your game's (for logging and such). -*/ - -DXDEC EXPAPI void AILCALL AIL_set_event_error_callback(AILEVENTERRORCB * i_ErrorCallback); -/* - Set the error handler for the event system. - - $:i_ErrorHandler The function to call when an error is encountered. - - Generally the event system handles errors gracefully - the only noticeable effect - is that a given sound won't play, or a preset doesn't get set. As a result, the errors - can sometimes be somewhat invisible. This function allows you to see what went wrong, - when it went wrong. - - The basic usage is to have the callback check $AIL_last_error() for the overall category of - failure. The parameter passed to the callback might provide some context, but it can and will - be zero on occasion. Generally it will represent the resource string that is being worked on when the error - occurred. - - Note that there are two out of memory errors - one is the event system ran out of memory - meaning - the value passed in to $AIL_startup_event_system was insufficient for the current load, and - the other is the memory used for sound data - allocated via $AIL_mem_alloc_lock - ran out. -*/ - - -DXDEC EXPAPI void AILCALL AIL_register_random(MSS_USER_RAND * rand_func); -/* - Sets the function that Miles will call to obtain a random number. - - Use this function to set your own random function that the Miles Event System will call when it needs a random number. - This lets you control the determinism of the event system. -*/ - - - - -#ifdef MSS_FLT_SUPPORTED - -// -// Filter result codes -// - -typedef SINTa FLTRESULT; - -#define FLT_NOERR 0 // Success -- no error -#define FLT_NOT_ENABLED 1 // FLT not enabled -#define FLT_ALREADY_STARTED 2 // FLT already started -#define FLT_INVALID_PARAM 3 // Invalid parameters used -#define FLT_INTERNAL_ERR 4 // Internal error in FLT driver -#define FLT_OUT_OF_MEM 5 // Out of system RAM -#define FLT_ERR_NOT_IMPLEMENTED 6 // Feature not implemented -#define FLT_NOT_FOUND 7 // FLT supported device not found -#define FLT_NOT_INIT 8 // FLT not initialized -#define FLT_CLOSE_ERR 9 // FLT not closed correctly - -//############################################################################ -//## ## -//## Interface "MSS pipeline filter" (some functions shared by ## -//## "MSS voice filter") ## -//## ## -//############################################################################ - -typedef FLTRESULT (AILCALL *FLT_STARTUP)(void); - -typedef FLTRESULT (AILCALL *FLT_SHUTDOWN)(void); - -typedef C8 * (AILCALL *FLT_ERROR)(void); - -typedef HDRIVERSTATE (AILCALL *FLT_OPEN_DRIVER) (MSS_ALLOC_TYPE * palloc, - MSS_FREE_TYPE * pfree, - UINTa user, - HDIGDRIVER dig, void * memory); - -typedef FLTRESULT (AILCALL *FLT_CLOSE_DRIVER) (HDRIVERSTATE state); - -typedef void (AILCALL *FLT_PREMIX_PROCESS) (HDRIVERSTATE driver); - -typedef S32 (AILCALL *FLT_POSTMIX_PROCESS) (HDRIVERSTATE driver, void *output_buffer); - -//############################################################################ -//## ## -//## Interface "Pipeline filter sample services" ## -//## ## -//############################################################################ - -typedef HSAMPLESTATE (AILCALL * FLTSMP_OPEN_SAMPLE) (HDRIVERSTATE driver, - HSAMPLE S, - void * memory); - -typedef FLTRESULT (AILCALL * FLTSMP_CLOSE_SAMPLE) (HSAMPLESTATE state); - -typedef void (AILCALL * FLTSMP_SAMPLE_PROCESS) (HSAMPLESTATE state, - void * source_buffer, - void * dest_buffer, // may be the same as src - S32 n_samples, - S32 is_stereo ); - -typedef S32 (AILCALL * FLTSMP_SAMPLE_PROPERTY) (HSAMPLESTATE state, - HPROPERTY property, - void* before_value, - void const* new_value, - void* after_value - ); - -//############################################################################ -//## ## -//## Interface "MSS output filter" ## -//## ## -//############################################################################ - -typedef S32 (AILCALL * VFLT_ASSIGN_SAMPLE_VOICE) (HDRIVERSTATE driver, - HSAMPLE S); - -typedef void (AILCALL * VFLT_RELEASE_SAMPLE_VOICE) (HDRIVERSTATE driver, - HSAMPLE S); - -typedef S32 (AILCALL * VFLT_START_SAMPLE_VOICE) (HDRIVERSTATE driver, - HSAMPLE S); - -//############################################################################ -//## ## -//## Interface "Voice filter driver services" ## -//## ## -//############################################################################ - -typedef S32 (AILCALL * VDRV_DRIVER_PROPERTY) (HDRIVERSTATE driver, - HPROPERTY property, - void* before_value, - void const* new_value, - void* after_value - ); - -typedef S32 (AILCALL * VDRV_FORCE_UPDATE) (HDRIVERSTATE driver); - -//############################################################################ -//## ## -//## Interface "Voice filter sample services" ## -//## ## -//############################################################################ - -typedef S32 (AILCALL * VSMP_SAMPLE_PROPERTY) (HSAMPLE S, - HPROPERTY property, - void* before_value, - void const* new_value, - void* after_value - ); - -// -// Pipeline filter calls -// - -DXDEC HPROVIDER AILCALL AIL_digital_output_filter (HDIGDRIVER dig); - -DXDEC S32 AILCALL AIL_enumerate_filters (HMSSENUM *next, - HPROVIDER *dest, - C8 * *name); -DXDEC HDRIVERSTATE - AILCALL AIL_open_filter (HPROVIDER lib, - HDIGDRIVER dig); - -DXDEC void AILCALL AIL_close_filter (HDRIVERSTATE filter); - -DXDEC S32 AILCALL AIL_find_filter (C8 const *name, - HPROVIDER *ret); - -DXDEC S32 AILCALL AIL_enumerate_filter_properties - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -DXDEC S32 AILCALL AIL_filter_property (HPROVIDER lib, - C8 const* name, - void* before_value, - void const* new_value, - void* after_value - ); - -DXDEC S32 AILCALL AIL_enumerate_output_filter_driver_properties - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -DXDEC S32 AILCALL AIL_output_filter_driver_property - (HDIGDRIVER dig, - C8 const * name, - void* before_value, - void const* new_value, - void* after_value - ); - -DXDEC S32 AILCALL AIL_enumerate_output_filter_sample_properties - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -DXDEC S32 AILCALL AIL_enumerate_filter_sample_properties - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -DXDEC S32 AILCALL AIL_enumerate_sample_stage_properties - (HSAMPLE S, - SAMPLESTAGE stage, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -DXDEC S32 AILCALL AIL_sample_stage_property - (HSAMPLE S, - SAMPLESTAGE stage, - C8 const * name, - S32 channel, - void* before_value, - void const* new_value, - void* after_value - ); - -#define AIL_filter_sample_property(S,name,beforev,newv,afterv) AIL_sample_stage_property((S),SP_FILTER_0,(name),-1,(beforev),(newv),(afterv)) - -typedef struct _FLTPROVIDER -{ - S32 provider_flags; - S32 driver_size; - S32 sample_size; - - PROVIDER_PROPERTY PROVIDER_property; - - FLT_STARTUP startup; - FLT_ERROR error; - FLT_SHUTDOWN shutdown; - FLT_OPEN_DRIVER open_driver; - FLT_CLOSE_DRIVER close_driver; - FLT_PREMIX_PROCESS premix_process; - FLT_POSTMIX_PROCESS postmix_process; - - FLTSMP_OPEN_SAMPLE open_sample; - FLTSMP_CLOSE_SAMPLE close_sample; - FLTSMP_SAMPLE_PROCESS sample_process; - FLTSMP_SAMPLE_PROPERTY sample_property; - - VFLT_ASSIGN_SAMPLE_VOICE assign_sample_voice; - VFLT_RELEASE_SAMPLE_VOICE release_sample_voice; - VFLT_START_SAMPLE_VOICE start_sample_voice; - - VDRV_DRIVER_PROPERTY driver_property; - VDRV_FORCE_UPDATE force_update; - - VSMP_SAMPLE_PROPERTY output_sample_property; - - HDIGDRIVER dig; - HPROVIDER provider; - HDRIVERSTATE driver_state; - - struct _FLTPROVIDER *next; -} FLTPROVIDER; - -// -// Values for "Flags" property exported by all MSS Pipeline Filter and MSS Output Filter -// providers -// - -#define FPROV_ON_SAMPLES 0x0001 // Pipeline filter that operates on input samples (and is enumerated by AIL_enumerate_filters) -#define FPROV_ON_POSTMIX 0x0002 // Pipeline filter that operates on the post mixed output (capture filter) -#define FPROV_MATRIX 0x0004 // This is a matrix output filter (e.g., SRS/Dolby) -#define FPROV_VOICE 0x0008 // This is a per-voice output filter (e.g., DirectSound 3D) -#define FPROV_3D 0x0010 // Output filter uses S3D substructure for positioning -#define FPROV_OCCLUSION 0x0020 // Output filter supports occlusion (doesn't need per-sample lowpass) -#define FPROV_EAX 0x0040 // Output filter supports EAX-compatible environmental reverb -#define FPROV_SIDECHAIN 0x0080 // Filter has an "Input" property on the 3rd index for side chaining. - -#define FPROV_SPU_MASK 0xff0000 // Mask here the SPU INDEX STARTS -#define FPROV_SPU_INDEX( val ) ( ( val >> 16 ) & 0xff ) -#define FPROV_MAKE_SPU_INDEX( val ) ( val << 16 ) - - - -#ifdef IS_WIN32 - -#define MSS_EAX_AUTO_GAIN 1 -#define MSS_EAX_AUTOWAH 2 -#define MSS_EAX_CHORUS 3 -#define MSS_EAX_DISTORTION 4 -#define MSS_EAX_ECHO 5 -#define MSS_EAX_EQUALIZER 6 -#define MSS_EAX_FLANGER 7 -#define MSS_EAX_FSHIFTER 8 -#define MSS_EAX_VMORPHER 9 -#define MSS_EAX_PSHIFTER 10 -#define MSS_EAX_RMODULATOR 11 -#define MSS_EAX_REVERB 12 - -typedef struct EAX_SAMPLE_SLOT_VOLUME -{ - S32 Slot; // 0, 1, 2, 3 - S32 Send; - S32 SendHF; - S32 Occlusion; - F32 OcclusionLFRatio; - F32 OcclusionRoomRatio; - F32 OcclusionDirectRatio; -} EAX_SAMPLE_SLOT_VOLUME; - -typedef struct EAX_SAMPLE_SLOT_VOLUMES -{ - U32 NumVolumes; // 0, 1, or 2 - EAX_SAMPLE_SLOT_VOLUME volumes[ 2 ]; -} EAX_SAMPLE_SLOT_VOLUMES; - -// Use this structure for EAX REVERB -typedef struct EAX_REVERB -{ - S32 Effect; // set to MSS_EAX_REVERB - S32 Volume; // -10000 to 0 - U32 Environment; // one of the ENVIRONMENT_ enums - F32 EnvironmentSize; // environment size in meters - F32 EnvironmentDiffusion; // environment diffusion - S32 Room; // room effect level (at mid frequencies) - S32 RoomHF; // relative room effect level at high frequencies - S32 RoomLF; // relative room effect level at low frequencies - F32 DecayTime; // reverberation decay time at mid frequencies - F32 DecayHFRatio; // high-frequency to mid-frequency decay time ratio - F32 DecayLFRatio; // low-frequency to mid-frequency decay time ratio - S32 Reflections; // early reflections level relative to room effect - F32 ReflectionsDelay; // initial reflection delay time - F32 ReflectionsPanX; // early reflections panning vector - F32 ReflectionsPanY; // early reflections panning vector - F32 ReflectionsPanZ; // early reflections panning vector - S32 Reverb; // late reverberation level relative to room effect - F32 ReverbDelay; // late reverberation delay time relative to initial reflection - F32 ReverbPanX; // late reverberation panning vector - F32 ReverbPanY; // late reverberation panning vector - F32 ReverbPanZ; // late reverberation panning vector - F32 EchoTime; // echo time - F32 EchoDepth; // echo depth - F32 ModulationTime; // modulation time - F32 ModulationDepth; // modulation depth - F32 AirAbsorptionHF; // change in level per meter at high frequencies - F32 HFReference; // reference high frequency - F32 LFReference; // reference low frequency - F32 RoomRolloffFactor; // like DS3D flRolloffFactor but for room effect - U32 Flags; // modifies the behavior of properties -} EAX_REVERB; - -// Use this structure for EAX AUTOGAIN -typedef struct EAX_AUTOGAIN -{ - S32 Effect; // set to MSS_EAX_AUTO_GAIN - S32 Volume; // -10000 to 0 - U32 OnOff; // Switch Compressor on or off (1 or 0) -} EAX_AUTOGAIN; - -// Use this structure for EAX AUTOWAH -typedef struct EAX_AUTOWAH -{ - S32 Effect; // set to MSS_EAX_AUTOWAH - S32 Volume; // -10000 to 0 - F32 AttackTime; // Attack time (seconds) - F32 ReleaseTime; // Release time (seconds) - S32 Resonance; // Resonance (mB) - S32 PeakLevel; // Peak level (mB) -} EAX_AUTOWAH; - -// Use this structure for EAX CHORUS -typedef struct EAX_CHORUS -{ - S32 Effect; // set to MSS_EAX_CHORUS - S32 Volume; // -10000 to 0 - U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle - S32 Phase; // Phase (Degrees) - F32 Rate; // Rate (Hz) - F32 Depth; // Depth (0 to 1) - F32 Feedback; // Feedback (-1 to 1) - F32 Delay; // Delay (seconds) -} EAX_CHORUS; - -// Use this structure for EAX DISTORTION -typedef struct EAX_DISTORTION -{ - S32 Effect; // set to MSS_EAX_DISTORTION - S32 Volume; // -10000 to 0 - F32 Edge; // Controls the shape of the distortion (0 to 1) - S32 Gain; // Controls the post distortion gain (mB) - F32 LowPassCutOff; // Controls the cut-off of the filter pre-distortion (Hz) - F32 EQCenter; // Controls the center frequency of the EQ post-distortion (Hz) - F32 EQBandwidth; // Controls the bandwidth of the EQ post-distortion (Hz) -} EAX_DISTORTION; - -// Use this structure for EAX ECHO -typedef struct EAX_ECHO -{ - S32 Effect; // set to MSS_EAX_ECHO - S32 Volume; // -10000 to 0 - F32 Delay; // Controls the initial delay time (seconds) - F32 LRDelay; // Controls the delay time between the first and second taps (seconds) - F32 Damping; // Controls a low-pass filter that dampens the echoes (0 to 1) - F32 Feedback; // Controls the duration of echo repetition (0 to 1) - F32 Spread; // Controls the left-right spread of the echoes -} EAX_ECHO; - -// Use this structure for EAXEQUALIZER_ALLPARAMETERS -typedef struct EAX_EQUALIZER -{ - S32 Effect; // set to MSS_EAX_EQUALIZER - S32 Volume; // -10000 to 0 - S32 LowGain; // (mB) - F32 LowCutOff; // (Hz) - S32 Mid1Gain; // (mB) - F32 Mid1Center; // (Hz) - F32 Mid1Width; // (octaves) - F32 Mid2Gain; // (mB) - F32 Mid2Center; // (Hz) - F32 Mid2Width; // (octaves) - S32 HighGain; // (mB) - F32 HighCutOff; // (Hz) -} EAX_EQUALIZER; - -// Use this structure for EAX FLANGER -typedef struct EAX_FLANGER -{ - S32 Effect; // set to MSS_EAX_FLANGER - S32 Volume; // -10000 to 0 - U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle - S32 Phase; // Phase (Degrees) - F32 Rate; // Rate (Hz) - F32 Depth; // Depth (0 to 1) - F32 Feedback; // Feedback (0 to 1) - F32 Delay; // Delay (seconds) -} EAX_FLANGER; - - -// Use this structure for EAX FREQUENCY SHIFTER -typedef struct EAX_FSHIFTER -{ - S32 Effect; // set to MSS_EAX_FSHIFTER - S32 Volume; // -10000 to 0 - F32 Frequency; // (Hz) - U32 LeftDirection; // direction - 0 = down, 1 = up, 2 = off - U32 RightDirection; // direction - 0 = down, 1 = up, 2 = off -} EAX_FSHIFTER; - -// Use this structure for EAX VOCAL MORPHER -typedef struct EAX_VMORPHER -{ - S32 Effect; // set to MSS_EAX_VMORPHER - S32 Volume; // -10000 to 0 - U32 PhonemeA; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z - S32 PhonemeACoarseTuning; // (semitones) - U32 PhonemeB; // phoneme: 0 to 29 - A E I O U AA AE AH AO EH ER IH IY UH UW B D G J K L M N P R S T V Z - S32 PhonemeBCoarseTuning; // (semitones) - U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth - F32 Rate; // (Hz) -} EAX_VMORPHER; - - -// Use this structure for EAX PITCH SHIFTER -typedef struct EAX_PSHIFTER -{ - S32 Effect; // set to MSS_EAX_PSHIFTER - S32 Volume; // -10000 to 0 - S32 CoarseTune; // Amount of pitch shift (semitones) - S32 FineTune; // Amount of pitch shift (cents) -} EAX_PSHIFTER; - -// Use this structure for EAX RING MODULATOR -typedef struct EAX_RMODULATOR -{ - S32 Effect; // set to MSS_EAX_RMODULATOR - S32 Volume; // -10000 to 0 - F32 Frequency; // Frequency of modulation (Hz) - F32 HighPassCutOff; // Cut-off frequency of high-pass filter (Hz) - U32 Waveform; // Waveform selector - 0 = sinusoid, 1 = triangle, 2 = sawtooth -} EAX_RMODULATOR; - -#endif - -#else // MSS_FLT_SUPPORTED - -typedef struct _FLTPROVIDER -{ - U32 junk; -} FLTPROVIDER; - -#endif // MSS_FLT_SUPPORTED - -#endif // MSS_BASIC - -RADDEFEND - -#endif // MSS_H diff --git a/Minecraft.Client/Windows64/Miles/include/rrcore.h b/Minecraft.Client/Windows64/Miles/include/rrcore.h deleted file mode 100644 index 061f9c91..00000000 --- a/Minecraft.Client/Windows64/Miles/include/rrcore.h +++ /dev/null @@ -1,2322 +0,0 @@ -/// ======================================================================== -// (C) Copyright 1994- 2014 RAD Game Tools, Inc. Global types header file -// ======================================================================== - -#ifndef __RADRR_COREH__ -#define __RADRR_COREH__ -#define RADCOPYRIGHT "Copyright (C) 1994-2014, RAD Game Tools, Inc." - -// __RAD16__ means 16 bit code (Win16) -// __RAD32__ means 32 bit code (DOS, Win386, Win32s, Mac AND Win64) -// __RAD64__ means 64 bit code (x64) - -// Note oddness - __RAD32__ essentially means "at *least* 32-bit code". -// So, on 64-bit systems, both __RAD32__ and __RAD64__ will be defined. - -// __RADDOS__ means DOS code (16 or 32 bit) -// __RADWIN__ means Windows API (Win16, Win386, Win32s, Win64, Xbox, Xenon) -// __RADWINEXT__ means Windows 386 extender (Win386) -// __RADNT__ means Win32 or Win64 code -// __RADWINRTAPI__ means Windows RT API (Win 8, Win Phone, ARM, Durango) -// __RADMAC__ means Macintosh -// __RADCARBON__ means Carbon -// __RADMACH__ means MachO -// __RADXBOX__ means the XBox console -// __RADXENON__ means the Xenon console -// __RADDURANGO__ or __RADXBOXONE__ means Xbox One -// __RADNGC__ means the Nintendo GameCube -// __RADWII__ means the Nintendo Wii -// __RADWIIU__ means the Nintendo Wii U -// __RADNDS__ means the Nintendo DS -// __RADTWL__ means the Nintendo DSi (__RADNDS__ also defined) -// __RAD3DS__ means the Nintendo 3DS -// __RADPS2__ means the Sony PlayStation 2 -// __RADPSP__ means the Sony PlayStation Portable -// __RADPS3__ means the Sony PlayStation 3 -// __RADPS4__ means the Sony PlayStation 4 -// __RADANDROID__ means Android NDK -// __RADNACL__ means Native Client SDK -// __RADNTBUILDLINUX__ means building Linux on NT -// __RADLINUX__ means actually building on Linux (most likely with GCC) -// __RADPSP2__ means NGP -// __RADBSD__ means a BSD-style UNIX (OS X, FreeBSD, OpenBSD, NetBSD) -// __RADPOSIX__ means POSIX-compliant -// __RADQNX__ means QNX -// __RADIPHONE__ means iphone -// __RADIPHONESIM__ means iphone simulator - -// __RADX86__ means Intel x86 -// __RADMMX__ means Intel x86 MMX instructions are allowed -// __RADX64__ means Intel/AMD x64 (NOT IA64=Itanium) -// __RAD68K__ means 68K -// __RADPPC__ means PowerPC -// __RADMIPS__ means Mips (only R5900 right now) -// __RADARM__ mean ARM processors - -// __RADLITTLEENDIAN__ means processor is little-endian (x86) -// __RADBIGENDIAN__ means processor is big-endian (680x0, PPC) - -// __RADNOVARARGMACROS__ means #defines can't use ... - - #ifdef WINAPI_FAMILY - // If this is #defined, we might be in a Windows Store App. But - // VC++ by default #defines this to a symbolic name, not an integer - // value, and those names are defined in "winapifamily.h". So if - // WINAPI_FAMILY is #defined, #include the header so we can parse it. - #include - #define RAD_WINAPI_IS_APP (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) - #else - #define RAD_WINAPI_IS_APP 0 - #endif - - #ifndef __RADRES__ - // Theoretically, this is to pad structs on platforms that don't support pragma pack or do it poorly. (PS3, PS2) - // In general it is assumed that your padding is set via pragma, so this is just a struct. - #define RADSTRUCT struct - - #ifdef __GNUC_MINOR__ - // make a combined GCC version for testing : - - #define __RAD_GCC_VERSION__ (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - - /* Test for GCC > 3.2.0 */ - // #if GCC_VERSION > 30200 - #endif - - #if defined(__RADX32__) - - #define __RADX86__ - #define __RADMMX__ - #define __RAD32__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - // known platforms under the RAD generic build type - #if defined(_WIN32) || defined(_Windows) || defined(WIN32) || defined(__WINDOWS__) || defined(_WINDOWS) - #define __RADNT__ - #define __RADWIN__ - #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) - #define __RADMAC__ - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - #elif defined(__linux__) - #define __RADLINUX__ - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - #endif - -#elif defined(ANDROID) - #define __RADANDROID__ - #define __RAD32__ - #define __RADLITTLEENDIAN__ - #ifdef __i386__ - #define __RADX86__ - #else - #define __RADARM__ - #endif - #define RADINLINE inline - #define RADRESTRICT __restrict - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - -#elif defined(__QNX__) - #define __RAD32__ - #define __RADQNX__ - -#ifdef __arm__ - #define __RADARM__ -#elif defined __i386__ - #define __RADX86__ -#else - #error Unknown processor -#endif - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) -#elif defined(__linux__) && defined(__arm__) //This should pull in Raspberry Pi as well - - #define __RAD32__ - #define __RADLINUX__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - -#elif defined(__native_client__) - #define __RADNACL__ - #define __RAD32__ - #define __RADLITTLEENDIAN__ - #define __RADX86__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #elif defined(_DURANGO) || defined(_SEKRIT) || defined(_SEKRIT1) || defined(_XBOX_ONE) - - #define __RADDURANGO__ 1 - #define __RADXBOXONE__ 1 - #if !defined(__RADSEKRIT__) // keep sekrit around for a bit for compat - #define __RADSEKRIT__ 1 - #endif - - #define __RADWIN__ - #define __RAD32__ - #define __RAD64__ - #define __RADX64__ - #define __RADMMX__ - #define __RADX86__ - #define __RAD64REGS__ - #define __RADLITTLEENDIAN__ - #define RADINLINE __inline - #define RADRESTRICT __restrict - #define __RADWINRTAPI__ - - #elif defined(__ORBIS__) - - #define __RADPS4__ - #if !defined(__RADSEKRIT2__) // keep sekrit2 around for a bit for compat - #define __RADSEKRIT2__ 1 - #endif - #define __RAD32__ - #define __RAD64__ - #define __RADX64__ - #define __RADMMX__ - #define __RADX86__ - #define __RAD64REGS__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #elif defined(WINAPI_FAMILY) && RAD_WINAPI_IS_APP - - #define __RADWINRTAPI__ - #define __RADWIN__ - #define RADINLINE __inline - #define RADRESTRICT __restrict - - #if defined(_M_IX86) // WinRT on x86 - - #define __RAD32__ - #define __RADX86__ - #define __RADMMX__ - #define __RADLITTLEENDIAN__ - - #elif defined(_M_X64) // WinRT on x64 - #define __RAD32__ - #define __RAD64__ - #define __RADX86__ - #define __RADX64__ - #define __RADMMX__ - #define __RAD64REGS__ - #define __RADLITTLEENDIAN__ - - #elif defined(_M_ARM) // WinRT on ARM - - #define __RAD32__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - - #else - - #error Unrecognized WinRT platform! - - #endif - - #elif defined(_WIN64) - - #define __RADWIN__ - #define __RADNT__ - // See note at top for why both __RAD32__ and __RAD64__ are defined. - #define __RAD32__ - #define __RAD64__ - #define __RADX64__ - #define __RADMMX__ - #define __RADX86__ - #define __RAD64REGS__ - #define __RADLITTLEENDIAN__ - #define RADINLINE __inline - #define RADRESTRICT __restrict - - #elif defined(GENERIC_ARM) - - #define __RAD32__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - #define __RADFIXEDPOINT__ - #define RADINLINE inline - #if (defined(__GCC__) || defined(__GNUC__)) - #define RADRESTRICT __restrict - #else - #define RADRESTRICT // __restrict not supported on cw - #endif - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #elif defined(CAFE) // has to be before HOLLYWOOD_REV since it also defines it - - #define __RADWIIU__ - #define __RAD32__ - #define __RADPPC__ - #define __RADBIGENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - - #elif defined(HOLLYWOOD_REV) || defined(REVOLUTION) - - #define __RADWII__ - #define __RAD32__ - #define __RADPPC__ - #define __RADBIGENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #elif defined(NN_PLATFORM_CTR) - - #define __RAD3DS__ - #define __RAD32__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #elif defined(GEKKO) - - #define __RADNGC__ - #define __RAD32__ - #define __RADPPC__ - #define __RADBIGENDIAN__ - #define RADINLINE inline - #define RADRESTRICT // __restrict not supported on cw - - #elif defined(SDK_ARM9) || defined(SDK_TWL) || (defined(__arm) && defined(__MWERKS__)) - - #define __RADNDS__ - #define __RAD32__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - #define __RADFIXEDPOINT__ - #define RADINLINE inline - #if (defined(__GCC__) || defined(__GNUC__)) - #define RADRESTRICT __restrict - #else - #define RADRESTRICT // __restrict not supported on cw - #endif - - #if defined(SDK_TWL) - #define __RADTWL__ - #endif - - #elif defined(R5900) - - #define __RADPS2__ - #define __RAD32__ - #define __RADMIPS__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - #define __RAD64REGS__ - #define U128 u_long128 - - #if !defined(__MWERKS__) - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - #endif - - #elif defined(__psp__) - - #define __RADPSP__ - #define __RAD32__ - #define __RADMIPS__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #elif defined(__psp2__) - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #define __RADPSP2__ - #define __RAD32__ - #define __RADARM__ - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - - // need packed attribute for struct with snc? - #elif defined(__CELLOS_LV2__) - - // CB change : 10-29-10 : RAD64REGS on PPU but NOT SPU - - #ifdef __SPU__ - #define __RADSPU__ - #define __RAD32__ - #define __RADCELL__ - #define __RADBIGENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - #else - #define __RAD64REGS__ - #define __RADPS3__ - #define __RADPPC__ - #define __RAD32__ - #define __RADCELL__ - #define __RADBIGENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - #define __RADALTIVEC__ - #endif - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #ifndef __LP32__ - #error "PS3 32bit ABI support only" - #endif - #elif (defined(__MWERKS__) && !defined(__INTEL__)) || defined(__MRC__) || defined(THINK_C) || defined(powerc) || defined(macintosh) || defined(__powerc) || defined(__APPLE__) || defined(__MACH__) - #ifdef __APPLE__ - #include "TargetConditionals.h" - #endif - - #if ((defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || (defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR)) - - // iPhone/iPad/iOS - #define __RADIPHONE__ - #define __RADMACAPI__ - - #define __RAD32__ - #if defined(__x86_64__) - #define __RAD64__ - #endif - - #define __RADLITTLEENDIAN__ - #define RADINLINE inline - #define RADRESTRICT __restrict - #define __RADMACH__ - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR - #if defined( __x86_64__) - #define __RADX64__ - #else - #define __RADX86__ - #endif - #define __RADIPHONESIM__ - #elif defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE - #define __RADARM__ - #endif - #else - - // An actual MacOSX machine - #define __RADMAC__ - #define __RADMACAPI__ - - #if defined(powerc) || defined(__powerc) || defined(__ppc__) - #define __RADPPC__ - #define __RADBIGENDIAN__ - #define __RADALTIVEC__ - #define RADRESTRICT - #elif defined(__i386__) - #define __RADX86__ - #define __RADMMX__ - #define __RADLITTLEENDIAN__ - #define RADRESTRICT __restrict - #elif defined(__x86_64__) - #define __RAD32__ - #define __RAD64__ - #define __RADX86__ - #define __RADX64__ - #define __RAD64REGS__ - #define __RADMMX__ - #define __RADLITTLEENDIAN__ - #define RADRESTRICT __restrict - #else - #define __RAD68K__ - #define __RADBIGENDIAN__ - #define __RADALTIVEC__ - #define RADRESTRICT - #endif - - #define __RAD32__ - - #if defined(__MWERKS__) - #if (defined(__cplusplus) || ! __option(only_std_keywords)) - #define RADINLINE inline - #endif - #ifdef __MACH__ - #define __RADMACH__ - #endif - #elif defined(__MRC__) - #if defined(__cplusplus) - #define RADINLINE inline - #endif - #elif defined(__GNUC__) || defined(__GNUG__) || defined(__MACH__) - #define RADINLINE inline - #define __RADMACH__ - - #undef RADRESTRICT /* could have been defined above... */ - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - #endif - - #ifdef __RADX86__ - #ifndef __RADCARBON__ - #define __RADCARBON__ - #endif - #endif - - #ifdef TARGET_API_MAC_CARBON - #if TARGET_API_MAC_CARBON - #ifndef __RADCARBON__ - #define __RADCARBON__ - #endif - #endif - #endif - #endif - #elif defined(__linux__) - - #define __RADLINUX__ - #define __RADMMX__ - #define __RADLITTLEENDIAN__ - #define __RADX86__ - #ifdef __x86_64 - #define __RAD32__ - #define __RAD64__ - #define __RADX64__ - #define __RAD64REGS__ - #else - #define __RAD32__ - #endif - #define RADINLINE inline - #define RADRESTRICT __restrict - - #undef RADSTRUCT - #define RADSTRUCT struct __attribute__((__packed__)) - - #else - - #if _MSC_VER >= 1400 - #undef RADRESTRICT - #define RADRESTRICT __restrict - #else - #define RADRESTRICT - #define __RADNOVARARGMACROS__ - #endif - - #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) - // Remember that Xenon also defines _XBOX - #define __RADPPC__ - #define __RADBIGENDIAN__ - #define __RADALTIVEC__ - #else - #define __RADX86__ - #define __RADMMX__ - #define __RADLITTLEENDIAN__ - #endif - - #ifdef __MWERKS__ - #define _WIN32 - #endif - - #ifdef __DOS__ - #define __RADDOS__ - #define S64_DEFINED // turn off these types - #define U64_DEFINED - #define S64 double //should error - #define U64 double //should error - #define __RADNOVARARGMACROS__ - #endif - - #ifdef __386__ - #define __RAD32__ - #endif - - #ifdef _Windows //For Borland - #ifdef __WIN32__ - #define WIN32 - #else - #define __WINDOWS__ - #endif - #endif - - #ifdef _WINDOWS //For MS - #ifndef _WIN32 - #define __WINDOWS__ - #endif - #endif - - #ifdef _WIN32 - #if defined(_XENON) || ( defined(_XBOX_VER) && (_XBOX_VER == 200) ) - // Remember that Xenon also defines _XBOX - #define __RADXENON__ - #define __RAD64REGS__ - #elif defined(_XBOX) - #define __RADXBOX__ - #elif !defined(__RADWINRTAPI__) - #define __RADNT__ - #endif - #define __RADWIN__ - #define __RAD32__ - #else - #ifdef __NT__ - #if defined(_XENON) || (_XBOX_VER == 200) - // Remember that Xenon also defines _XBOX - #define __RADXENON__ - #define __RAD64REGS__ - #elif defined(_XBOX) - #define __RADXBOX__ - #else - #define __RADNT__ - #endif - #define __RADWIN__ - #define __RAD32__ - #else - #ifdef __WINDOWS_386__ - #define __RADWIN__ - #define __RADWINEXT__ - #define __RAD32__ - #define S64_DEFINED // turn off these types - #define U64_DEFINED - #define S64 double //should error - #define U64 double //should error - #else - #ifdef __WINDOWS__ - #define __RADWIN__ - #define __RAD16__ - #else - #ifdef WIN32 - #if defined(_XENON) || (_XBOX_VER == 200) - // Remember that Xenon also defines _XBOX - #define __RADXENON__ - #elif defined(_XBOX) - #define __RADXBOX__ - #else - #define __RADNT__ - #endif - #define __RADWIN__ - #define __RAD32__ - #endif - #endif - #endif - #endif - #endif - - #ifdef __WATCOMC__ - #define RADINLINE - #else - #define RADINLINE __inline - #endif - #endif - - #if defined __RADMAC__ || defined __RADIPHONE__ - #define __RADBSD__ - #endif - - #if defined __RADBSD__ || defined __RADLINUX__ - #define __RADPOSIX__ - #endif - - #if (!defined(__RADDOS__) && !defined(__RADWIN__) && !defined(__RADMAC__) && \ - !defined(__RADNGC__) && !defined(__RADNDS__) && !defined(__RADXBOX__) && \ - !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADPS4__) && !defined(__RADLINUX__) && !defined(__RADPS2__) && \ - !defined(__RADPSP__) && !defined(__RADPSP2__) && !defined(__RADPS3__) && !defined(__RADSPU__) && \ - !defined(__RADWII__) && !defined(__RADIPHONE__) && !defined(__RADX32__) && !defined(__RADARM__) && \ - !defined(__RADWIIU__) && !defined(__RADANDROID__) && !defined(__RADNACL__) && !defined (__RADQNX__) ) - #error "RAD.H did not detect your platform. Define DOS, WINDOWS, WIN32, macintosh, powerpc, or appropriate console." - #endif - - - #ifdef __RADFINAL__ - #define RADTODO(str) { char __str[0]=str; } - #else - #define RADTODO(str) - #endif - - #ifdef __RADX32__ - #if defined(_MSC_VER) - #define RADLINK __stdcall - #define RADEXPLINK __stdcall - #else - #define RADLINK __attribute__((stdcall)) - #define RADEXPLINK __attribute__((stdcall)) - #endif - #define RADEXPFUNC RADDEFFUNC - - #elif (defined(__RADNGC__) || defined(__RADWII__) || defined( __RADPS2__) || \ - defined(__RADPSP__) || defined(__RADPSP2__) || defined(__RADPS3__) || \ - defined(__RADSPU__) || defined(__RADNDS__) || defined(__RADIPHONE__) || \ - (defined(__RADARM__) && !defined(__RADWINRTAPI__)) || defined(__RADWIIU__) || defined(__RADPS4__) ) - - #define RADLINK - #define RADEXPLINK - #define RADEXPFUNC RADDEFFUNC - #define RADASMLINK - - #elif defined(__RADANDROID__) - #define RADLINK - #define RADEXPLINK - #define RADEXPFUNC RADDEFFUNC - #define RADASMLINK - #elif defined(__RADNACL__) - #define RADLINK - #define RADEXPLINK - #define RADEXPFUNC RADDEFFUNC - #define RADASMLINK - #elif defined(__RADLINUX__) || defined (__RADQNX__) - - #ifdef __RAD64__ - #define RADLINK - #define RADEXPLINK - #else - #define RADLINK __attribute__((cdecl)) - #define RADEXPLINK __attribute__((cdecl)) - #endif - - #define RADEXPFUNC RADDEFFUNC - #define RADASMLINK - - #elif defined(__RADMAC__) - - // this define is for CodeWarrior 11's stupid new libs (even though - // we don't use longlong's). - - #define __MSL_LONGLONG_SUPPORT__ - - #define RADLINK - #define RADEXPLINK - - #if defined(__CFM68K__) || defined(__MWERKS__) - #ifdef __RADINDLL__ - #define RADEXPFUNC RADDEFFUNC __declspec(export) - #else - #define RADEXPFUNC RADDEFFUNC __declspec(import) - #endif - #else - #if defined(__RADMACH__) && !defined(__MWERKS__) - #ifdef __RADINDLL__ - #define RADEXPFUNC RADDEFFUNC __attribute__((visibility("default"))) - #else - #define RADEXPFUNC RADDEFFUNC - #endif - #else - #define RADEXPFUNC RADDEFFUNC - #endif - #endif - #define RADASMLINK - - #else - - #ifdef __RADNT__ - #ifndef _WIN32 - #define _WIN32 - #endif - #ifndef WIN32 - #define WIN32 - #endif - #endif - - #ifdef __RADWIN__ - #ifdef __RAD32__ - - #ifdef __RADXBOX__ - - #define RADLINK __stdcall - #define RADEXPLINK __stdcall - #define RADEXPFUNC RADDEFFUNC - - #elif defined(__RADXENON__) || defined(__RADDURANGO__) - - #define RADLINK __stdcall - #define RADEXPLINK __stdcall - - #define RADEXPFUNC RADDEFFUNC - - #elif defined(__RADWINRTAPI__) - - #define RADLINK __stdcall - #define RADEXPLINK __stdcall - - #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) - #define RADEXPFUNC RADDEFFUNC - #else - #ifndef __RADINDLL__ - #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) - #else - #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) - #endif - #endif - - #elif defined(__RADNTBUILDLINUX__) - - #define RADLINK __cdecl - #define RADEXPLINK __cdecl - #define RADEXPFUNC RADDEFFUNC - - #else - #ifdef __RADNT__ - - #define RADLINK __stdcall - #define RADEXPLINK __stdcall - - #if ( defined(__RADINSTATICLIB__) || defined(__RADNOEXPORTS__ ) || ( defined(__RADNOEXEEXPORTS__) && ( !defined(__RADINDLL__) ) && ( !defined(__RADINSTATICLIB__) ) ) ) - #define RADEXPFUNC RADDEFFUNC - #else - #ifndef __RADINDLL__ - #define RADEXPFUNC RADDEFFUNC __declspec(dllimport) - #ifdef __BORLANDC__ - #if __BORLANDC__<=0x460 - #undef RADEXPFUNC - #define RADEXPFUNC RADDEFFUNC - #endif - #endif - #else - #define RADEXPFUNC RADDEFFUNC __declspec(dllexport) - #endif - #endif - #else - #define RADLINK __pascal - #define RADEXPLINK __far __pascal - #define RADEXPFUNC RADDEFFUNC - #endif - #endif - #else - #define RADLINK __pascal - #define RADEXPLINK __far __pascal __export - #define RADEXPFUNC RADDEFFUNC - #endif - #else - #define RADLINK __pascal - #define RADEXPLINK __pascal - #define RADEXPFUNC RADDEFFUNC - #endif - - #define RADASMLINK __cdecl - - #endif - - #if !defined(__RADXBOX__) && !defined(__RADXENON__) && !defined(__RADDURANGO__) && !defined(__RADXBOXONE__) - #ifdef __RADWIN__ - #ifndef _WINDOWS - #define _WINDOWS - #endif - #endif - #endif - - #ifdef __RADLITTLEENDIAN__ - #ifdef __RADBIGENDIAN__ - #error both endians !? - #endif - #endif - - #if !defined(__RADLITTLEENDIAN__) && !defined(__RADBIGENDIAN__) - #error neither endian! - #endif - - - //----------------------------------------------------------------- - - #ifndef RADDEFFUNC - - #ifdef __cplusplus - #define RADDEFFUNC extern "C" - #define RADDEFSTART extern "C" { - #define RADDEFEND } - #define RADDEFINEDATA extern "C" - #define RADDECLAREDATA extern "C" - #define RADDEFAULT( val ) =val - - #define RR_NAMESPACE rr - #define RR_NAMESPACE_START namespace RR_NAMESPACE { - #define RR_NAMESPACE_END }; - #define RR_NAMESPACE_USE using namespace RR_NAMESPACE; - - #else - #define RADDEFFUNC - #define RADDEFSTART - #define RADDEFEND - #define RADDEFINEDATA - #define RADDECLAREDATA extern - #define RADDEFAULT( val ) - - #define RR_NAMESPACE - #define RR_NAMESPACE_START - #define RR_NAMESPACE_END - #define RR_NAMESPACE_USE - - #endif - - #endif - - // probably s.b: RAD_DECLARE_ALIGNED(type, name, alignment) - #if (defined(__RADWII__) || defined(__RADWIIU__) || defined(__RADPSP__) || defined(__RADPSP2__) || \ - defined(__RADPS3__) || defined(__RADSPU__) || defined(__RADPS4__) || \ - defined(__RADLINUX__) || defined(__RADMAC__)) || defined(__RADNDS__) || defined(__RAD3DS__) || \ - defined(__RADIPHONE__) || defined(__RADANDROID__) || defined (__RADQNX__) - #define RAD_ALIGN(type,var,num) type __attribute__ ((aligned (num))) var - #elif (defined(__RADNGC__) || defined(__RADPS2__)) - #define RAD_ALIGN(type,var,num) __attribute__ ((aligned (num))) type var - #elif (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__RADWINRTAPI__) - #define RAD_ALIGN(type,var,num) type __declspec(align(num)) var - #else - // NOTE: / / is a guaranteed parse error in C/C++. - #define RAD_ALIGN(type,var,num) RAD_ALIGN_USED_BUT_NOT_DEFINED / / - #endif - - // WARNING : RAD_TLS should really only be used for debug/tools stuff - // it's not reliable because even if we are built as a lib, our lib can - // be put into a DLL and then it doesn't work - #if defined(__RADNT__) || defined(__RADXENON__) - #ifndef __RADINDLL__ - // note that you can't use this in windows DLLs - #define RAD_TLS(type,var) __declspec(thread) type var - #endif - #elif defined(__RADPS3__) || defined(__RADLINUX__) || defined(__RADMAC__) - // works on PS3/gcc I believe : - #define RAD_TLS(type,var) __thread type var - #else - // RAD_TLS not defined - #endif - - // Note that __RAD16__/__RAD32__/__RAD64__ refers to the size of a pointer. - // The size of integers is specified explicitly in the code, i.e. u32 or whatever. - - #define RAD_S8 signed char - #define RAD_U8 unsigned char - - #if defined(__RAD64__) - // Remember that __RAD32__ will also be defined! - #if defined(__RADX64__) - // x64 still has 32-bit ints! - #define RAD_U32 unsigned int - #define RAD_S32 signed int - // But pointers are 64 bits. - #if (_MSC_VER >= 1300 && defined(_Wp64) && _Wp64 ) - #define RAD_SINTa __w64 signed __int64 - #define RAD_UINTa __w64 unsigned __int64 - #else // non-vc.net compiler or /Wp64 turned off - #define RAD_UINTa unsigned long long - #define RAD_SINTa signed long long - #endif - #else - #error Unknown 64-bit processor (see radbase.h) - #endif - #elif defined(__RAD32__) - #define RAD_U32 unsigned int - #define RAD_S32 signed int - // Pointers are 32 bits. - - #if ( ( defined(_MSC_VER) && (_MSC_VER >= 1300 ) ) && ( defined(_Wp64) && ( _Wp64 ) ) ) - #define RAD_SINTa __w64 signed long - #define RAD_UINTa __w64 unsigned long - #else // non-vc.net compiler or /Wp64 turned off - #ifdef _Wp64 - #define RAD_SINTa signed long - #define RAD_UINTa unsigned long - #else - #define RAD_SINTa signed int - #define RAD_UINTa unsigned int - #endif - #endif - #else - #define RAD_U32 unsigned long - #define RAD_S32 signed long - // Pointers in 16-bit land are still 32 bits. - #define RAD_UINTa unsigned long - #define RAD_SINTa signed long - #endif - - #define RAD_F32 float - #if defined(__RADPS2__) || defined(__RADPSP__) - typedef RADSTRUCT RAD_F64 // do this so that we don't accidentally use doubles - { // while using the same space - RAD_U32 vals[ 2 ]; - } RAD_F64; - #define RAD_F64_OR_32 float // type is F64 if available, otherwise F32 - #else - #define RAD_F64 double - #define RAD_F64_OR_32 double // type is F64 if available, otherwise F32 - #endif - - #if (defined(__RADMAC__) || defined(__MRC__) || defined( __RADNGC__ ) || \ - defined(__RADLINUX__) || defined( __RADWII__ ) || defined(__RADWIIU__) || \ - defined(__RADNDS__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADPS4__) || \ - defined(__RADSPU__) || defined(__RADIPHONE__) || defined(__RADNACL__) || defined( __RADANDROID__) || defined( __RADQNX__ ) ) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long - #elif defined(__RADPS2__) - #define RAD_U64 unsigned long - #define RAD_S64 signed long - #elif defined(__RADARM__) - #define RAD_U64 unsigned long long - #define RAD_S64 signed long long - #elif defined(__RADX64__) || defined(__RAD32__) - #define RAD_U64 unsigned __int64 - #define RAD_S64 signed __int64 - #else - // 16-bit - typedef RADSTRUCT RAD_U64 // do this so that we don't accidentally use U64s - { // while using the same space - RAD_U32 vals[ 2 ]; - } RAD_U64; - typedef RADSTRUCT RAD_S64 // do this so that we don't accidentally use S64s - { // while using the same space - RAD_S32 vals[ 2 ]; - } RAD_S64; - #endif - - #if defined(__RAD32__) - #define PTR4 - #define RAD_U16 unsigned short - #define RAD_S16 signed short - #else - #define PTR4 __far - #define RAD_U16 unsigned int - #define RAD_S16 signed int - #endif - - //------------------------------------------------- - // RAD_PTRBITS and such defined here without using sizeof() - // so that they can be used in align() and other macros - - #ifdef __RAD64__ - - #define RAD_PTRBITS 64 - #define RAD_PTRBYTES 8 - #define RAD_TWOPTRBYTES 16 - - #else - - #define RAD_PTRBITS 32 - #define RAD_PTRBYTES 4 - #define RAD_TWOPTRBYTES 8 - - #endif - - - //------------------------------------------------- - // UINTr = int the size of a register - - #ifdef __RAD64REGS__ - - #define RAD_UINTr RAD_U64 - #define RAD_SINTr RAD_S64 - - #else - - #define RAD_UINTr RAD_U32 - #define RAD_SINTr RAD_S32 - - #endif - - //=========================================================================== - - /* - // CB : meh this is enough of a mess that it's probably best to just let each - #if defined(__RADX86__) && defined(_MSC_VER) && _MSC_VER >= 1300 - #define __RADX86INTRIN2003__ - #endif - */ - - // RADASSUME(expr) tells the compiler that expr is always true - // RADUNREACHABLE must never be reachable - even in event of error - // eg. it's okay for compiler to generate completely invalid code after RADUNREACHABLE - - #ifdef _MSC_VER - #define RADFORCEINLINE __forceinline - #if _MSC_VER >= 1300 - #define RADNOINLINE __declspec(noinline) - #else - #define RADNOINLINE - #endif - #define RADUNREACHABLE __assume(0) - #define RADASSUME(exp) __assume(exp) - #elif defined(__clang__) - #ifdef _DEBUG - #define RADFORCEINLINE inline - #else - #define RADFORCEINLINE inline __attribute((always_inline)) - #endif - #define RADNOINLINE __attribute__((noinline)) - - #define RADUNREACHABLE __builtin_unreachable() - - #if __has_builtin(__builtin_assume) - #define RADASSUME(exp) __builtin_assume(exp) - #else - #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) - #endif - #elif (defined(__GCC__) || defined(__GNUC__)) || defined(ANDROID) - #ifdef _DEBUG - #define RADFORCEINLINE inline - #else - #define RADFORCEINLINE inline __attribute((always_inline)) - #endif - #define RADNOINLINE __attribute__((noinline)) - - #if __RAD_GCC_VERSION__ >= 40500 - #define RADUNREACHABLE __builtin_unreachable() - #define RADASSUME(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) __builtin_unreachable(); ) - #else - #define RADUNREACHABLE RAD_INFINITE_LOOP( RR_BREAK(); ) - #define RADASSUME(exp) - #endif - #elif defined(__CWCC__) - #define RADFORCEINLINE inline - #define RADNOINLINE __attribute__((never_inline)) - #define RADUNREACHABLE - #define RADASSUME(x) (void)0 - #else - // ? #define RADFORCEINLINE ? - #define RADFORCEINLINE inline - #define RADNOINLINE - #define RADASSUME(x) (void)0 - #endif - - //=========================================================================== - - // RAD_ALIGN_HINT tells the compiler how a given pointer is aligned - // it *must* be true, but the compiler may or may not use that information - // it is not for cases where the pointer is to an inherently aligned data type, - // it's when the compiler cannot tell the alignment but you have extra information. - // eg : - // U8 * ptr = rrMallocAligned(256,16); - // RAD_ALIGN_HINT(ptr,16,0); - - #ifdef __RADSPU__ - #define RAD_ALIGN_HINT(ptr,alignment,offset) __align_hint(ptr,alignment,offset); RR_ASSERT( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) - #else - #define RAD_ALIGN_HINT(ptr,alignment,offset) RADASSUME( ((UINTa)(ptr) & ((alignment)-1)) == (UINTa)(offset) ) - #endif - - //=========================================================================== - - // RAD_EXPECT is to tell the compiler the *likely* value of an expression - // different than RADASSUME in that expr might not have that value - // it's use for branch code layout and static branch prediction - // condition can technically be a variable but should usually be 0 or 1 - - #if (defined(__GCC__) || defined(__GNUC__)) || defined(__clang__) - - // __builtin_expect returns value of expr - #define RAD_EXPECT(expr,cond) __builtin_expect(expr,cond) - - #else - - #define RAD_EXPECT(expr,cond) (expr) - - #endif - - // helpers for doing an if ( ) with expect : - // if ( RAD_LIKELY(expr) ) { ... } - - #define RAD_LIKELY(expr) RAD_EXPECT(expr,1) - #define RAD_UNLIKELY(expr) RAD_EXPECT(expr,0) - - //=========================================================================== - - // __RADX86ASM__ means you can use __asm {} style inline assembly - #if defined(__RADX86__) && !defined(__RADX64__) && defined(_MSC_VER) - #define __RADX86ASM__ - #endif - - //------------------------------------------------- - // typedefs : - - #ifndef RADNOTYPEDEFS - - #ifndef S8_DEFINED - #define S8_DEFINED - typedef RAD_S8 S8; - #endif - - #ifndef U8_DEFINED - #define U8_DEFINED - typedef RAD_U8 U8; - #endif - - #ifndef S16_DEFINED - #define S16_DEFINED - typedef RAD_S16 S16; - #endif - - #ifndef U16_DEFINED - #define U16_DEFINED - typedef RAD_U16 U16; - #endif - - #ifndef S32_DEFINED - #define S32_DEFINED - typedef RAD_S32 S32; - #endif - - #ifndef U32_DEFINED - #define U32_DEFINED - typedef RAD_U32 U32; - #endif - - #ifndef S64_DEFINED - #define S64_DEFINED - typedef RAD_S64 S64; - #endif - - #ifndef U64_DEFINED - #define U64_DEFINED - typedef RAD_U64 U64; - #endif - - #ifndef F32_DEFINED - #define F32_DEFINED - typedef RAD_F32 F32; - #endif - - #ifndef F64_DEFINED - #define F64_DEFINED - typedef RAD_F64 F64; - #endif - - #ifndef F64_OR_32_DEFINED - #define F64_OR_32_DEFINED - typedef RAD_F64_OR_32 F64_OR_32; - #endif - - // UINTa and SINTa are the ints big enough for an address - - #ifndef SINTa_DEFINED - #define SINTa_DEFINED - typedef RAD_SINTa SINTa; - #endif - - #ifndef UINTa_DEFINED - #define UINTa_DEFINED - typedef RAD_UINTa UINTa; - #endif - - #ifndef UINTr_DEFINED - #define UINTr_DEFINED - typedef RAD_UINTr UINTr; - #endif - - #ifndef SINTr_DEFINED - #define SINTr_DEFINED - typedef RAD_SINTr SINTr; - #endif - - #elif !defined(RADNOTYPEDEFINES) - - #ifndef S8_DEFINED - #define S8_DEFINED - #define S8 RAD_S8 - #endif - - #ifndef U8_DEFINED - #define U8_DEFINED - #define U8 RAD_U8 - #endif - - #ifndef S16_DEFINED - #define S16_DEFINED - #define S16 RAD_S16 - #endif - - #ifndef U16_DEFINED - #define U16_DEFINED - #define U16 RAD_U16 - #endif - - #ifndef S32_DEFINED - #define S32_DEFINED - #define S32 RAD_S32 - #endif - - #ifndef U32_DEFINED - #define U32_DEFINED - #define U32 RAD_U32 - #endif - - #ifndef S64_DEFINED - #define S64_DEFINED - #define S64 RAD_S64 - #endif - - #ifndef U64_DEFINED - #define U64_DEFINED - #define U64 RAD_U64 - #endif - - #ifndef F32_DEFINED - #define F32_DEFINED - #define F32 RAD_F32 - #endif - - #ifndef F64_DEFINED - #define F64_DEFINED - #define F64 RAD_F64 - #endif - - #ifndef F64_OR_32_DEFINED - #define F64_OR_32_DEFINED - #define F64_OR_32 RAD_F64_OR_32 - #endif - - // UINTa and SINTa are the ints big enough for an address (pointer) - #ifndef SINTa_DEFINED - #define SINTa_DEFINED - #define SINTa RAD_SINTa - #endif - - #ifndef UINTa_DEFINED - #define UINTa_DEFINED - #define UINTa RAD_UINTa - #endif - - #ifndef UINTr_DEFINED - #define UINTr_DEFINED - #define UINTr RAD_UINTr - #endif - - #ifndef SINTr_DEFINED - #define SINTr_DEFINED - #define SINTr RAD_SINTr - #endif - - #endif - - /// Some error-checking. - #if defined(__RAD64__) && !defined(__RAD32__) - // See top of file for why this is. - #error __RAD64__ must not be defined without __RAD32__ (see radbase.h) - #endif - -#ifdef _MSC_VER - // microsoft compilers - - #if _MSC_VER >= 1400 - #define RAD_STATEMENT_START \ - do { - - #define RAD_STATEMENT_END_FALSE \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - } while(0) \ - __pragma(warning(pop)) - - #define RAD_STATEMENT_END_TRUE \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - } while(1) \ - __pragma(warning(pop)) - - #else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT - #endif -#else - #define RAD_USE_STANDARD_LOOP_CONSTRUCT -#endif - -#ifdef RAD_USE_STANDARD_LOOP_CONSTRUCT - #define RAD_STATEMENT_START \ - do { - - #define RAD_STATEMENT_END_FALSE \ - } while ( (void)0,0 ) - - #define RAD_STATEMENT_END_TRUE \ - } while ( (void)1,1 ) - -#endif - -#define RAD_STATEMENT_WRAPPER( code ) \ - RAD_STATEMENT_START \ - code \ - RAD_STATEMENT_END_FALSE - -#define RAD_INFINITE_LOOP( code ) \ - RAD_STATEMENT_START \ - code \ - RAD_STATEMENT_END_TRUE - - -// Must be placed after variable declarations for code compiled as .c -#if defined(_MSC_VER) && _MSC_VER >= 1700 // in 2012 aka 11.0 and later -# define RR_UNUSED_VARIABLE(x) (void) x -#else -# define RR_UNUSED_VARIABLE(x) (void)(sizeof(x)) -#endif - -//----------------------------------------------- -// RR_UINT3264 is a U64 in 64-bit code and a U32 in 32-bit code -// eg. it's pointer sized and the same type as a U32/U64 of the same size -// -// @@ CB 05/21/2012 : I think RR_UINT3264 may be deprecated -// it was useful back when UINTa was /Wp64 -// but since we removed that maybe it's not anymore ? -// - -#ifdef __RAD64__ -#define RR_UINT3264 U64 -#else -#define RR_UINT3264 U32 -#endif - -//RR_COMPILER_ASSERT( sizeof(RR_UINT3264) == sizeof(UINTa) ); - -//-------------------------------------------------- - -// RR_LINESTRING is the current line number as a string -#define RR_STRINGIZE( L ) #L -#define RR_DO_MACRO( M, X ) M(X) -#define RR_STRINGIZE_DELAY( X ) RR_DO_MACRO( RR_STRINGIZE, X ) -#define RR_LINESTRING RR_STRINGIZE_DELAY( __LINE__ ) - -#define RR_CAT(X,Y) X ## Y - -// RR_STRING_JOIN joins strings in the preprocessor and works with LINESTRING -#define RR_STRING_JOIN(arg1, arg2) RR_STRING_JOIN_DELAY(arg1, arg2) -#define RR_STRING_JOIN_DELAY(arg1, arg2) RR_STRING_JOIN_IMMEDIATE(arg1, arg2) -#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2) arg1 ## arg2 - -// RR_NUMBERNAME is a macro to make a name unique, so that you can use it to declare -// variable names and they won't conflict with each other -// using __LINE__ is broken in MSVC with /ZI , but __COUNTER__ is an MSVC extension that works - -#ifdef _MSC_VER - #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__) -#else - #define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__) -#endif - -//-------------------------------------------------- -// current plan is to use "rrbool" with plain old "true" and "false" -// if true and false give us trouble we might have to go to rrtrue and rrfalse -// BTW there's a danger for evil bugs here !! If you're checking == true -// then the rrbool must be set to exactly "1" not just "not zero" !! - -#ifndef RADNOTYPEDEFS - #ifndef RRBOOL_DEFINED - #define RRBOOL_DEFINED - typedef S32 rrbool; - typedef S32 RRBOOL; - #endif -#elif !defined(RADNOTYPEDEFINES) - #ifndef RRBOOL_DEFINED - #define RRBOOL_DEFINED - #define rrbool S32 - #define RRBOOL S32 - #endif -#endif - -//-------------------------------------------------- -// Range macros - - #ifndef RR_MIN - #define RR_MIN(a,b) ( (a) < (b) ? (a) : (b) ) - #endif - - #ifndef RR_MAX - #define RR_MAX(a,b) ( (a) > (b) ? (a) : (b) ) - #endif - - #ifndef RR_ABS - #define RR_ABS(a) ( ((a) < 0) ? -(a) : (a) ) - #endif - - #ifndef RR_CLAMP - #define RR_CLAMP(val,lo,hi) RR_MAX( RR_MIN(val,hi), lo ) - #endif - -//-------------------------------------------------- -// Data layout macros - - #define RR_ARRAY_SIZE(array) ( sizeof(array)/sizeof(array[0]) ) - - // MEMBER_OFFSET tells you the offset of a member in a type - #ifdef __RAD3DS__ - #define RR_MEMBER_OFFSET(type,member) (unsigned int)(( (char *) &(((type *)0)->member) - (char *) 0 )) - #elif defined(__RADANDROID__) || defined(__RADPSP__) || defined(__RADPS3__) || defined(__RADSPU__) - // offsetof() gets mucked with by system headers on android, making things dependent on #include order. - #define RR_MEMBER_OFFSET(type,member) __builtin_offsetof(type, member) - #elif defined(__RADLINUX__) - #define RR_MEMBER_OFFSET(type,member) (offsetof(type, member)) - #else - #define RR_MEMBER_OFFSET(type,member) ( (size_t) (UINTa) &(((type *)0)->member) ) - #endif - - // MEMBER_SIZE tells you the size of a member in a type - #define RR_MEMBER_SIZE(type,member) ( sizeof( ((type *) 0)->member) ) - - // just to make gcc shut up about derefing null : - #define RR_MEMBER_OFFSET_PTR(type,member,ptr) ( (SINTa) &(((type *)(ptr))->member) - (SINTa)(ptr) ) - #define RR_MEMBER_SIZE_PTR(type,member,ptr) ( sizeof( ((type *) (ptr))->member) ) - - // MEMBER_TO_OWNER takes a pointer to a member and gives you back the base of the object - // you should then RR_ASSERT( &(ret->member) == ptr ); - #define RR_MEMBER_TO_OWNER(type,member,ptr) (type *)( ((char *)(ptr)) - RR_MEMBER_OFFSET_PTR(type,member,ptr) ) - -//-------------------------------------------------- -// Cache / prefetch macros : - -// RR_PREFETCH for various platforms : -// -// RR_PREFETCH_SEQUENTIAL : prefetch memory for reading in a sequential scan -// platforms that automatically prefetch sequential (eg. PC) should be a no-op here -// RR_PREFETCH_WRITE_INVALIDATE : prefetch memory for writing - contents of memory are undefined -// (may be a no-op, may be a normal prefetch, may zero memory) -// warning : RR_PREFETCH_WRITE_INVALIDATE may write memory so don't do it past the end of buffers - -#ifdef __RADX86__ - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // nop -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop - -#elif defined(__RADXENON__) - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((int)(offset),(void *)(ptr)) -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz128((int)(offset),(void *)(ptr)) - -#elif defined(__RADPS3__) - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __dcbt((char *)(ptr) + (int)(offset)) -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __dcbz((char *)(ptr) + (int)(offset)) - -#elif defined(__RADSPU__) - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop - -#elif defined(__RADWII__) || defined(__RADWIIU__) - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // intentional NOP for now -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // nop - -#elif defined(__RAD3DS__) - -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) __pld((char *)(ptr) + (int)(offset)) -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) __pldw((char *)(ptr) + (int)(offset)) - -#else - -// other platform -#define RR_PREFETCH_SEQUENTIAL(ptr,offset) // need_prefetch // compile error -#define RR_PREFETCH_WRITE_INVALIDATE(ptr,offset) // need_writezero // error - -#endif - -//-------------------------------------------------- -// LIGHTWEIGHT ASSERTS without rrAssert.h - -RADDEFSTART - -// set up RR_BREAK : - - #ifdef __RADNGC__ - - #define RR_BREAK() asm(" .long 0x00000001") - #define RR_CACHE_LINE_SIZE xxx - - #elif defined(__RADWII__) - - #define RR_BREAK() __asm__ volatile("trap") - #define RR_CACHE_LINE_SIZE 32 - - #elif defined(__RADWIIU__) - - #define RR_BREAK() asm("trap") - #define RR_CACHE_LINE_SIZE 32 - - #elif defined(__RAD3DS__) - - #define RR_BREAK() *((int volatile*)0)=0 - #define RR_CACHE_LINE_SIZE 32 - - #elif defined(__RADNDS__) - - #define RR_BREAK() asm("BKPT 0") - #define RR_CACHE_LINE_SIZE xxx - - #elif defined(__RADPS2__) - - #define RR_BREAK() __asm__ volatile("break") - #define RR_CACHE_LINE_SIZE 64 - - #elif defined(__RADPSP__) - - #define RR_BREAK() __asm__("break 0") - #define RR_CACHE_LINE_SIZE 64 - - #elif defined(__RADPSP2__) - - #define RR_BREAK() { __asm__ volatile("bkpt 0x0000"); } - #define RR_CACHE_LINE_SIZE 32 - - #elif defined (__RADQNX__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 32 - #elif defined (__RADARM__) && defined (__RADLINUX__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 32 - #elif defined(__RADSPU__) - - #define RR_BREAK() __asm volatile ("stopd 0,1,1") - #define RR_CACHE_LINE_SIZE 128 - - #elif defined(__RADPS3__) - - // #ifdef snPause // in LibSN.h - // snPause - // __asm__ volatile ( "tw 31,1,1" ) - - #define RR_BREAK() __asm__ volatile ( "tw 31,1,1" ) - //#define RR_BREAK() __asm__ volatile("trap"); - - #define RR_CACHE_LINE_SIZE 128 - - #elif defined(__RADMAC__) - - #if defined(__GNUG__) || defined(__GNUC__) - #ifdef __RADX86__ - #define RR_BREAK() __asm__ volatile ( "int $3" ) - #else - #define RR_BREAK() __builtin_trap() - #endif - #else - #ifdef __RADMACH__ - void DebugStr(unsigned char const *); - #else - void pascal DebugStr(unsigned char const *); - #endif - #define RR_BREAK() DebugStr("\pRR_BREAK() was called") - #endif - - #define RR_CACHE_LINE_SIZE 64 - - #elif defined(__RADIPHONE__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 32 - #elif defined(__RADXENON__) - #define RR_BREAK() __debugbreak() - #define RR_CACHE_LINE_SIZE 128 - #elif defined(__RADANDROID__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 32 - #elif defined(__RADPS4__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 64 - #elif defined(__RADNACL__) - #define RR_BREAK() __builtin_trap() - #define RR_CACHE_LINE_SIZE 64 - #else - // x86 : - #define RR_CACHE_LINE_SIZE 64 - - #ifdef __RADLINUX__ - #define RR_BREAK() __asm__ volatile ( "int $3" ) - #elif defined(__WATCOMC__) - - void RR_BREAK( void ); - #pragma aux RR_BREAK = "int 0x3"; - - #elif defined(__RADWIN__) && defined(_MSC_VER) && _MSC_VER >= 1300 - - #define RR_BREAK __debugbreak - - #else - - #define RR_BREAK() RAD_STATEMENT_WRAPPER( __asm {int 3} ) - - #endif - - #endif - -// simple RR_ASSERT : - -// CB 5-27-10 : use RR_DO_ASSERTS to toggle asserts on and off : -#if (defined(_DEBUG) && !defined(NDEBUG)) || defined(ASSERT_IN_RELEASE) - #define RR_DO_ASSERTS -#endif - -/********* - -rrAsserts : - -RR_ASSERT(exp) - the normal assert thing, toggled with RR_DO_ASSERTS -RR_ASSERT_ALWAYS(exp) - assert that you want to test even in ALL builds (including final!) -RR_ASSERT_RELEASE(exp) - assert that you want to test even in release builds (not for final!) -RR_ASSERT_LITE(exp) - normal assert is not safe from threads or inside malloc; use this instead -RR_DURING_ASSERT(exp) - wrap operations that compute stuff for assert in here -RR_DO_ASSERTS - toggle tells you if asserts are enabled or not - -RR_BREAK() - generate a debug break - always ! -RR_ASSERT_BREAK() - RR_BREAK for asserts ; disable with RAD_NO_BREAK - -RR_ASSERT_FAILURE(str) - just break with a messsage; like assert with no condition -RR_ASSERT_FAILURE_ALWAYS(str) - RR_ASSERT_FAILURE in release builds too -RR_CANT_GET_HERE() - put in spots execution should never go -RR_COMPILER_ASSERT(exp) - checks constant conditions at compile time - -RADTODO - note to search for nonfinal stuff -RR_PRAGMA_MESSAGE - message dealy, use with #pragma in MSVC - -*************/ - -//----------------------------------------------------------- - - -#if defined(__GNUG__) || defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER > 1200) - #define RR_FUNCTION_NAME __FUNCTION__ -#else - #define RR_FUNCTION_NAME 0 - - // __func__ is in the C99 standard -#endif - -//----------------------------------------------------------- - -// rrDisplayAssertion might just log, or it might pop a message box, depending on settings -// rrDisplayAssertion returns whether you should break or not -typedef rrbool (RADLINK fp_rrDisplayAssertion)(int * Ignored, const char * fileName,const int line,const char * function,const char * message); - -extern fp_rrDisplayAssertion * g_fp_rrDisplayAssertion; - -// if I have func pointer, call it, else true ; true = do int 3 -#define rrDisplayAssertion(i,n,l,f,m) ( ( g_fp_rrDisplayAssertion ) ? (*g_fp_rrDisplayAssertion)(i,n,l,f,m) : 1 ) - -//----------------------------------------------------------- - -// RAD_NO_BREAK : option if you don't like your assert to break -// CB : RR_BREAK is *always* a break ; RR_ASSERT_BREAK is optional -#ifdef RAD_NO_BREAK -#define RR_ASSERT_BREAK() 0 -#else -#define RR_ASSERT_BREAK() RR_BREAK() -#endif - -// assert_always is on FINAL ! -#define RR_ASSERT_ALWAYS(exp) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( ! (exp) ) { if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,#exp) ) RR_ASSERT_BREAK(); } ) - -// RR_ASSERT_FAILURE is like an assert without a condition - if you hit it, you're bad -#define RR_ASSERT_FAILURE_ALWAYS(str) RAD_STATEMENT_WRAPPER( static int Ignored=0; if ( rrDisplayAssertion(&Ignored,__FILE__,__LINE__,RR_FUNCTION_NAME,str) ) RR_ASSERT_BREAK(); ) - -#define RR_ASSERT_LITE_ALWAYS(exp) RAD_STATEMENT_WRAPPER( if ( ! (exp) ) { RR_ASSERT_BREAK(); } ) - -//----------------------------------- -#ifdef RR_DO_ASSERTS - -#define RR_ASSERT(exp) RR_ASSERT_ALWAYS(exp) -#define RR_ASSERT_LITE(exp) RR_ASSERT_LITE_ALWAYS(exp) -#define RR_ASSERT_NO_ASSUME(exp) RR_ASSERT_ALWAYS(exp) -// RR_DURING_ASSERT is to set up expressions or declare variables that are only used in asserts -#define RR_DURING_ASSERT(exp) exp - -#define RR_ASSERT_FAILURE(str) RR_ASSERT_FAILURE_ALWAYS(str) - -// RR_CANT_GET_HERE is for like defaults in switches that should never be hit -#define RR_CANT_GET_HERE() RAD_STATEMENT_WRAPPER( RR_ASSERT_FAILURE("can't get here"); RADUNREACHABLE; ) - - -#else // RR_DO_ASSERTS //----------------------------------- - -#define RR_ASSERT(exp) (void)0 -#define RR_ASSERT_LITE(exp) (void)0 -#define RR_ASSERT_NO_ASSUME(exp) (void)0 - -#define RR_DURING_ASSERT(exp) (void)0 - -#define RR_ASSERT_FAILURE(str) (void)0 - -#define RR_CANT_GET_HERE() RADUNREACHABLE - -#endif // RR_DO_ASSERTS //----------------------------------- - -//================================================================= - -// RR_ASSERT_RELEASE is on in release build, but not final - -#ifndef __RADFINAL__ - -#define RR_ASSERT_RELEASE(exp) RR_ASSERT_ALWAYS(exp) -#define RR_ASSERT_LITE_RELEASE(exp) RR_ASSERT_LITE_ALWAYS(exp) - -#else - -#define RR_ASSERT_RELEASE(exp) (void)0 -#define RR_ASSERT_LITE_RELEASE(exp) (void)0 - -#endif - -// BH: This never gets compiled away except for __RADFINAL__ -#define RR_ASSERT_ALWAYS_NO_SHIP RR_ASSERT_RELEASE - -#define rrAssert RR_ASSERT -#define rrassert RR_ASSERT - -#ifdef _MSC_VER - // without this, our assert errors... - #if _MSC_VER >= 1300 - #pragma warning( disable : 4127) // conditional expression is constant - #endif -#endif - -//--------------------------------------- -// Get/Put from memory in little or big endian : -// -// val = RR_GET32_BE(ptr) -// RR_PUT32_BE(ptr,val) -// -// available here : -// RR_[GET/PUT][16/32]_[BE/LE][_UNALIGNED][_OFFSET] -// -// if you don't specify _UNALIGNED , then ptr & offset shoud both be aligned to type size -// _OFFSET is in *bytes* ! - -// you can #define RR_GET_RESTRICT to make all RR_GETs be RESTRICT -// if you set nothing they are not - -#ifdef RR_GET_RESTRICT -#define RR_GET_PTR_POST RADRESTRICT -#endif -#ifndef RR_GET_PTR_POST -#define RR_GET_PTR_POST -#endif - -// native version of get/put is always trivial : - -#define RR_GET16_NATIVE(ptr) *((const U16 * RR_GET_PTR_POST)(ptr)) -#define RR_PUT16_NATIVE(ptr,val) *((U16 * RR_GET_PTR_POST)(ptr)) = (val) - -// offset is in bytes -#define RR_U16_PTR_OFFSET(ptr,offset) ((U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) -#define RR_GET16_NATIVE_OFFSET(ptr,offset) *( RR_U16_PTR_OFFSET((ptr),offset) ) -#define RR_PUT16_NATIVE_OFFSET(ptr,val,offset) *( RR_U16_PTR_OFFSET((ptr),offset)) = (val) - -#define RR_GET32_NATIVE(ptr) *((const U32 * RR_GET_PTR_POST)(ptr)) -#define RR_PUT32_NATIVE(ptr,val) *((U32 * RR_GET_PTR_POST)(ptr)) = (val) - -// offset is in bytes -#define RR_U32_PTR_OFFSET(ptr,offset) ((U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) -#define RR_GET32_NATIVE_OFFSET(ptr,offset) *( RR_U32_PTR_OFFSET((ptr),offset) ) -#define RR_PUT32_NATIVE_OFFSET(ptr,val,offset) *( RR_U32_PTR_OFFSET((ptr),offset)) = (val) - -#define RR_GET64_NATIVE(ptr) *((const U64 * RR_GET_PTR_POST)(ptr)) -#define RR_PUT64_NATIVE(ptr,val) *((U64 * RR_GET_PTR_POST)(ptr)) = (val) - -// offset is in bytes -#define RR_U64_PTR_OFFSET(ptr,offset) ((U64 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) -#define RR_GET64_NATIVE_OFFSET(ptr,offset) *( RR_U64_PTR_OFFSET((ptr),offset) ) -#define RR_PUT64_NATIVE_OFFSET(ptr,val,offset) *( RR_U64_PTR_OFFSET((ptr),offset)) = (val) - -//--------------------------------------------------- - -#ifdef __RADLITTLEENDIAN__ - -#define RR_GET16_LE RR_GET16_NATIVE -#define RR_PUT16_LE RR_PUT16_NATIVE -#define RR_GET16_LE_OFFSET RR_GET16_NATIVE_OFFSET -#define RR_PUT16_LE_OFFSET RR_PUT16_NATIVE_OFFSET - -#define RR_GET32_LE RR_GET32_NATIVE -#define RR_PUT32_LE RR_PUT32_NATIVE -#define RR_GET32_LE_OFFSET RR_GET32_NATIVE_OFFSET -#define RR_PUT32_LE_OFFSET RR_PUT32_NATIVE_OFFSET - -#define RR_GET64_LE RR_GET64_NATIVE -#define RR_PUT64_LE RR_PUT64_NATIVE -#define RR_GET64_LE_OFFSET RR_GET64_NATIVE_OFFSET -#define RR_PUT64_LE_OFFSET RR_PUT64_NATIVE_OFFSET - -#else - -#define RR_GET16_BE RR_GET16_NATIVE -#define RR_PUT16_BE RR_PUT16_NATIVE -#define RR_GET16_BE_OFFSET RR_GET16_NATIVE_OFFSET -#define RR_PUT16_BE_OFFSET RR_PUT16_NATIVE_OFFSET - -#define RR_GET32_BE RR_GET32_NATIVE -#define RR_PUT32_BE RR_PUT32_NATIVE -#define RR_GET32_BE_OFFSET RR_GET32_NATIVE_OFFSET -#define RR_PUT32_BE_OFFSET RR_PUT32_NATIVE_OFFSET - -#define RR_GET64_BE RR_GET64_NATIVE -#define RR_PUT64_BE RR_PUT64_NATIVE -#define RR_GET64_BE_OFFSET RR_GET64_NATIVE_OFFSET -#define RR_PUT64_BE_OFFSET RR_PUT64_NATIVE_OFFSET - -#endif - -//------------------------- -// non-native Get/Put implementations go here : - -#if defined(__RADX86__) -// good implementation for X86 : - -#if (_MSC_VER >= 1300) - -unsigned short __cdecl _byteswap_ushort (unsigned short _Short); -unsigned long __cdecl _byteswap_ulong (unsigned long _Long); -#pragma intrinsic(_byteswap_ushort, _byteswap_ulong) - -#define RR_BSWAP16 _byteswap_ushort -#define RR_BSWAP32 _byteswap_ulong - -unsigned __int64 __cdecl _byteswap_uint64 (unsigned __int64 val); -#pragma intrinsic(_byteswap_uint64) -#define RR_BSWAP64 _byteswap_uint64 - -#elif defined(_MSC_VER) // VC6 - -RADFORCEINLINE unsigned long RR_BSWAP16 (unsigned long _Long) -{ - __asm { - mov eax, [_Long] - rol ax, 8 - mov [_Long], eax; - } - return _Long; -} - -RADFORCEINLINE unsigned long RR_BSWAP32 (unsigned long _Long) -{ - __asm { - mov eax, [_Long] - bswap eax - mov [_Long], eax - } - return _Long; -} - -RADFORCEINLINE unsigned __int64 RR_BSWAP64 (unsigned __int64 _Long) -{ - __asm { - mov eax, DWORD PTR _Long - mov edx, DWORD PTR _Long+4 - bswap eax - bswap edx - mov DWORD PTR _Long, edx - mov DWORD PTR _Long+4, eax - } - return _Long; -} - -#elif defined(__GNUC__) || defined(__clang__) - -// GCC has __builtin_bswap16, but Clang only seems to have added it recently. -// We use __builtin_bswap32/64 but 16 just uses the macro version. (No big -// deal if that turns into shifts anyway) -#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) -#define RR_BSWAP32 __builtin_bswap32 -#define RR_BSWAP64 __builtin_bswap64 - -#endif - -#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = (U16) RR_BSWAP16(val) -#define RR_GET16_BE_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET(ptr,offset)) -#define RR_PUT16_BE_OFFSET(ptr,val,offset) *RR_U16_PTR_OFFSET(ptr,offset) = RR_BSWAP16(val) - -#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) -#define RR_GET32_BE_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET(ptr,offset)) -#define RR_PUT32_BE_OFFSET(ptr,val,offset) *RR_U32_PTR_OFFSET(ptr,offset) = RR_BSWAP32(val) - -#define RR_GET64_BE(ptr) RR_BSWAP64(*((U64 *)(ptr))) -#define RR_PUT64_BE(ptr,val) *((U64 *)(ptr)) = RR_BSWAP64(val) -#define RR_GET64_BE_OFFSET(ptr,offset) RR_BSWAP64(*RR_U64_PTR_OFFSET(ptr,offset)) -#define RR_PUT64_BE_OFFSET(ptr,val,offset) *RR_U64_PTR_OFFSET(ptr,offset) = RR_BSWAP64(val) - -// end _MSC_VER - -#elif defined(__RADXENON__) // Xenon has built-in funcs for this - -unsigned short __loadshortbytereverse(int offset, const void *base); -unsigned long __loadwordbytereverse (int offset, const void *base); - -void __storeshortbytereverse(unsigned short val, int offset, void *base); -void __storewordbytereverse (unsigned int val, int offset, void *base); - -#define RR_GET16_LE(ptr) __loadshortbytereverse(0, ptr) -#define RR_PUT16_LE(ptr,val) __storeshortbytereverse((U16) (val), 0, ptr) - -#define RR_GET16_LE_OFFSET(ptr,offset) __loadshortbytereverse(offset, ptr) -#define RR_PUT16_LE_OFFSET(ptr,val,offset) __storeshortbytereverse((U16) (val), offset, ptr) - -#define RR_GET32_LE(ptr) __loadwordbytereverse(0, ptr) -#define RR_PUT32_LE(ptr,val) __storewordbytereverse((U32) (val), 0, ptr) - -#define RR_GET32_LE_OFFSET(ptr,offset) __loadwordbytereverse(offset, ptr) -#define RR_PUT32_LE_OFFSET(ptr,val,offset) __storewordbytereverse((U32) (val), offset, ptr) - -#define RR_GET64_LE(ptr) ( ((U64)RR_GET32_OFFSET_LE(ptr,4)<<32) | RR_GET32_LE(ptr) ) -#define RR_PUT64_LE(ptr,val) RR_PUT32_LE(ptr, (U32) (val)), RR_PUT32_OFFSET_LE(ptr, (U32) ((val)>>32),4) - -#elif defined(__RADPS3__) - -#include - -#define RR_GET16_LE(ptr) __lhbrx(ptr) -#define RR_PUT16_LE(ptr,val) __sthbrx(ptr, (U16) (val)) - -#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(RR_U16_PTR_OFFSET(ptr, offset)) -#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx(RR_U16_PTR_OFFSET(ptr, offset), (U16) (val)) - -#define RR_GET32_LE(ptr) __lwbrx(ptr) -#define RR_PUT32_LE(ptr,val) __stwbrx(ptr, (U32) (val)) - -#define RR_GET64_LE(ptr) __ldbrx(ptr) -#define RR_PUT64_LE(ptr,val) __stdbrx(ptr, (U32) (val)) - -#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(RR_U32_PTR_OFFSET(ptr, offset)) -#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx(RR_U32_PTR_OFFSET(ptr, offset), (U32) (val)) - -#elif defined(__RADWII__) - -#define RR_GET16_LE(ptr) __lhbrx(ptr, 0) -#define RR_PUT16_LE(ptr,val) __sthbrx((U16) (val), ptr, 0) - -#define RR_GET16_LE_OFFSET(ptr,offset) __lhbrx(ptr, offset) -#define RR_PUT16_LE_OFFSET(ptr,val,offset) __sthbrx((U16) (val), ptr, offset) - -#define RR_GET32_LE(ptr) __lwbrx(ptr, 0) -#define RR_PUT32_LE(ptr,val) __stwbrx((U32) (val), ptr, 0) - -#define RR_GET32_LE_OFFSET(ptr,offset) __lwbrx(ptr, offset) -#define RR_PUT32_LE_OFFSET(ptr,val,offset) __stwbrx((U32) (val), ptr, offset) - -#elif defined(__RAD3DS__) - -#define RR_GET16_BE(ptr) __rev16(*(U16 *) (ptr)) -#define RR_PUT16_BE(ptr,val) *(U16 *) (ptr) = __rev16(val) - -#define RR_GET16_BE_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET(ptr,offset)) -#define RR_PUT16_BE_OFFSET(ptr,offset,val) *RR_U16_PTR_OFFSET(ptr,offset) = __rev16(val) - -#define RR_GET32_BE(ptr) __rev(*(U32 *) (ptr)) -#define RR_PUT32_BE(ptr,val) *(U32 *) (ptr) = __rev(val) - -#define RR_GET32_BE_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET(ptr,offset)) -#define RR_PUT32_BE_OFFSET(ptr,offset,val) *RR_U32_PTR_OFFSET(ptr,offset) = __rev(val) - -#elif defined(__RADIPHONE__) - -// iPhone does not seem to have intrinsics for this, so use generic fallback! - -// Bswap is just here for use of implementing get/put -// caller should use Get/Put , not bswap -#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) -#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) - -#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) - -#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) - -#elif defined(__RADWIIU__) - -#include - -#define RR_GET16_LE(ptr) (*(__bytereversed U16 *) (ptr)) -#define RR_PUT16_LE(ptr,val) *(__bytereversed U16 *) (ptr) = val - -#define RR_GET16_LE_OFFSET(ptr,offset) (*(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset)) -#define RR_PUT16_LE_OFFSET(ptr,val,offset) *(__bytereversed U16 *)RR_U16_PTR_OFFSET(ptr,offset) = val - -#define RR_GET32_LE(ptr) (*(__bytereversed U32 *) (ptr)) -#define RR_PUT32_LE(ptr,val) *(__bytereversed U32 *) (ptr) = val - -#define RR_GET32_LE_OFFSET(ptr,offset) (*(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset)) -#define RR_PUT32_LE_OFFSET(ptr,val,offset) *(__bytereversed U32 *)RR_U32_PTR_OFFSET(ptr,offset) = val - -#define RR_GET64_LE(ptr) (*(__bytereversed U64 *) (ptr)) -#define RR_PUT64_LE(ptr,val) *(__bytereversed U64 *) (ptr) = val - -#define RR_GET64_LE_OFFSET(ptr,offset) (*(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset)) -#define RR_PUT64_LE_OFFSET(ptr,val,offset) *(__bytereversed U64 *)RR_U32_PTR_OFFSET(ptr,offset) = val - -#elif defined(__RADWINRTAPI__) && defined(__RADARM__) - -#include - -#define RR_BSWAP16(u16) _arm_rev16(u16) -#define RR_BSWAP32(u32) _arm_rev(u32) - -#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) - -#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) - -#elif defined(__RADPSP2__) - -// no rev16 exposed -#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) -#define RR_BSWAP32(u32) __builtin_rev(u32) - -#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) - -#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) - -#else // other platforms ? - -// fall back : - -// Bswap is just here for use of implementing get/put -// caller should use Get/Put , not bswap -#define RR_BSWAP16(u16) ( (U16) ( ((u16) >> 8) | ((u16) << 8) ) ) -#define RR_BSWAP32(u32) ( (U32) ( ((u32) >> 24) | (((u32)<<8) & 0x00FF0000) | (((u32)>>8) & 0x0000FF00) | ((u32) << 24) ) ) -#define RR_BSWAP64(u64) ( ((U64) RR_BSWAP32((U32) (u64)) << 32) | (U64) RR_BSWAP32((U32) ((u64) >> 32)) ) - -#ifdef __RADLITTLEENDIAN__ - -// comment out fallbacks so users will get errors -//#define RR_GET16_BE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -//#define RR_PUT16_BE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) -//#define RR_GET32_BE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -//#define RR_PUT32_BE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) - -#else - -// comment out fallbacks so users will get errors -//#define RR_GET16_LE(ptr) RR_BSWAP16(*((U16 *)(ptr))) -//#define RR_PUT16_LE(ptr,val) *((U16 *)(ptr)) = RR_BSWAP16(val) -//#define RR_GET32_LE(ptr) RR_BSWAP32(*((U32 *)(ptr))) -//#define RR_PUT32_LE(ptr,val) *((U32 *)(ptr)) = RR_BSWAP32(val) - -#endif - -#endif - -//=================================================================== -// @@ TEMP : Aliases for old names : remove me when possible : - -#define RR_GET32_OFFSET_LE RR_GET32_LE_OFFSET -#define RR_GET32_OFFSET_BE RR_GET32_BE_OFFSET -#define RR_PUT32_OFFSET_LE RR_PUT32_LE_OFFSET -#define RR_PUT32_OFFSET_BE RR_PUT32_BE_OFFSET -#define RR_GET16_OFFSET_LE RR_GET16_LE_OFFSET -#define RR_GET16_OFFSET_BE RR_GET16_BE_OFFSET -#define RR_PUT16_OFFSET_LE RR_PUT16_LE_OFFSET -#define RR_PUT16_OFFSET_BE RR_PUT16_BE_OFFSET - - -//=================================================================== -// UNALIGNED VERSIONS : - -#if defined(__RADX86__) || defined(__RADPPC__) // platforms where unaligned is fast : - -#define RR_GET32_BE_UNALIGNED(ptr) RR_GET32_BE(ptr) -#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_BE_OFFSET(ptr,offset) -#define RR_GET16_BE_UNALIGNED(ptr) RR_GET16_BE(ptr) -#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_BE_OFFSET(ptr,offset) - -#define RR_GET32_LE_UNALIGNED(ptr) RR_GET32_LE(ptr) -#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET32_LE_OFFSET(ptr,offset) -#define RR_GET16_LE_UNALIGNED(ptr) RR_GET16_LE(ptr) -#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) RR_GET16_LE_OFFSET(ptr,offset) - -#elif defined(__RAD3DS__) - -// arm has a "__packed" qualifier to tell the compiler to do unaligned accesses -#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U16 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) -#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((__packed U32 * RR_GET_PTR_POST)((char *)(ptr) + (offset))) - -#define RR_GET32_BE_UNALIGNED(ptr) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) -#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) __rev(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) -#define RR_GET16_BE_UNALIGNED(ptr) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) -#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) __rev16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) - -#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) -#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) -#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) -#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) - -#elif defined(__RADPSP2__) - -#define RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) ((U16 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) -#define RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) ((U32 __unaligned * RR_GET_PTR_POST)((char *)(ptr) + (offset))) - -#define RR_GET32_BE_UNALIGNED(ptr) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,0)) -#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP32(*RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset)) -#define RR_GET16_BE_UNALIGNED(ptr) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,0)) -#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) RR_BSWAP16(*RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset)) - -#define RR_GET32_LE_UNALIGNED(ptr) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,0) -#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U32_PTR_OFFSET_UNALIGNED(ptr,offset) -#define RR_GET16_LE_UNALIGNED(ptr) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,0) -#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) *RR_U16_PTR_OFFSET_UNALIGNED(ptr,offset) - -#else -// Unaligned via bytes : - -#define RR_GET32_BE_UNALIGNED(ptr) ( \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 24 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 16 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 8 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 0 ) ) - -#define RR_GET32_BE_UNALIGNED_OFFSET(ptr,offset) ( \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 24 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 16 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 8 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 0 ) ) - -#define RR_GET16_BE_UNALIGNED(ptr) ( \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 8 ) | \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 0 ) ) - -#define RR_GET16_BE_UNALIGNED_OFFSET(ptr,offset) ( \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 8 ) | \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 0 ) ) - -#define RR_GET32_LE_UNALIGNED(ptr) ( \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[3] << 24 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[2] << 16 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) - -#define RR_GET32_LE_UNALIGNED_OFFSET(ptr,offset) ( \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[3] << 24 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[2] << 16 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ - ( (U32)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) - -#define RR_GET16_LE_UNALIGNED(ptr) ( \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[1] << 8 ) | \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr)))[0] << 0 ) ) - -#define RR_GET16_LE_UNALIGNED_OFFSET(ptr,offset) ( \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[1] << 8 ) | \ - ( (U16)(((const U8 * RR_GET_PTR_POST)(ptr))+(offset))[0] << 0 ) ) - -#endif - -//=================================================================== -// RR_ROTL32 : 32-bit rotate -// - -#ifdef _MSC_VER - - unsigned long __cdecl _lrotl(unsigned long, int); - #pragma intrinsic(_lrotl) - - #define RR_ROTL32(x,k) _lrotl((unsigned long)(x),(int)(k)) - -#elif defined(__RADCELL__) || defined(__RADLINUX__) || defined(__RADWII__) || defined(__RADMACAPI__) || defined(__RADWIIU__) || defined(__RADPS4__) || defined(__RADPSP2__) - - // Compiler turns this into rotate correctly : - #define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) - -#elif defined(__RAD3DS__) - - #define RR_ROTL32(u32,num) __ror(u32, (-(num))&31) - -#else - -// comment out fallbacks so users will get errors -// fallback implementation using shift and or : -//#define RR_ROTL32(u32,num) ( ( (u32) << (num) ) | ( (u32) >> (32 - (num))) ) - -#endif - - -//=================================================================== -// RR_ROTL64 : 64-bit rotate - -#if ( defined(_MSC_VER) && _MSC_VER >= 1300) - -unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val, int _Shift); -#pragma intrinsic(_rotl64) - -#define RR_ROTL64(x,k) _rotl64((unsigned __int64)(x),(int)(k)) - -#elif defined(__RADCELL__) - -// PS3 GCC turns this into rotate correctly : -#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) - -#elif defined(__RADLINUX__) || defined(__RADMACAPI__) - -//APTODO: Just to compile linux. Should we be doing better than this? If not, combine with above. -#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) - -#else - -// comment out fallbacks so users will get errors -// fallback implementation using shift and or : -//#define RR_ROTL64(u64,num) ( ( (u64) << (num) ) | ( (u64) >> (64 - (num))) ) - -#endif - -//=================================================================== - -RADDEFEND - -//=================================================================== - -// RR_COMPILER_ASSERT -#if defined(__cplusplus) && !defined(RR_COMPILER_ASSERT) - #if defined(_MSC_VER) && (_MSC_VER >=1400) - - // better version of COMPILER_ASSERT using boost technique - template struct RR_COMPILER_ASSERT_FAILURE; - - template <> struct RR_COMPILER_ASSERT_FAILURE<1> { enum { value = 1 }; }; - - template struct rr_compiler_assert_test{}; - - // __LINE__ macro broken when -ZI is used see Q199057 - #define RR_COMPILER_ASSERT( B ) \ - typedef rr_compiler_assert_test<\ - sizeof(RR_COMPILER_ASSERT_FAILURE< (B) ? 1 : 0 >)\ - > rr_compiler_assert_typedef_ - - #endif -#endif - -#ifndef RR_COMPILER_ASSERT - // this happens at declaration time, so if it's inside a function in a C file, drop {} around it - #define RR_COMPILER_ASSERT(exp) typedef char RR_STRING_JOIN(_dummy_array, __LINE__) [ (exp) ? 1 : -1 ] -#endif - -//=================================================================== -// some error checks : - - RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == sizeof( RR_STRING_JOIN(RAD_U,RAD_PTRBITS) ) ); - RR_COMPILER_ASSERT( sizeof(RAD_UINTa) == RAD_PTRBYTES ); - RR_COMPILER_ASSERT( RAD_TWOPTRBYTES == 2* RAD_PTRBYTES ); - -//=================================================================== - - #endif // __RADRES__ - -//include "testconstant.inl" // uncomment and include to test statement constants - -#endif // __RADRR_COREH__ - - diff --git a/Minecraft.Client/Windows64/Miles/include/tmapi.h b/Minecraft.Client/Windows64/Miles/include/tmapi.h deleted file mode 100644 index c22ba684..00000000 --- a/Minecraft.Client/Windows64/Miles/include/tmapi.h +++ /dev/null @@ -1,36 +0,0 @@ -// This is the null header file used to remove Telemetry calls. - -#define TMERR_DISABLED 1 - -#define tmTick(...) -#define tmPause(...) -#define tmEnter(...) -#define tmLeave(...) -#define tmThreadName(...) TMERR_DISABLED -#define tmMutexName(...) TMERR_DISABLED -#define tmTryLock(...) TMERR_DISABLED -#define tmEndTryLock(...) -#define tmSetMutexState(...) -#define tmAlloc(...) -#define tmRealloc(...) -#define tmFree(...) -#define tmPlot(...) -#define tmBlob(...) TMERR_DISABLED -#define tmBlobEx(...) TMERR_DISABLED -#define tmMessage(...) -#define tmEmitAccumulationZones(...) TMERR_DISABLED -#define tmEnterAccumulationZone(...) TMERR_DISABLED -#define tmLeaveAccumulationZone(...) TMERR_DISABLED -#define tmZone(...) -#define tmSetLockState(...) -#define tmLockName(...) -#define tmSendCallStack(...) -#define tmAllocEx(...) - -#define NTELEMETRY 1 - -#define TM_CONTEXT_LITE(val) ((char*)(val)) -#define TM_CONTEXT_FULL(val) ((char*)(val)) - -typedef char *HTELEMETRY; - diff --git a/Minecraft.Client/Windows64/Miles/lib/aud32.lib b/Minecraft.Client/Windows64/Miles/lib/aud32.lib deleted file mode 100644 index 22381e1832f7323ccf67bb4f180d5a413aac37f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2480 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 uF78Z5#L%wsty8YdUutw7FJaP5wVd?zOf6 diff --git a/Minecraft.Client/Windows64/Miles/lib/mss32midi.lib b/Minecraft.Client/Windows64/Miles/lib/mss32midi.lib deleted file mode 100644 index 0c6552613113f4931a42c84439d3b54049fa0ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29792 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 diff --git a/Minecraft.Client/Windows64/Miles/lib/mss64.lib b/Minecraft.Client/Windows64/Miles/lib/mss64.lib deleted file mode 100644 index fa857a7a39d264fc05f10563618dea7510053857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94326 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 A#{d8T diff --git a/Minecraft.Client/Windows64/Miles/lib/redist64/mss64dolby.flt b/Minecraft.Client/Windows64/Miles/lib/redist64/mss64dolby.flt deleted file mode 100644 index 8ae0cd6360d233c998b93ae70c6239ace56c8cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 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 bdafC~CV5Tvnu0YYn1BCy{i%WfsT%ly;-MhI diff --git a/Minecraft.Client/Windows64/Miles/lib/redist64/mss64srs.flt b/Minecraft.Client/Windows64/Miles/lib/redist64/mss64srs.flt deleted file mode 100644 index a0bf7d007bdcaf3a4fd9a233c97a95581e237d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65024 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

ph)K|X? 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 Ie^vtj4c*JDiU0rr