summaryrefslogtreecommitdiffstats
path: root/games/sdl3-doom/patches/0001-i_sdlmusic-port-music-backend-to-the-SDL3_mixer-3.2-.patch
blob: 9dd0e2d2279d835d45cc38b33c1e9165892f4f6e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
From 0898b8bc17127829ea44325985e70c49c800ff21 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
Date: Tue, 9 Jun 2026 16:25:51 +0100
Subject: [PATCH] i_sdlmusic: port music backend to the SDL3_mixer 3.2 MIX_*
 API

The Mix_* SDL_mixer API used by this port was removed in SDL_mixer 3.2.0.
Port the music backend to the new track-based MIX_* API: a single
MIX_Mixer device and MIX_Track, MIX_LoadAudio for songs, MIX_PlayTrack
with the MIX_PROP_PLAY_LOOPS_NUMBER property for looping, MIX_SetTrackGain
for volume and MIX_GetTrackPlaybackPosition for the substitute-music loop
points (replacing the removed post-mix effect callback).

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
 src/i_sdlmusic.c | 107 ++++++++++++++++++++++++-----------------------
 1 file changed, 55 insertions(+), 52 deletions(-)

--- a/src/i_sdlmusic.c
+++ b/src/i_sdlmusic.c
@@ -119,12 +119,13 @@ static char *temp_timidity_cfg = NULL;
 static boolean playing_substitute = false;
 static file_metadata_t file_metadata;
 
-// Position (in samples) that we have reached in the current track.
-// This is updated by the TrackPositionCallback function.
-static unsigned int current_track_pos;
+// SDL3_mixer mixer device and the single track used for music playback.
+static MIX_Mixer *music_mixer = NULL;
+static MIX_Track *music_track = NULL;
+static int music_freq = 44100;
 
 // Currently playing music track.
-static Mix_Music *current_track_music = NULL;
+static MIX_Audio *current_track_music = NULL;
 
 // If true, the currently playing track is being played on loop.
 static boolean current_track_loop;
