Skip to content

Commit

Permalink
audio: Calculate a legitimate SDL_AudioSpec::silence in SDL_LoadWAV_R…
Browse files Browse the repository at this point in the history
…W().
  • Loading branch information
icculus committed Jan 21, 2020
1 parent 55afc28 commit dbe5c14
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 15 deletions.
34 changes: 19 additions & 15 deletions src/audio/SDL_audio.c
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions src/audio/SDL_audio_c.h
Expand Up @@ -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 */
Expand Down
2 changes: 2 additions & 0 deletions src/audio/SDL_wave.c
Expand Up @@ -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;
Expand Down

0 comments on commit dbe5c14

Please sign in to comment.