SDL_mixer: Simplify code using SDL_ConvertAudioSamples

From bb8cf24fa750913cc230f2791cbfc12c4bf0d6da Mon Sep 17 00:00:00 2001
From: Sylvain <[EMAIL REDACTED]>
Date: Tue, 24 Jan 2023 11:29:09 +0100
Subject: [PATCH] Simplify code using SDL_ConvertAudioSamples

---
 src/mixer.c | 65 +++++++++--------------------------------------------
 1 file changed, 11 insertions(+), 54 deletions(-)

diff --git a/src/mixer.c b/src/mixer.c
index b27fd698..48f5ff74 100644
--- a/src/mixer.c
+++ b/src/mixer.c
@@ -833,65 +833,22 @@ Mix_Chunk *Mix_LoadWAV_RW(SDL_RWops *src, int freesrc)
 
     /* Build the audio converter and create conversion buffers */
     if (wavespec.format != mixer.format ||
-         wavespec.channels != mixer.channels ||
-         wavespec.freq != mixer.freq) {
-        SDL_AudioStream *stream;
-        int src_samplesize, dst_samplesize;
-        Uint8 *dst_buf = NULL;
-        int src_len, dst_len, real_dst_len;
+        wavespec.channels != mixer.channels ||
+        wavespec.freq != mixer.freq) {
 
-        src_samplesize = (SDL_AUDIO_BITSIZE(wavespec.format) / 8) * wavespec.channels;
-        dst_samplesize = (SDL_AUDIO_BITSIZE(mixer.format) / 8) * mixer.channels;
+        Uint8 *dst_data = NULL;
+        int dst_len = 0;
 
-        stream = SDL_CreateAudioStream(wavespec.format, wavespec.channels, wavespec.freq,
-                                       mixer.format, mixer.channels, mixer.freq);
-        if (stream == NULL) {
-            goto failure;
-        }
-
-        src_len = chunk->alen & ~(src_samplesize - 1);
-        dst_len = dst_samplesize * (src_len / src_samplesize);
-        if (wavespec.freq < mixer.freq) {
-            const double mult = ((double)mixer.freq) / ((double)wavespec.freq);
-            dst_len *= (int) SDL_ceil(mult);
-        }
-
-        dst_len = dst_len & ~(dst_samplesize - 1);
-        dst_buf = (Uint8 *)SDL_calloc(1, dst_len);
-        if (dst_buf == NULL) {
-            Mix_OutOfMemory();
-            goto failure;
-        }
-
-        /* Run the audio converter */
-        if (SDL_PutAudioStreamData(stream, chunk->abuf, src_len) < 0 ||
-            SDL_FlushAudioStream(stream) < 0) {
-            goto failure;
-        }
-
-        real_dst_len = SDL_GetAudioStreamData(stream, dst_buf, dst_len);
-        if (real_dst_len < 0) {
-            goto failure;
-        }
-
-        SDL_DestroyAudioStream(stream);
-        SDL_free(chunk->abuf);
-
-        {
-            Uint8 *resized_buf = SDL_realloc(dst_buf, real_dst_len);
-            if (resized_buf) {
-                dst_buf = resized_buf;
-            }
+        if (SDL_ConvertAudioSamples(wavespec.format, wavespec.channels, wavespec.freq, chunk->alen, chunk->abuf,
+                                    mixer.format, mixer.channels, mixer.freq, &dst_len, &dst_data) < 0) {
+            SDL_free(chunk->abuf);
+            SDL_free(chunk);
+            return NULL;
         }
-        chunk->abuf = dst_buf;
-        chunk->alen = real_dst_len;
-        return chunk;
 
-failure:
         SDL_free(chunk->abuf);
-        SDL_free(chunk);
-        SDL_free(dst_buf);
-        return NULL;
+        chunk->abuf = dst_data;
+        chunk->alen = dst_len;
     }
 
     return chunk;