@@ -852,12 +853,16 @@ static void I_SDL_ShutdownMusic(void)
 {
     if (music_initialized)
     {
-        Mix_HaltMusic();
+        MIX_StopTrack(music_track, 0);
         music_initialized = false;
 
         if (sdl_was_initialized)
         {
-            Mix_CloseAudio();
+            MIX_DestroyTrack(music_track);
+            music_track = NULL;
+            MIX_DestroyMixer(music_mixer);
+            music_mixer = NULL;
+            MIX_Quit();
             SDL_QuitSubSystem(SDL_INIT_AUDIO);
             sdl_was_initialized = false;
         }
@@ -866,17 +871,7 @@ static void I_SDL_ShutdownMusic(void)
 
 static boolean SDLIsInitialized(void)
 {
-    int freq, channels;
-    SDL_AudioFormat format;
-
-    return Mix_QuerySpec(&freq, &format, &channels) != 0;
-}
-
-// Callback function that is invoked to track current track position.
-void TrackPositionCallback(int chan, void *stream, int len, void *udata)
-{
-    // Position is doubled up twice: for 16-bit samples and for stereo.
-    current_track_pos += len / 4;
+    return music_mixer != NULL;
 }
 
 // Initialize music subsystem
@@ -928,20 +923,29 @@ static boolean I_SDL_InitMusic(void)
     }
     else
     {
-        const SDL_AudioSpec spec = {SDL_AUDIO_S16, 2, 1024};
+        const SDL_AudioSpec spec = {SDL_AUDIO_S16, 2, 44100};
         if (!SDL_Init(SDL_INIT_AUDIO))
         {
             fprintf(stderr, "Unable to set up sound.\n");
         }
-        else if (!Mix_OpenAudio(0, &spec))
+        else if (!MIX_Init())
         {
-            fprintf(stderr, "Error initializing SDL_mixer: %s\n",
+            fprintf(stderr, "Error initializing SDL3_mixer: %s\n",
                     SDL_GetError());
             SDL_QuitSubSystem(SDL_INIT_AUDIO);
         }
+        else if (!(music_mixer = MIX_CreateMixerDevice(
+                       SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &spec)))
+        {
+            fprintf(stderr, "Error initializing SDL3_mixer: %s\n",
+                    SDL_GetError());
+            MIX_Quit();
+            SDL_QuitSubSystem(SDL_INIT_AUDIO);
+        }
         else
         {
-            Mix_PauseAudio(0);
+            music_track = MIX_CreateTrack(music_mixer);
+            music_freq = spec.freq;
 
             sdl_was_initialized = true;
             music_initialized = true;
@@ -961,9 +965,6 @@ static boolean I_SDL_InitMusic(void)
         fprintf(stderr, "SDL3_Mixer does not support external music playback.\n");
     }
 
-    // Register an effect function to track the music position.
-    Mix_RegisterEffect(MIX_CHANNEL_POST, TrackPositionCallback, NULL, NULL);
-
     // If we're in GENMIDI mode, try to load sound packs.
     if (snd_musicdevice == SNDDEVICE_GENMIDI)
     {
@@ -980,18 +981,18 @@ static boolean I_SDL_InitMusic(void)
 
 static void UpdateMusicVolume(void)
 {
-    int vol;
+    float gain;
 
     if (musicpaused)
     {
-        vol = 0;
+        gain = 0.0f;
     }
     else
     {
-        vol = (current_music_volume * MIX_MAX_VOLUME) / 127;
+        gain = (float) current_music_volume / 127.0f;
     }
 
-    Mix_VolumeMusic(vol);
+    MIX_SetTrackGain(music_track, gain);
 }
 
 // Set music volume (0 - 127)
@@ -1020,7 +1021,7 @@ static void I_SDL_PlaySong(void *handle,
         return;
     }
 
-    current_track_music = (Mix_Music *) handle;
+    current_track_music = (MIX_Audio *) handle;
     current_track_loop = looping;
 
     if (looping)
@@ -1029,18 +1030,23 @@ static void I_SDL_PlaySong(void *handle,
     }
     else
     {
-        loops = 1;
+        loops = 0;
     }
 
     // Don't loop when playing substitute music, as we do it
     // ourselves instead.
     if (playing_substitute && file_metadata.valid)
     {
-        loops = 1;
-        current_track_pos = 0;  // start of track
+        loops = 0;
     }
 
-    Mix_PlayMusic(current_track_music, loops);
+    {
+        SDL_PropertiesID opts = SDL_CreateProperties();
+        SDL_SetNumberProperty(opts, MIX_PROP_PLAY_LOOPS_NUMBER, loops);
+        MIX_SetTrackAudio(music_track, current_track_music);
+        MIX_PlayTrack(music_track, opts);
+        SDL_DestroyProperties(opts);
+    }
 }
 
 static void I_SDL_PauseSong(void)
@@ -1074,14 +1080,14 @@ static void I_SDL_StopSong(void)
         return;
     }
 
-    Mix_HaltMusic();
+    MIX_StopTrack(music_track, 0);
     playing_substitute = false;
     current_track_music = NULL;
 }
 
 static void I_SDL_UnRegisterSong(void *handle)
 {
-    Mix_Music *music = (Mix_Music *) handle;
+    MIX_Audio *music = (MIX_Audio *) handle;
 
     if (!music_initialized)
     {
@@ -1093,7 +1099,7 @@ static void I_SDL_UnRegisterSong(void *h
         return;
     }
 
-    Mix_FreeMusic(music);
+    MIX_DestroyAudio(music);
 }
 
 // Determine whether memory block is a .mid file 
@@ -1132,7 +1138,7 @@ static boolean ConvertMus(byte *musdata,
 static void *I_SDL_RegisterSong(void *data, int len)
 {
     char *filename;
-    Mix_Music *music;
+    MIX_Audio *music;
 
     if (!music_initialized)
     {
@@ -1146,7 +1152,7 @@ static void *I_SDL_RegisterSong(void *da
 
     if (filename != NULL)
     {
-        music = Mix_LoadMUS(filename);
+        music = MIX_LoadAudio(music_mixer, filename, false);
 
         if (music == NULL)
         {
@@ -1185,7 +1191,7 @@ static void *I_SDL_RegisterSong(void *da
     // by now, but Mix_SetMusicCMD() only works with Mix_LoadMUS(), so
     // we have to generate a temporary file.
 
-    music = Mix_LoadMUS(filename);
+    music = MIX_LoadAudio(music_mixer, filename, false);
 
     if (music == NULL)
     {
@@ -1217,19 +1223,13 @@ static boolean I_SDL_MusicIsPlaying(void
         return false;
     }
 
-    return Mix_PlayingMusic();
+    return MIX_TrackPlaying(music_track);
 }
 
 // Get position in substitute music track, in seconds since start of track.
 static double GetMusicPosition(void)
 {
-    unsigned int music_pos;
-    int freq;
-
-    Mix_QuerySpec(&freq, NULL, NULL);
-    music_pos = current_track_pos;
-
-    return (double) music_pos / freq;
+    return (double) MIX_GetTrackPlaybackPosition(music_track) / music_freq;
 }
 
 static void RestartCurrentTrack(void)
@@ -1244,15 +1244,18 @@ static void RestartCurrentTrack(void)
         // If the track finished we need to restart it.
         if (current_track_music != NULL)
         {
-            Mix_PlayMusic(current_track_music, 1);
+            SDL_PropertiesID opts = SDL_CreateProperties();
+            SDL_SetNumberProperty(opts, MIX_PROP_PLAY_LOOPS_NUMBER, 0);
+            MIX_SetTrackAudio(music_track, current_track_music);
+            MIX_PlayTrack(music_track, opts);
+            SDL_DestroyProperties(opts);
         }
 
-        Mix_SetMusicPosition(start);
-        current_track_pos = file_metadata.start_time;
+        MIX_SetTrackPlaybackPosition(music_track, (Sint64) (start * music_freq));
     }
     else
     {
-        Mix_HaltMusic();
+        MIX_StopTrack(music_track, 0);
         current_track_music = NULL;
         playing_substitute = false;
     }
@@ -1274,7 +1277,7 @@ static void I_SDL_PollMusic(void)
         }
 
         // Have we reached the actual end of track (not loop end)?
-        if (!Mix_PlayingMusic() && current_track_loop)
+        if (!MIX_TrackPlaying(music_track) && current_track_loop)
         {
             RestartCurrentTrack();
         }