diff src/audio/alsa/SDL_alsa_audio.c @ 4347:38f22ed3a433 SDL-1.2

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.
author Sam Lantinga <slouken@libsdl.org>
date Sat, 17 Oct 2009 06:55:17 +0000
parents 819270e2f893
children b312352d8c8d
line wrap: on
line diff
--- 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);