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;