From b634b7d1982c3dfa626b4bc37ae7762a7bd40879 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 17 Oct 2009 06:55:17 +0000 Subject: [PATCH] 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. --HG-- branch : SDL-1.2 --- src/audio/alsa/SDL_alsa_audio.c | 47 +++++++++++++++++---------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/audio/alsa/SDL_alsa_audio.c b/src/audio/alsa/SDL_alsa_audio.c index 97bb4b2af..df803b644 100644 --- a/src/audio/alsa/SDL_alsa_audio.c +++ b/src/audio/alsa/SDL_alsa_audio.c @@ -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 @@ static int ALSA_OpenAudio(_THIS, SDL_AudioSpec *spec) 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 @@ static int ALSA_OpenAudio(_THIS, SDL_AudioSpec *spec) 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);