22 {
"dttr_hook_mss_ail_allocate_sample_handle",
23 "_AIL_allocate_sample_handle@4",
27 {
"dttr_hook_mss_ail_get_preference",
28 "_AIL_get_preference@4",
33 {
"dttr_hook_mss_ail_release_sample_handle",
34 "_AIL_release_sample_handle@4",
36 {
"dttr_hook_mss_ail_sample_playback_rate",
37 "_AIL_sample_playback_rate@4",
39 {
"dttr_hook_mss_ail_sample_status",
40 "_AIL_sample_status@4",
42 {
"dttr_hook_mss_ail_set_digital_master_volume",
43 "_AIL_set_digital_master_volume@8",
45 {
"dttr_hook_mss_ail_set_preference",
46 "_AIL_set_preference@8",
48 {
"dttr_hook_mss_ail_set_sample_file",
49 "_AIL_set_sample_file@12",
51 {
"dttr_hook_mss_ail_set_sample_loop_count",
52 "_AIL_set_sample_loop_count@8",
54 {
"dttr_hook_mss_ail_set_sample_pan",
55 "_AIL_set_sample_pan@8",
57 {
"dttr_hook_mss_ail_set_sample_playback_rate",
58 "_AIL_set_sample_playback_rate@8",
60 {
"dttr_hook_mss_ail_set_sample_volume",
61 "_AIL_set_sample_volume@8",
63 {
"dttr_hook_mss_ail_set_stream_loop_count",
64 "_AIL_set_stream_loop_count@8",
66 {
"dttr_hook_mss_ail_set_stream_volume",
67 "_AIL_set_stream_volume@8",
74 {
"dttr_hook_mss_ail_stream_status",
75 "_AIL_stream_status@4",
83 if (!format || !spec) {
87 const uint8_t *bytes = format;
103 spec->freq = (int)sample_rate;
134 "%s: pointer hook failed: %s",
174 IMAGE_IMPORT_DESCRIPTOR *
desc
177 IMAGE_THUNK_DATA *name_thunk = (IMAGE_THUNK_DATA *)(base +
desc->OriginalFirstThunk);
178 IMAGE_THUNK_DATA *addr_thunk = (IMAGE_THUNK_DATA *)(base +
desc->FirstThunk);
180 for (; name_thunk->u1.AddressOfData; name_thunk++, addr_thunk++) {
181 if (IMAGE_SNAP_BY_ORDINAL(name_thunk->u1.Ordinal)) {
186 *import_name = (IMAGE_IMPORT_BY_NAME *)(base + name_thunk->u1.AddressOfData);
189 (
const char *)import_name->Name,
190 (uintptr_t)&addr_thunk->u1.Function
194 "Unhandled or unhooked MSS32 import: %s",
216 "%s: pointer unhook failed: %s",
229 HMODULE module =
ctx->runtime.game_module;
230 uint8_t *base = (uint8_t *)module;
231 IMAGE_DOS_HEADER *dos = (IMAGE_DOS_HEADER *)base;
232 IMAGE_NT_HEADERS *nt = (IMAGE_NT_HEADERS *)(base + dos->e_lfanew);
233 IMAGE_DATA_DIRECTORY imports_dir = nt->OptionalHeader
234 .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
235 IMAGE_IMPORT_DESCRIPTOR
236 *
desc = (IMAGE_IMPORT_DESCRIPTOR *)(base + imports_dir.VirtualAddress);
239 if (_stricmp((
const char *)(base +
desc->Name),
"mss32.dll") != 0) {
288 "MSS AIL_waveOutOpen(driver_out=%p, wave_out=%p, device_id=%d, format=%p)",
304 "MSS AIL_waveOutOpen desired spec: format=%u channels=%d freq=%d",
323 "MSS AIL_waveOutOpen -> 0 driver=%p open_count=%d",
333 "MSS AIL_waveOutClose(driver=%p, mixer=%p, open_count=%d)",
340 DTTR_LOG_ERROR(
"Ignoring AIL_waveOutClose for unknown driver %p", driver);
349 "MSS AIL_waveOutClose open_count -> %d",
DTTR_Graphics_COM_DirectDraw7 DWORD void * desc
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
#define DTTR_ARRAY_COUNT(array)
DTTR_Result DTTR_Core_HookPointer(const DTTR_Core_Context *ctx, uintptr_t address, void *new_value, void **out_original, DTTR_Core_Hook **out_hook)
DTTR_Result DTTR_Core_Unhook(DTTR_Core_Hook *hook)
#define DTTR_LOG_TRACE(...)
#define DTTR_LOG_ERROR(...)
#define DTTR_MODS_LOG_ERROR(ctx,...)
#define DTTR_MODS_LOG_DEBUG(ctx,...)
bool DTTR_ResultOK(DTTR_Result result)
void dttr_mss_core_reset_driver_open_count()
void dttr_mss_core_set_desired_spec(const SDL_AudioSpec *spec)
void dttr_mss_core_set_master_gain(float gain)
void dttr_mss_core_ensure_preferences()
int dttr_mss_core_set_preference(unsigned int preference, int value)
void dttr_mss_core_decrement_driver_open_count()
bool dttr_mss_core_ensure_mixer()
static SDL_AudioSpec desired_spec
void dttr_mss_core_destroy_mixer()
void dttr_mss_core_increment_driver_open_count()
bool dttr_mss_core_ensure_mix_initialized()
int dttr_mss_core_get_preference(unsigned int preference)
int dttr_mss_core_driver_open_count()
MIX_Mixer * dttr_mss_core_mixer()
void dttr_mss_ail_shutdown()
int dttr_mss_ail_sample_status(void *sample)
void dttr_mss_sample_shutdown_all()
int dttr_mss_ail_stream_status(void *stream)
void dttr_mss_ail_start_sample(void *sample)
void dttr_mss_ail_set_sample_pan(void *sample, int pan)
void dttr_mss_ail_waveOutClose(void *driver)
void dttr_mss_ail_set_sample_playback_rate(void *sample, int rate)
int dttr_mss_ail_sample_playback_rate(void *sample)
void * dttr_mss_ail_open_stream(void *driver, const char *path, int stream_mem)
void dttr_mss_ail_pause_stream(void *stream, int pause)
void dttr_mss_ail_start_stream(void *stream)
#define DTTR_MSS_DEFAULT_VOLUME
uint32_t dttr_mss_wave_read_u32le(const uint8_t *p)
int dttr_mss_ail_startup()
#define DTTR_MSS_MIXER_CHANNELS
void dttr_mss_ail_set_digital_master_volume(void *driver, int volume)
void dttr_mss_ail_set_stream_loop_count(void *stream, int loops)
void dttr_mss_stream_shutdown_all()
int dttr_mss_ail_set_preference(unsigned int preference, int value)
#define DTTR_MSS_MIXER_FORMAT
void dttr_mss_ail_set_sample_loop_count(void *sample, int loops)
void dttr_mss_ail_release_sample_handle(void *sample)
#define DTTR_MSS_DEFAULT_MASTER_GAIN
void dttr_mss_ail_stop_sample(void *sample)
void dttr_mss_stream_apply_master_gain()
void dttr_mss_ail_close_stream(void *stream)
#define DTTR_MSS_WAVE_FORMAT_PCM
void dttr_mss_ail_init_sample(void *sample)
void dttr_mss_sample_apply_master_gain()
void * dttr_mss_ail_allocate_sample_handle(void *driver)
uint16_t dttr_mss_wave_read_u16le(const uint8_t *p)
#define DTTR_MSS_MAX_VOLUME
void dttr_mss_ail_set_sample_volume(void *sample, int volume)
static bool dttr_mss_wave_bits_supported(uint16_t bits_per_sample)
void dttr_mss_ail_set_stream_volume(void *stream, int volume)
int dttr_mss_ail_get_preference(unsigned int preference)
int dttr_mss_ail_waveOutOpen(void **driver_out, void *wave_out, int device_id, const void *format)
int dttr_mss_ail_set_sample_file(void *sample, const void *file_image, int block)
void dttr_mss_ail_end_sample(void *sample)
void dttr_mss_ail_shutdown()
static bool install_mss_import_descriptor(const DTTR_Mods_Context *ctx, uint8_t *base, IMAGE_IMPORT_DESCRIPTOR *desc)
void dttr_mss_ail_waveOutClose(void *driver)
void dttr_mss_sdl_shutdown()
static bool wave_format_spec(const void *format, SDL_AudioSpec *spec)
static bool install_pointer_hook(const DTTR_Mods_Context *ctx, const char *name, DTTR_Core_Hook **handle, uintptr_t addr, void *callback)
int dttr_mss_ail_startup()
void dttr_mss_ail_set_digital_master_volume(void *driver, int volume)
static mss_import_hook mss_import_hooks[]
int dttr_mss_ail_set_preference(unsigned int preference, int value)
bool dttr_mss_sdl_install_hooks(const DTTR_Mods_Context *ctx)
void dttr_mss_sdl_release_hooks()
static float master_gain_for_volume(int volume)
int dttr_mss_ail_get_preference(unsigned int preference)
int dttr_mss_ail_waveOutOpen(void **driver_out, void *wave_out, int device_id, const void *format)
static bool install_mss_import_hook(const DTTR_Mods_Context *ctx, const char *name, uintptr_t site)
static const char * dttr_sidecar_result_detail(DTTR_Result result)