Navigation Menu

Skip to content

Commit

Permalink
Option to fix bug #851
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
slouken committed Oct 17, 2009
1 parent c7b387e commit 002bd85
Showing 1 changed file with 24 additions and 23 deletions.
47 changes: 24 additions & 23 deletions src/audio/alsa/SDL_alsa_audio.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 002bd85

Please sign in to comment.