From dbe5c14b339ccc10183205646b4d4316f1c3a91f Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Tue, 21 Jan 2020 15:49:37 -0500 Subject: [PATCH] audio: Calculate a legitimate SDL_AudioSpec::silence in SDL_LoadWAV_RW(). --- src/audio/SDL_audio.c | 34 +++++++++++++++++++--------------- src/audio/SDL_audio_c.h | 1 + src/audio/SDL_wave.c | 2 ++ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/audio/SDL_audio.c b/src/audio/SDL_audio.c index 652119cb8..3258dca0d 100644 --- a/src/audio/SDL_audio.c +++ b/src/audio/SDL_audio.c @@ -1664,24 +1664,28 @@ SDL_NextAudioFormat(void) return format_list[format_idx][format_idx_sub++]; } +Uint8 +SDL_SilenceValueForFormat(const SDL_AudioFormat format) +{ + switch (format) { + // !!! FIXME: 0x80 isn't perfect for U16, but we can't fit 0x8000 in a + // !!! FIXME: byte for memset() use. This is actually 0.1953 percent off + // from silence. Maybe just don't use U16. + case AUDIO_U16LSB: + case AUDIO_U16MSB: + case AUDIO_U8: + return 0x80; + + default: break; + } + + return 0x00; +} + void SDL_CalculateAudioSpec(SDL_AudioSpec * spec) { - switch (spec->format) { - case AUDIO_U8: - - // !!! FIXME: 0x80 isn't perfect for U16, but we can't fit 0x8000 in a - // !!! FIXME: byte for memset() use. This is actually 0.1953 percent off - // from silence. Maybe just don't use U16. - case AUDIO_U16LSB: - case AUDIO_U16MSB: - spec->silence = 0x80; - break; - - default: - spec->silence = 0x00; - break; - } + spec->silence = SDL_SilenceValueForFormat(spec->format); spec->size = SDL_AUDIO_BITSIZE(spec->format) / 8; spec->size *= spec->channels; spec->size *= spec->samples; diff --git a/src/audio/SDL_audio_c.h b/src/audio/SDL_audio_c.h index d7b34c299..aa3bf2084 100644 --- a/src/audio/SDL_audio_c.h +++ b/src/audio/SDL_audio_c.h @@ -52,6 +52,7 @@ extern SDL_AudioFormat SDL_FirstAudioFormat(SDL_AudioFormat format); extern SDL_AudioFormat SDL_NextAudioFormat(void); /* Function to calculate the size and silence for a SDL_AudioSpec */ +extern Uint8 SDL_SilenceValueForFormat(const SDL_AudioFormat format); extern void SDL_CalculateAudioSpec(SDL_AudioSpec * spec); /* Choose the audio filter functions below */ diff --git a/src/audio/SDL_wave.c b/src/audio/SDL_wave.c index f601baef2..71adb9e02 100644 --- a/src/audio/SDL_wave.c +++ b/src/audio/SDL_wave.c @@ -2081,6 +2081,8 @@ WaveLoad(SDL_RWops *src, WaveFile *file, SDL_AudioSpec *spec, Uint8 **audio_buf, break; } + spec->silence = SDL_SilenceValueForFormat(spec->format); + /* Report the end position back to the cleanup code. */ if (RIFFlengthknown) { chunk->position = RIFFend;