# HG changeset patch # User Sam Lantinga # Date 1255762517 0 # Node ID 38f22ed3a4330120d41a5c43a1737309492ebaf7 # Parent 5fe9b267cf55fac3ef8565cac77bcfed906d890b Option to fix bug #851 For some people setting the period size works better (and is what SDL 1.2.13 did), but for most people it's the same or worse. You can use an environment variable to pick which one you want. diff -r 5fe9b267cf55 -r 38f22ed3a433 src/audio/alsa/SDL_alsa_audio.c --- a/src/audio/alsa/SDL_alsa_audio.c Sat Oct 17 05:05:29 2009 +0000 +++ b/src/audio/alsa/SDL_alsa_audio.c Sat Oct 17 06:55:17 2009 +0000 @@ -43,8 +43,6 @@ /* The tag name used by ALSA audio */ #define DRIVER_NAME "alsa" -/* Whether we should set the buffer size or the period size */ -/*#define SET_PERIOD_SIZE*/ /*#define DEBUG_PERIOD_SIZE*/ /* Audio driver functions */ @@ -377,9 +375,7 @@ snd_pcm_format_t format; snd_pcm_uframes_t frames; unsigned int rate; -#ifdef SET_PERIOD_SIZE unsigned int periods; -#endif unsigned int channels; Uint16 test_format; @@ -475,28 +471,33 @@ spec->freq = rate; /* Set the buffer size, in samples */ -#ifdef SET_PERIOD_SIZE - frames = spec->samples; - status = SDL_NAME(snd_pcm_hw_params_set_period_size_near)(pcm_handle, hwparams, &frames, NULL); - if ( status < 0 ) { - SDL_SetError("Couldn't set period size: %s", SDL_NAME(snd_strerror)(status)); - ALSA_CloseAudio(this); - return(-1); - } + if (getenv("SDL_AUDIO_ALSA_SET_PERIOD_SIZE")) { + frames = spec->samples; + status = SDL_NAME(snd_pcm_hw_params_set_period_size_near)(pcm_handle, hwparams, &frames, NULL); + if ( status < 0 ) { + SDL_SetError("Couldn't set period size: %s", SDL_NAME(snd_strerror)(status)); + ALSA_CloseAudio(this); + return(-1); + } - spec->samples = frames; + spec->samples = frames; - periods = 2; - status = SDL_NAME(snd_pcm_hw_params_set_periods_near)(pcm_handle, hwparams, &periods, NULL); - if ( status < 0 ) { - SDL_SetError("Couldn't set period count: %s", SDL_NAME(snd_strerror)(status)); - ALSA_CloseAudio(this); - return(-1); + periods = 2; + status = SDL_NAME(snd_pcm_hw_params_set_periods_near)(pcm_handle, hwparams, &periods, NULL); + if ( status < 0 ) { + SDL_SetError("Couldn't set period count: %s", SDL_NAME(snd_strerror)(status)); + ALSA_CloseAudio(this); + return(-1); + } + } else { + frames = spec->samples * 2; + status = SDL_NAME(snd_pcm_hw_params_set_buffer_size_near)(pcm_handle, hwparams, &frames); + if ( status < 0 ) { + SDL_SetError("Couldn't set buffer size: %s", SDL_NAME(snd_strerror)(status)); + ALSA_CloseAudio(this); + return(-1); + } } -#else - frames = spec->samples * 2; - status = SDL_NAME(snd_pcm_hw_params_set_buffer_size_near)(pcm_handle, hwparams, &frames); -#endif /* "set" the hardware with the desired parameters */ status = SDL_NAME(snd_pcm_hw_params)(pcm_handle, hwparams);