# HG changeset patch # User Sam Lantinga # Date 1255922295 0 # Node ID be2dff2f79c0d3f82be3c55ffeba70b381c0935e # Parent 4b582c04ec1da7b543432d7b2eba9e9410e9bb68 Getting as close as you can with periods is better than the default parameters. diff -r 4b582c04ec1d -r be2dff2f79c0 src/audio/alsa/SDL_alsa_audio.c --- a/src/audio/alsa/SDL_alsa_audio.c Mon Oct 19 02:36:02 2009 +0000 +++ b/src/audio/alsa/SDL_alsa_audio.c Mon Oct 19 03:18:15 2009 +0000 @@ -380,11 +380,10 @@ return(0); } -static int ALSA_set_period_size(_THIS, SDL_AudioSpec *spec, snd_pcm_hw_params_t *params) +static int ALSA_set_period_size(_THIS, SDL_AudioSpec *spec, snd_pcm_hw_params_t *params, int override) { const char *env; int status; - int override = 0; snd_pcm_hw_params_t *hwparams; snd_pcm_uframes_t frames; unsigned int periods; @@ -393,11 +392,13 @@ snd_pcm_hw_params_alloca(&hwparams); SDL_NAME(snd_pcm_hw_params_copy)(hwparams, params); - env = getenv("SDL_AUDIO_ALSA_SET_PERIOD_SIZE"); - if ( env ) { - override = SDL_atoi(env); - if ( override == 0 ) { - return(-1); + if ( !override ) { + env = getenv("SDL_AUDIO_ALSA_SET_PERIOD_SIZE"); + if ( env ) { + override = SDL_atoi(env); + if ( override == 0 ) { + return(-1); + } } } @@ -416,11 +417,10 @@ return ALSA_finalize_hardware(this, spec, hwparams, override); } -static int ALSA_set_buffer_size(_THIS, SDL_AudioSpec *spec, snd_pcm_hw_params_t *params) +static int ALSA_set_buffer_size(_THIS, SDL_AudioSpec *spec, snd_pcm_hw_params_t *params, int override) { const char *env; int status; - int override = 0; snd_pcm_hw_params_t *hwparams; snd_pcm_uframes_t frames; @@ -428,11 +428,13 @@ snd_pcm_hw_params_alloca(&hwparams); SDL_NAME(snd_pcm_hw_params_copy)(hwparams, params); - env = getenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE"); - if ( env ) { - override = SDL_atoi(env); - if ( override == 0 ) { - return(-1); + if ( !override ) { + env = getenv("SDL_AUDIO_ALSA_SET_BUFFER_SIZE"); + if ( env ) { + override = SDL_atoi(env); + if ( override == 0 ) { + return(-1); + } } } @@ -548,10 +550,10 @@ spec->freq = rate; /* Set the buffer size, in samples */ - if ( ALSA_set_period_size(this, spec, hwparams) < 0 && - ALSA_set_buffer_size(this, spec, hwparams) < 0 ) { - /* Failed to set buffer size, try to just use the defaults */ - if ( ALSA_finalize_hardware(this, spec, hwparams, 1) < 0 ) { + if ( ALSA_set_period_size(this, spec, hwparams, 0) < 0 && + ALSA_set_buffer_size(this, spec, hwparams, 0) < 0 ) { + /* Failed to set desired buffer size, do the best you can... */ + if ( ALSA_set_period_size(this, spec, hwparams, 1) < 0 ) { SDL_SetError("Couldn't set hardware audio parameters: %s", SDL_NAME(snd_strerror)(status)); ALSA_CloseAudio(this); return(-1);