Skip to content

Commit

Permalink
Don't initialize the audio buffer passed to the application's audio c…
Browse files Browse the repository at this point in the history
…allback,

 since they are expected to entirely fill it with data or silence.

For legacy apps that might expect the buffer to already have silence and thus
 may not fill the buffer in the callback, there's an environment variable to
 expose the old behaviour.

  Fixes Bugzilla #416.
  • Loading branch information
icculus committed Jul 5, 2007
1 parent a79e9d3 commit 4e47787
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/audio/SDL_audio.c
Expand Up @@ -117,6 +117,13 @@ static AudioBootStrap *bootstrap[] = {
};
SDL_AudioDevice *current_audio = NULL;

/*
* If non-zero, use legacy behaviour (memset the callback buffer before call).
* Changed to NOT initializing the buffer before the callback in 1.2.12.
* Set environment SDL_AUDIO_MUST_INIT_BUFFERS=1 to get old behaviour.
*/
static int must_init_callback_buffer = 0;

/* Various local functions */
int SDL_AudioInit(const char *driver_name);
void SDL_AudioQuit(void);
Expand Down Expand Up @@ -190,7 +197,10 @@ int SDLCALL SDL_RunAudio(void *audiop)
stream = audio->fake_stream;
}
}
SDL_memset(stream, silence, stream_len);

if ( must_init_callback_buffer ) {
SDL_memset(stream, silence, stream_len);
}

if ( ! audio->paused ) {
SDL_mutexP(audio->mixer_lock);
Expand Down Expand Up @@ -300,6 +310,9 @@ int SDL_AudioInit(const char *driver_name)
{
SDL_AudioDevice *audio;
int i = 0, idx;
const char *envr = SDL_getenv("SDL_AUDIO_MUST_INIT_BUFFERS");

must_init_callback_buffer = ((envr != NULL) && (SDL_atoi(envr)));

/* Check to make sure we don't overwrite 'current_audio' */
if ( current_audio != NULL ) {
Expand Down

0 comments on commit 4e47787

Please sign in to comment.