102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
mss_private.h
Go to the documentation of this file.
1#ifndef MSS_PRIVATE_H
2#define MSS_PRIVATE_H
3
4#include <dttr_mods.h>
5
6#include <SDL3/SDL.h>
7#include <SDL3_mixer/SDL_mixer.h>
8
9#include <stdbool.h>
10#include <stddef.h>
11#include <stdint.h>
12#include <string.h>
13#include <windows.h>
14
15#define DTTR_MSS_STATUS_DONE 2
16#define DTTR_MSS_STATUS_PLAYING 4
17#define DTTR_MSS_STATUS_STOPPED 8
18
19#define DTTR_MSS_PREF_DIG_MIXER_CHANNELS 1
20#define DTTR_MSS_PREF_DIG_DEFAULT_VOLUME 2
21#define DTTR_MSS_DEFAULT_MIXER_CHANNELS 64
22#define DTTR_MSS_DEFAULT_LOOP_COUNT 1
23#define DTTR_MSS_DEFAULT_MASTER_GAIN 1.0f
24#define DTTR_MSS_DEFAULT_PAN 64
25#define DTTR_MSS_DEFAULT_VOLUME 127
26
27#define DTTR_MSS_WAVE_FORMAT_PCM 1
28
29#define DTTR_MSS_DEFAULT_RATE 22050
30#define DTTR_MSS_MIXER_CHANNELS 2
31#define DTTR_MSS_MIXER_FORMAT SDL_AUDIO_F32
32#define DTTR_MSS_MIXER_RATE DTTR_MSS_DEFAULT_RATE
33#define DTTR_MSS_MAX_VOLUME 127.0f
34#define DTTR_MSS_PREFERENCES_CAPACITY 64
35#define DTTR_MSS_STREAM_HEADROOM_GAIN 1.0f
36
37typedef struct {
38 uint16_t format_tag;
39 uint16_t channels;
40 uint32_t sample_rate;
41 uint16_t block_align;
44 size_t data_size;
45 uint64_t frame_count;
46 bool has_fmt;
49
64
65static inline bool dttr_mss_wave_bits_supported(uint16_t bits_per_sample) {
66 return bits_per_sample == 8 || bits_per_sample == 16;
67}
68
69static inline bool dttr_mss_sample_rate_pauses_playback(int rate) {
70 return rate <= 0;
71}
72
73static inline int dttr_mss_pan_table_byte(int pan) {
74 return pan >= 63 ? 128 : pan * 2;
75}
76
77static inline void dttr_mss_pan_to_stereo_bytes(int pan, int *left_out, int *right_out) {
78 const int clamped_pan = pan < 0 ? 0 : (pan > 127 ? 127 : pan);
79 if (left_out) {
80 *left_out = dttr_mss_pan_table_byte(127 - clamped_pan);
81 }
82
83 if (right_out) {
84 *right_out = dttr_mss_pan_table_byte(clamped_pan);
85 }
86}
87
88static inline int dttr_mss_loops_to_sdl(int mss_loop_count) {
89 if (mss_loop_count <= 0) {
90 return mss_loop_count == 0 ? -1 : 0;
91 }
92
93 return mss_loop_count - 1;
94}
95
99int dttr_mss_core_get_preference(unsigned int preference);
100int dttr_mss_core_set_preference(unsigned int preference, int value);
104MIX_Mixer *dttr_mss_core_mixer();
105SDL_AudioSpec dttr_mss_core_mixer_spec();
106void dttr_mss_core_set_desired_spec(const SDL_AudioSpec *spec);
112void dttr_mss_core_set_master_gain(float gain);
115
119
122
123float dttr_mss_track_gain(int volume, float master_gain, float headroom);
124void dttr_mss_track_apply_pan(MIX_Track *track, int pan);
125void dttr_mss_track_play(MIX_Track *track, int sdl_loops);
126float dttr_mss_track_frequency_ratio(int rate, int reference_rate);
127int dttr_mss_track_status(MIX_Track *track, int previous_status);
128
129uint16_t dttr_mss_wave_read_u16le(const uint8_t *p);
130uint32_t dttr_mss_wave_read_u32le(const uint8_t *p);
131size_t dttr_mss_wave_riff_size(const void *file_image);
132bool dttr_mss_wave_parse(const void *file_image, mss_wave_info *info);
133int dttr_mss_wave_rate(const mss_wave_info *info);
135 const void *file_image,
136 size_t size,
137 mss_wave_info *info,
138 float **frames_out
139);
140void dttr_mss_wave_free(void *ptr);
141
145
146int __stdcall dttr_mss_ail_startup();
147void __stdcall dttr_mss_ail_shutdown();
148int __stdcall dttr_mss_ail_set_preference(unsigned int preference, int value);
149int __stdcall dttr_mss_ail_get_preference(unsigned int preference);
150int __stdcall dttr_mss_ail_waveOutOpen(
151 void **driver_out,
152 void *wave_out,
153 int device_id,
154 const void *format
155);
156void __stdcall dttr_mss_ail_waveOutClose(void *driver);
157void *__stdcall dttr_mss_ail_allocate_sample_handle(void *driver);
158void __stdcall dttr_mss_ail_release_sample_handle(void *sample);
159void __stdcall dttr_mss_ail_init_sample(void *sample);
160int __stdcall dttr_mss_ail_set_sample_file(
161 void *sample,
162 const void *file_image,
163 int block
164);
165void __stdcall dttr_mss_ail_start_sample(void *sample);
166void __stdcall dttr_mss_ail_stop_sample(void *sample);
167void __stdcall dttr_mss_ail_end_sample(void *sample);
168int __stdcall dttr_mss_ail_sample_status(void *sample);
169void __stdcall dttr_mss_ail_set_sample_loop_count(void *sample, int loops);
170void __stdcall dttr_mss_ail_set_sample_volume(void *sample, int volume);
171void __stdcall dttr_mss_ail_set_sample_pan(void *sample, int pan);
172void __stdcall dttr_mss_ail_set_sample_playback_rate(void *sample, int rate);
173int __stdcall dttr_mss_ail_sample_playback_rate(void *sample);
174void *__stdcall dttr_mss_ail_open_stream(void *driver, const char *path, int stream_mem);
175void __stdcall dttr_mss_ail_close_stream(void *stream);
176void __stdcall dttr_mss_ail_start_stream(void *stream);
177int __stdcall dttr_mss_ail_stream_status(void *stream);
178void __stdcall dttr_mss_ail_pause_stream(void *stream, int pause);
179void __stdcall dttr_mss_ail_set_stream_volume(void *stream, int volume);
180void __stdcall dttr_mss_ail_set_stream_loop_count(void *stream, int loops);
181void __stdcall dttr_mss_ail_set_digital_master_volume(void *driver, int volume);
182
183#endif // MSS_PRIVATE_H
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD count
void void * ctx
const DWORD size
static int preferences[DTTR_MSS_PREFERENCES_CAPACITY]
Definition mss_core.c:13
static float master_gain
Definition mss_core.c:12
void dttr_mss_ail_shutdown()
Definition mss_sdl.c:268
void dttr_mss_core_reset_driver_open_count()
Definition mss_core.c:180
void dttr_mss_sample_stop_all()
Definition mss_sample.c:319
void dttr_mss_core_set_desired_spec(const SDL_AudioSpec *spec)
Definition mss_core.c:154
#define DTTR_MSS_PREF_DIG_DEFAULT_VOLUME
Definition mss_private.h:20
void dttr_mss_core_set_master_gain(float gain)
Definition mss_core.c:188
float dttr_mss_core_sample_headroom_gain()
Definition mss_core.c:71
int dttr_mss_ail_sample_status(void *sample)
Definition mss_sample.c:550
float dttr_mss_track_frequency_ratio(int rate, int reference_rate)
Definition mss_track.c:54
void dttr_mss_sample_shutdown_all()
Definition mss_sample.c:312
void dttr_mss_core_ensure_preferences()
Definition mss_core.c:41
static int dttr_mss_loops_to_sdl(int mss_loop_count)
Definition mss_private.h:88
int dttr_mss_ail_stream_status(void *stream)
Definition mss_stream.c:269
float dttr_mss_core_master_gain()
Definition mss_core.c:184
void dttr_mss_ail_start_sample(void *sample)
Definition mss_sample.c:483
void dttr_mss_ail_set_sample_pan(void *sample, int pan)
Definition mss_sample.c:582
void dttr_mss_ail_waveOutClose(void *driver)
Definition mss_sdl.c:331
void dttr_mss_ail_set_sample_playback_rate(void *sample, int rate)
Definition mss_sample.c:592
void dttr_mss_wave_free(void *ptr)
Definition mss_wave.c:115
int dttr_mss_ail_sample_playback_rate(void *sample)
Definition mss_sample.c:646
float dttr_mss_core_sample_preemphasis()
Definition mss_core.c:75
void * dttr_mss_ail_open_stream(void *driver, const char *path, int stream_mem)
Definition mss_stream.c:167
void dttr_mss_sdl_shutdown()
Definition mss_sdl.c:108
void dttr_mss_ail_pause_stream(void *stream, int pause)
Definition mss_stream.c:281
void dttr_mss_track_apply_pan(MIX_Track *track, int pan)
Definition mss_track.c:22
static void dttr_mss_pan_to_stereo_bytes(int pan, int *left_out, int *right_out)
Definition mss_private.h:77
void dttr_mss_ail_start_stream(void *stream)
Definition mss_stream.c:242
#define DTTR_MSS_DEFAULT_VOLUME
Definition mss_private.h:25
uint32_t dttr_mss_wave_read_u32le(const uint8_t *p)
Definition mss_wave.c:15
int dttr_mss_core_set_preference(unsigned int preference, int value)
Definition mss_core.c:59
int dttr_mss_ail_startup()
Definition mss_sdl.c:263
static void dttr_mss_reset_preferences(int *preferences, size_t count)
Definition mss_private.h:50
void dttr_mss_core_decrement_driver_open_count()
Definition mss_core.c:172
SDL_AudioSpec dttr_mss_core_mixer_spec()
Definition mss_core.c:150
bool dttr_mss_core_ensure_mixer()
Definition mss_core.c:93
static int dttr_mss_pan_table_byte(int pan)
Definition mss_private.h:73
void dttr_mss_ail_set_digital_master_volume(void *driver, int volume)
Definition mss_sdl.c:361
void dttr_mss_track_play(MIX_Track *track, int sdl_loops)
Definition mss_track.c:38
void dttr_mss_ail_set_stream_loop_count(void *stream, int loops)
Definition mss_stream.c:310
bool dttr_mss_wave_parse(const void *file_image, mss_wave_info *info)
Definition mss_wave.c:29
void dttr_mss_stream_shutdown_all()
Definition mss_stream.c:135
float dttr_mss_track_gain(int volume, float master_gain, float headroom)
Definition mss_track.c:9
int dttr_mss_ail_set_preference(unsigned int preference, int value)
Definition mss_sdl.c:272
bool dttr_mss_sdl_install_hooks(const DTTR_Mods_Context *ctx)
Definition mss_sdl.c:228
void dttr_mss_ail_set_sample_loop_count(void *sample, int loops)
Definition mss_sample.c:560
void dttr_mss_ail_release_sample_handle(void *sample)
Definition mss_sample.c:363
static bool dttr_mss_sample_rate_pauses_playback(int rate)
Definition mss_private.h:69
size_t dttr_mss_wave_riff_size(const void *file_image)
Definition mss_wave.c:20
void dttr_mss_ail_stop_sample(void *sample)
Definition mss_sample.c:530
void dttr_mss_stream_apply_master_gain()
Definition mss_stream.c:142
#define DTTR_MSS_PREF_DIG_MIXER_CHANNELS
Definition mss_private.h:19
void dttr_mss_ail_close_stream(void *stream)
Definition mss_stream.c:230
void dttr_mss_core_destroy_mixer()
Definition mss_core.c:131
void dttr_mss_core_increment_driver_open_count()
Definition mss_core.c:168
void dttr_mss_ail_init_sample(void *sample)
Definition mss_sample.c:379
void dttr_mss_sample_apply_master_gain()
Definition mss_sample.c:329
bool dttr_mss_wave_decode_f32(const void *file_image, size_t size, mss_wave_info *info, float **frames_out)
Definition mss_wave.c:77
void dttr_mss_sdl_release_hooks()
Definition mss_sdl.c:205
void * dttr_mss_ail_allocate_sample_handle(void *driver)
Definition mss_sample.c:339
#define DTTR_MSS_DEFAULT_MIXER_CHANNELS
Definition mss_private.h:21
uint16_t dttr_mss_wave_read_u16le(const uint8_t *p)
Definition mss_wave.c:11
void dttr_mss_ail_set_sample_volume(void *sample, int volume)
Definition mss_sample.c:572
bool dttr_mss_core_ensure_mix_initialized()
Definition mss_core.c:79
static bool dttr_mss_wave_bits_supported(uint16_t bits_per_sample)
Definition mss_private.h:65
int dttr_mss_core_get_preference(unsigned int preference)
Definition mss_core.c:49
int dttr_mss_core_driver_open_count()
Definition mss_core.c:164
MIX_Mixer * dttr_mss_core_mixer()
Definition mss_core.c:146
void dttr_mss_ail_set_stream_volume(void *stream, int volume)
Definition mss_stream.c:298
int dttr_mss_wave_rate(const mss_wave_info *info)
Definition mss_wave.c:68
bool dttr_mss_core_has_driver()
Definition mss_core.c:32
int dttr_mss_track_status(MIX_Track *track, int previous_status)
Definition mss_track.c:71
int dttr_mss_ail_get_preference(unsigned int preference)
Definition mss_sdl.c:276
int dttr_mss_ail_waveOutOpen(void **driver_out, void *wave_out, int device_id, const void *format)
Definition mss_sdl.c:281
void dttr_mss_core_reset_preferences()
Definition mss_core.c:36
int dttr_mss_ail_set_sample_file(void *sample, const void *file_image, int block)
Definition mss_sample.c:391
void dttr_mss_ail_end_sample(void *sample)
Definition mss_sample.c:546
uint64_t frame_count
Definition mss_private.h:45
uint16_t bits_per_sample
Definition mss_private.h:42
uint16_t format_tag
Definition mss_private.h:38
uint16_t channels
Definition mss_private.h:39
uint16_t block_align
Definition mss_private.h:41
uint32_t sample_rate
Definition mss_private.h:40
size_t data_size
Definition mss_private.h:44
size_t data_offset
Definition mss_private.h:43