102 Patches: Detours to the Rescue
C reference for DttR maintainers and modders.
Loading...
Searching...
No Matches
mss_core.c
Go to the documentation of this file.
1#include "mss_private.h"
2
3#include <dttr_log.h>
4
5#include <dttr_config.h>
6
7#include <string.h>
8
9static MIX_Mixer *mixer;
10static bool mix_initialized;
14static SDL_AudioSpec desired_spec;
15static SDL_AudioSpec mixer_spec;
16static bool has_desired_spec;
18
19static int *preference_slot(unsigned int preference) {
20 if (preference >= SDL_arraysize(preferences)) {
21 return NULL;
22 }
23
24 return &preferences[preference];
25}
26
27static void clear_desired_spec() {
28 memset(&desired_spec, 0, sizeof(desired_spec));
29 has_desired_spec = false;
30}
31
33 return driver_open_count > 0 && mixer;
34}
35
40
48
49int dttr_mss_core_get_preference(unsigned int preference) {
51 const int *slot = preference_slot(preference);
52 if (!slot) {
53 return 0;
54 }
55
56 return *slot;
57}
58
59int dttr_mss_core_set_preference(unsigned int preference, int value) {
61 int *slot = preference_slot(preference);
62 if (!slot) {
63 return 0;
64 }
65
66 int previous = *slot;
67 *slot = value;
68 return previous;
69}
70
72 return SDL_clamp(dttr_config.mss_sample_gain, 0.0f, 2.0f);
73}
74
76 return SDL_clamp(dttr_config.mss_sample_preemphasis, -1.0f, 2.0f);
77}
78
80 if (mix_initialized) {
81 return true;
82 }
83
84 if (!MIX_Init()) {
85 DTTR_LOG_ERROR("MIX_Init failed: %s", SDL_GetError());
86 return false;
87 }
88
89 mix_initialized = true;
90 return true;
91}
92
94 if (mixer) {
95 return true;
96 }
97
99 return false;
100 }
101
102 const SDL_AudioSpec fallback = {
103 .format = DTTR_MSS_MIXER_FORMAT,
104 .channels = DTTR_MSS_MIXER_CHANNELS,
105 .freq = DTTR_MSS_MIXER_RATE,
106 };
107
108 const SDL_AudioSpec *desired = has_desired_spec ? &desired_spec : &fallback;
109 mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, desired);
110 if (!mixer) {
111 DTTR_LOG_ERROR("MIX_CreateMixerDevice failed: %s", SDL_GetError());
112 return false;
113 }
114
115 SDL_AudioSpec actual = {0};
116 if (!MIX_GetMixerFormat(mixer, &actual)) {
117 mixer_spec = *desired;
118 return true;
119 }
120
121 mixer_spec = actual;
123 "MSS mixer opened: format=0x%04X channels=%d freq=%d",
124 (unsigned)actual.format,
125 actual.channels,
126 actual.freq
127 );
128 return true;
129}
130
132 if (mixer) {
133 MIX_DestroyMixer(mixer);
134 mixer = NULL;
135 }
136
137 if (mix_initialized) {
138 MIX_Quit();
139 mix_initialized = false;
140 }
141
142 memset(&mixer_spec, 0, sizeof(mixer_spec));
144}
145
147 return mixer;
148}
149
151 return mixer_spec;
152}
153
154void dttr_mss_core_set_desired_spec(const SDL_AudioSpec *spec) {
155 if (!spec) {
157 return;
158 }
159
160 desired_spec = *spec;
161 has_desired_spec = true;
162}
163
167
171
173 if (driver_open_count <= 0) {
174 return;
175 }
176
178}
179
183
185 return master_gain;
186}
187
189 master_gain = gain;
190}
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
DTTR_Config dttr_config
Definition defaults.c:53
#define DTTR_LOG_INFO(...)
Definition dttr_log.h:29
#define DTTR_LOG_ERROR(...)
Definition dttr_log.h:31
void dttr_mss_core_reset_driver_open_count()
Definition mss_core.c:180
void dttr_mss_core_set_desired_spec(const SDL_AudioSpec *spec)
Definition mss_core.c:154
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
static void clear_desired_spec()
Definition mss_core.c:27
void dttr_mss_core_ensure_preferences()
Definition mss_core.c:41
float dttr_mss_core_master_gain()
Definition mss_core.c:184
float dttr_mss_core_sample_preemphasis()
Definition mss_core.c:75
static bool has_desired_spec
Definition mss_core.c:16
static int * preference_slot(unsigned int preference)
Definition mss_core.c:19
int dttr_mss_core_set_preference(unsigned int preference, int value)
Definition mss_core.c:59
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 preferences[DTTR_MSS_PREFERENCES_CAPACITY]
Definition mss_core.c:13
static SDL_AudioSpec mixer_spec
Definition mss_core.c:15
static SDL_AudioSpec desired_spec
Definition mss_core.c:14
static int driver_open_count
Definition mss_core.c:11
void dttr_mss_core_destroy_mixer()
Definition mss_core.c:131
void dttr_mss_core_increment_driver_open_count()
Definition mss_core.c:168
static bool preferences_initialized
Definition mss_core.c:17
static bool mix_initialized
Definition mss_core.c:10
static MIX_Mixer * mixer
Definition mss_core.c:9
static float master_gain
Definition mss_core.c:12
bool dttr_mss_core_ensure_mix_initialized()
Definition mss_core.c:79
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
bool dttr_mss_core_has_driver()
Definition mss_core.c:32
void dttr_mss_core_reset_preferences()
Definition mss_core.c:36
#define DTTR_MSS_MIXER_RATE
Definition mss_private.h:32
#define DTTR_MSS_MIXER_CHANNELS
Definition mss_private.h:30
static void dttr_mss_reset_preferences(int *preferences, size_t count)
Definition mss_private.h:50
#define DTTR_MSS_MIXER_FORMAT
Definition mss_private.h:31
#define DTTR_MSS_DEFAULT_MASTER_GAIN
Definition mss_private.h:23
#define DTTR_MSS_PREFERENCES_CAPACITY
Definition mss_private.h:34