File openal-0.0.8-alsa-backend-fix.diff of Package openal

# HG changeset patch
# User tiwai
# Date 1182851580 -7200
# Node ID abe8ba9de91a4d173209ec750df3de6f3e7389fb
# Parent  1a2b02ef84229cfc1e650b51c95a0a9acd761b00
Fix ALSA backend

diff -r 1a2b02ef8422 -r abe8ba9de91a src/Makefile.am
--- a/src/Makefile.am	Mon Jun 25 15:21:50 2007 +0200
+++ b/src/Makefile.am	Tue Jun 26 11:53:00 2007 +0200
@@ -219,4 +219,9 @@ libopenal_la_LDFLAGS = -no-undefined $(P
 # We use sin and friends, so we might need -lm, autoconf takes care of this.
 libopenal_la_LIBADD = $(LIBM) $(asm_ldadd)
 
+if USEBACKENDALSA
+libopenal_la_LIBADD += -lasound
+endif
+
+
 SUBDIRS = $(X86_SUBDIR)
diff -r 1a2b02ef8422 -r abe8ba9de91a src/backends/alc_backend_alsa.c
--- a/src/backends/alc_backend_alsa.c	Mon Jun 25 15:21:50 2007 +0200
+++ b/src/backends/alc_backend_alsa.c	Tue Jun 26 11:53:00 2007 +0200
@@ -43,117 +43,8 @@
 
 #include <alsa/asoundlib.h>
 
-static void *alsa_lib_handle = NULL;
-static int (*psnd_pcm_hw_params_malloc)(snd_pcm_hw_params_t **ptr) = NULL;
-static void (*psnd_pcm_hw_params_free)(snd_pcm_hw_params_t *obj) = NULL;
-static const char *(*psnd_strerror)(int errnum) = NULL;
-static size_t (*psnd_pcm_info_sizeof)(void) = NULL;
-static int (*psnd_pcm_close)(snd_pcm_t *pcm) = NULL;
-static int (*psnd_pcm_hw_params)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) = NULL;
-static int (*psnd_pcm_hw_params_any)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) = NULL;
-static int (*psnd_pcm_hw_params_set_access)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t acc) = NULL;
-static int (*psnd_pcm_hw_params_set_buffer_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val) = NULL;
-static int (*psnd_pcm_hw_params_set_channels)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val) = NULL;
-static int (*psnd_pcm_hw_params_set_format)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val) = NULL;
-static int (*psnd_pcm_hw_params_set_periods_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir) = NULL;
-static int (*psnd_pcm_hw_params_set_rate_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir) = NULL;
-static size_t (*psnd_pcm_hw_params_sizeof)(void) = NULL;
-static int (*psnd_pcm_prepare)(snd_pcm_t *pcm) = NULL;
-static snd_pcm_sframes_t (*psnd_pcm_readi)(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size) = NULL;
-static int (*psnd_pcm_resume)(snd_pcm_t *pcm) = NULL;
-static snd_pcm_sframes_t (*psnd_pcm_writei)(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size) = NULL;
-static int (*psnd_pcm_hw_params_set_period_size_near)(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir) = NULL;
-static int (*psnd_pcm_open)(snd_pcm_t **pcm, const char *name,
-                     snd_pcm_stream_t stream, int mode) = NULL;
-static int (*psnd_pcm_nonblock)(snd_pcm_t * pcm, int nonblock) = NULL;
-
-/* !!! FIXME: hhm...this is a problem. */
-#if (SND_LIB_MAJOR == 0)
-static int (*psnd_pcm_hw_params_get_buffer_size)(const snd_pcm_hw_params_t *params) = NULL;
-static int (*psnd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *params) = NULL;
-static snd_pcm_sframes_t (*psnd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *params, int *dir) = NULL;
-#else
-static int (*psnd_pcm_hw_params_get_buffer_size)(const snd_pcm_hw_params_t *params,
-                                          snd_pcm_uframes_t *val) = NULL;
-static int (*psnd_pcm_hw_params_get_channels)(const snd_pcm_hw_params_t *params, unsigned int *val) = NULL;
-static int (*psnd_pcm_hw_params_get_period_size)(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir) = NULL;
-#endif
-
-static int openal_load_alsa_library(void)
-{
-#ifdef OPENAL_DLOPEN_ALSA
-        char * error = NULL;
-#endif
-    
-	if (alsa_lib_handle != NULL)
-		return 1;  /* already loaded. */
-
-        /* versioned symbol fetching macro, or NULL if no dlvsym available */
-#ifdef _GNU_SOURCE
-#define AL_DLVSYM dlvsym
-#else
-#define AL_DLVSYM(a,b,c) NULL
-#endif
-
-        /* ALSA uses symbol versioning, which is usually a good thing except
-           that it turns dlsym() into a lottery.  So, we look for known-good
-           symbol versions first before falling back to unversioned symbols. */
-        /* this is our current preferred symbol versioning order:
-           ALSA_0.9.0rc4 > (generic) */
-	#ifdef OPENAL_DLOPEN_ALSA
-		#define OPENAL_LOAD_ALSA_SYMBOL(x) p##x = AL_DLVSYM(alsa_lib_handle, #x, "ALSA_0.9.0rc4"); \
-                                                   error = dlerror(); \
-                                                   if ((error != NULL)||(p##x == NULL)) { \
-                                                           p##x = dlsym(alsa_lib_handle, #x); \
-                                                           error = dlerror(); \
-                                                           if ((error != NULL)||(p##x == NULL)) { \
-                                                                   fprintf(stderr,"Could not resolve ALSA symbol %s: %s\n", #x, ((error!=NULL)?(error):("(null)"))); \
-                                                                   dlclose(alsa_lib_handle); alsa_lib_handle = NULL; \
-                                                                   return 0; } else _alDebug(ALD_MAXIMUS, __FILE__, __LINE__, "got %s", #x); \
-                                                   } else _alDebug(ALD_MAXIMUS, __FILE__, __LINE__, "got %s", #x "@ALSA_0.9rc4");
-                dlerror(); /* clear error state */
-		alsa_lib_handle = dlopen("libasound.so.2", RTLD_LAZY | RTLD_GLOBAL);
-                error = dlerror();
-		if (alsa_lib_handle == NULL) {
-                        fprintf(stderr,"Could not open ALSA library: %s\n",((error!=NULL)?(error):("(null)")));
-			return 0;
-                }
-	#else
-		#define OPENAL_LOAD_ALSA_SYMBOL(x) p##x = x;
-		alsa_lib_handle = (void *) 0xF00DF00D;
-	#endif
-
-	OPENAL_LOAD_ALSA_SYMBOL(snd_strerror);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_info_sizeof);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_malloc);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_free);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_open);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_close);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_any);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_get_buffer_size);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_get_channels);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_get_period_size);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_access);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_buffer_size_near);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_channels);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_format);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_period_size_near);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_periods_near);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_set_rate_near);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_hw_params_sizeof);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_open);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_nonblock);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_prepare);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_readi);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_resume);
-	OPENAL_LOAD_ALSA_SYMBOL(snd_pcm_writei);
-
-	return 1;
-}
-
 /* alsa stuff */
-#define DEFAULT_DEVICE "plughw:0,0"
+#define DEFAULT_DEVICE "default"
 
 /* convert from AL to ALSA format */
 static int AL2ALSAFMT(ALenum format);
@@ -185,7 +76,7 @@ void release_alsa(void *handle)
 	struct alsa_info *ai = handle;
 	if(handle == NULL)
 	  return;
-	psnd_pcm_close(ai->handle);
+	snd_pcm_close(ai->handle);
 	free(ai);
 }
 
@@ -196,15 +87,12 @@ static void *grab_read_alsa( void )
 	char card_name[256];
 	int err;
 
-	if (!openal_load_alsa_library())
-		return NULL;
-
 	get_in_device_name(card_name, 256);
 
-	err = psnd_pcm_open(&handle, card_name, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK);
-	if(err < 0)
-	{
-		const char *serr = psnd_strerror(err);
+	err = snd_pcm_open(&handle, card_name, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK);
+	if(err < 0)
+	{
+		const char *serr = snd_strerror(err);
 
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 				"grab_alsa: init failed: %s", serr);
@@ -280,18 +168,15 @@ static void *grab_write_alsa( void )
 	char card_name[256];
 	int err;
 
-	if (!openal_load_alsa_library())
-		return NULL;
-
 	get_out_device_name(card_name, 256);
 
         /* Try to open the device without blocking, so we can 
          * try other backends even if this would block.
          */
-	err = psnd_pcm_open(&handle, card_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
-	if(err < 0)
-	{
-		const char *serr = psnd_strerror(err);
+	err = snd_pcm_open(&handle, card_name, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
+	if(err < 0)
+	{
+		const char *serr = snd_strerror(err);
 
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 			"grab_alsa: init failed: %s", serr);
@@ -302,10 +187,10 @@ static void *grab_write_alsa( void )
         /* Now that we have successfully opened the device, 
          * we can put it into blocking mode.
          */
-        err = psnd_pcm_nonblock(handle,0);
-	if(err < 0)
-	{
-		const char *serr = psnd_strerror(err);
+        err = snd_pcm_nonblock(handle,0);
+	if(err < 0)
+	{
+		const char *serr = snd_strerror(err);
 
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 			"grab_alsa: could not put device into blocking mode: %s", serr);
@@ -367,105 +252,96 @@ static ALboolean set_read_alsa( void *ha
 
 	phandle = ai->handle;
 
-	psnd_pcm_hw_params_malloc(&setup);
-	err = psnd_pcm_hw_params_any(phandle, setup);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: Could not query parameters: %s",psnd_strerror(err));
-
-		psnd_pcm_hw_params_free(setup);
+	snd_pcm_hw_params_malloc(&setup);
+	err = snd_pcm_hw_params_any(phandle, setup);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_read_alsa: Could not query parameters: %s",snd_strerror(err));
+
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 	/* set the interleaved read format */
-	err = psnd_pcm_hw_params_set_access(phandle, setup, SND_PCM_ACCESS_RW_INTERLEAVED);
+	err = snd_pcm_hw_params_set_access(phandle, setup, SND_PCM_ACCESS_RW_INTERLEAVED);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: Could not set access type: %s",psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
+				"set_read_alsa: Could not set access type: %s",snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 	/* set format */
-	err = psnd_pcm_hw_params_set_format(phandle, setup, ai->format);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: could not set format: %s",psnd_strerror(err));
-
-		psnd_pcm_hw_params_free(setup);
+	err = snd_pcm_hw_params_set_format(phandle, setup, ai->format);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_read_alsa: could not set format: %s",snd_strerror(err));
+
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 
 	/* channels */
-	err = psnd_pcm_hw_params_set_channels(phandle, setup, ai->channels);
+	err = snd_pcm_hw_params_set_channels(phandle, setup, ai->channels);
 	if(err < 0)
 	{
 		unsigned int ch;
-#if (SND_LIB_MAJOR == 0)
-		ch = err = psnd_pcm_hw_params_get_channels(setup);
-#else
-		err = psnd_pcm_hw_params_get_channels(setup, &ch);
-#endif
+		err = snd_pcm_hw_params_get_channels(setup, &ch);
 
 		if (ch != ai->channels) {
 			_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-					"set_read_alsa: could not set channels: %s",psnd_strerror(err));
-
-			psnd_pcm_hw_params_free(setup);
+					"set_read_alsa: could not set channels: %s",snd_strerror(err));
+
+			snd_pcm_hw_params_free(setup);
 			return AL_FALSE;
 		}
 	}
 
 
 	/* sampling rate */
-	err = psnd_pcm_hw_params_set_rate_near(phandle, setup, &ai->speed, NULL);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: could not set speed: %s",psnd_strerror(err));
-
-		psnd_pcm_hw_params_free(setup);
+	err = snd_pcm_hw_params_set_rate_near(phandle, setup, &ai->speed, NULL);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_read_alsa: could not set speed: %s",snd_strerror(err));
+
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 	/* Set number of periods. Periods used to be called fragments. */
 	{ snd_pcm_uframes_t val = 4096;
-	err = psnd_pcm_hw_params_set_period_size_near(phandle, setup, &val, NULL);
+	err = snd_pcm_hw_params_set_period_size_near(phandle, setup, &val, NULL);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-	}
-
-	err = psnd_pcm_hw_params_set_periods_near(phandle, setup, &ai->periods, 0);
+				"set_read_alsa: %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+	}
+
+	err = snd_pcm_hw_params_set_periods_near(phandle, setup, &ai->periods, 0);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-	err = psnd_pcm_hw_params_set_buffer_size_near(phandle, setup, &ai->bufframesize);
+				"set_read_alsa: %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+
+	err = snd_pcm_hw_params_set_buffer_size_near(phandle, setup, &ai->bufframesize);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 				"set_read_alsa: %s, size: %lu, speed: %d",
-				psnd_strerror(err), ai->bufframesize, ai->speed);
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-#if (SND_LIB_MAJOR == 0)
-	buffer_size = psnd_pcm_hw_params_get_buffer_size(setup);
-	period_size = psnd_pcm_hw_params_get_period_size(setup, &dir);
-#else
-	psnd_pcm_hw_params_get_buffer_size(setup, &buffer_size);
-	psnd_pcm_hw_params_get_period_size(setup, &period_size, &dir);
-#endif
+				snd_strerror(err), ai->bufframesize, ai->speed);
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+
+	snd_pcm_hw_params_get_buffer_size(setup, &buffer_size);
+	snd_pcm_hw_params_get_period_size(setup, &period_size, &dir);
 
 	_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 			"set_read_alsa (info): Buffersize = %lu (%u)",buffer_size, *bufsiz);
@@ -473,21 +349,21 @@ static ALboolean set_read_alsa( void *ha
 			"set_read_alsa (info): Periodsize = %lu", period_size);
 	*bufsiz = buffer_size * ai->framesize;
 
-	err = psnd_pcm_hw_params(phandle, setup);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_read_alsa: %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-	err = psnd_pcm_prepare(phandle);
+	err = snd_pcm_hw_params(phandle, setup);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_read_alsa: %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+
+	err = snd_pcm_prepare(phandle);
 	if(err < 0)
 	{
 		_alDebug(ALD_MAXIMUS,  __FILE__, __LINE__,
-				"set_read_alsa %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
+				"set_read_alsa %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
@@ -495,7 +371,7 @@ static ALboolean set_read_alsa( void *ha
 		 "set_read_alsa: handle: %p, phandle: %p", handle, (void*)phandle);
 	ai->setup_read = 1;
 
-	psnd_pcm_hw_params_free(setup);
+	snd_pcm_hw_params_free(setup);
 	return AL_TRUE;
 }
 
@@ -508,7 +384,7 @@ static ALboolean set_write_alsa(void *ha
 	snd_pcm_hw_params_t *setup;
 	snd_pcm_uframes_t buffer_size, period_size;
 	snd_pcm_t *phandle = 0;
-	int err, dir;
+	int err, dir = 0;
 
 	if( (ai == NULL) || (ai->handle == NULL) )
 		return AL_FALSE;
@@ -517,7 +393,7 @@ static ALboolean set_write_alsa(void *ha
 	ai->format      = (unsigned int) AL2ALSAFMT(*fmt);
 	ai->speed       = (unsigned int) *speed;
 	ai->framesize   = (unsigned int) FRAMESIZE(ai->format, ai->channels);
-	ai->bufframesize= (snd_pcm_uframes_t) *bufsiz / ai->framesize * 4;
+	ai->bufframesize= *bufsiz / ai->framesize;
 	ai->periods     = 2;
 
 	_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
@@ -526,67 +402,63 @@ static ALboolean set_write_alsa(void *ha
 
 	phandle = ai->handle;
 
-	psnd_pcm_hw_params_malloc(&setup);
-	err = psnd_pcm_hw_params_any(phandle, setup);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_write_alsa: Could not query parameters: %s",psnd_strerror(err));
-
-		psnd_pcm_hw_params_free(setup);
+	snd_pcm_hw_params_malloc(&setup);
+	err = snd_pcm_hw_params_any(phandle, setup);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_write_alsa: Could not query parameters: %s",snd_strerror(err));
+
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 	/* set the interleaved write format */
-	err = psnd_pcm_hw_params_set_access(phandle, setup, SND_PCM_ACCESS_RW_INTERLEAVED);
+	err = snd_pcm_hw_params_set_access(phandle, setup, SND_PCM_ACCESS_RW_INTERLEAVED);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_write_alsa: Could not set access type: %s",psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
+				"set_write_alsa: Could not set access type: %s",snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 	/* set format */
-	err = psnd_pcm_hw_params_set_format(phandle, setup, ai->format);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_write_alsa: could not set format: %s",psnd_strerror(err));
-
-		psnd_pcm_hw_params_free(setup);
+	err = snd_pcm_hw_params_set_format(phandle, setup, ai->format);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_write_alsa: could not set format: %s",snd_strerror(err));
+
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
 
 	/* channels */
-	err = psnd_pcm_hw_params_set_channels(phandle, setup, ai->channels);
+	err = snd_pcm_hw_params_set_channels(phandle, setup, ai->channels);
 	if(err < 0)
 	{
 		unsigned int ch;
-#if (SND_LIB_MAJOR == 0)
-		ch = err = psnd_pcm_hw_params_get_channels(setup);
-#else
-		err = psnd_pcm_hw_params_get_channels(setup, &ch);
-#endif
+		err = snd_pcm_hw_params_get_channels(setup, &ch);
 
 		if (ch != ai->channels) {
 			_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-					"set_write_alsa: could not set channels: %s",psnd_strerror(err));
-
-			psnd_pcm_hw_params_free(setup);
+					"set_write_alsa: could not set channels: %s",snd_strerror(err));
+
+			snd_pcm_hw_params_free(setup);
 			return AL_FALSE;
 		}
 	}
 
 
 	/* sampling rate */
-	err = psnd_pcm_hw_params_set_rate_near(phandle, setup, &ai->speed,
+	err = snd_pcm_hw_params_set_rate_near(phandle, setup, &ai->speed,
                                                NULL);
 	if(err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
                          "set_write_alsa: could not set speed: %s",
-                         psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
+                         snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	} else if (err > 0) {
                 /* sampling rate is in 'err' */
@@ -602,58 +474,70 @@ static ALboolean set_write_alsa(void *ha
                            updating. */
                         _alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
                                  "set_write_alsa: hw speed %u not sane.  failing.", ai->speed);
-                        psnd_pcm_hw_params_free(setup);
+                        snd_pcm_hw_params_free(setup);
                         return AL_FALSE; 
                 }
         }
 
+	err = snd_pcm_hw_params_set_period_size_near(phandle, setup, &ai->bufframesize, NULL);
+	if (err < 0) {
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_write_alsa: %s, size: %lu, speed: %d",
+				snd_strerror(err), ai->bufframesize, ai->speed);
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
 
 	/* Set number of periods. Periods used to be called fragments. */
-	err = psnd_pcm_hw_params_set_periods_near(phandle, setup, &ai->periods, 0);
+	err = snd_pcm_hw_params_set_periods_near(phandle, setup, &ai->periods, 0);
 	if (err < 0) {
 		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_write_alsa: %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-	err = psnd_pcm_hw_params_set_buffer_size_near(phandle, setup, &ai->bufframesize);
-	if (err < 0) {
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_write_alsa: %s, size: %lu, speed: %d",
-				psnd_strerror(err), ai->bufframesize, ai->speed);
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-#if (SND_LIB_MAJOR == 0)
-	buffer_size = psnd_pcm_hw_params_get_buffer_size(setup);
-	period_size = psnd_pcm_hw_params_get_period_size(setup, &dir);
-#else
-	psnd_pcm_hw_params_get_buffer_size(setup, &buffer_size);
-	psnd_pcm_hw_params_get_period_size(setup, &period_size, &dir);
-#endif
+				"set_write_alsa: %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+
+	snd_pcm_hw_params_get_buffer_size(setup, &buffer_size);
+	snd_pcm_hw_params_get_period_size(setup, &period_size, &dir);
 
 	_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 			"set_write_alsa (info): Buffersize = %lu (%u)",buffer_size, *bufsiz);
 	_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
 			"set_write_alsa (info): Periodsize = %lu", period_size);
 
-	err = psnd_pcm_hw_params(phandle, setup);
-	if(err < 0)
-	{
-		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
-				"set_alsa: %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
-		return AL_FALSE;
-	}
-
-	err = psnd_pcm_prepare(phandle);
+	ai->bufframesize = buffer_size;
+
+	/* we put back the actual buffer size because the buffer isn't
+	 * always aligned to the power-of-two, for example, in the case
+	 * of 5.1 output
+	 */
+	*bufsiz = period_size * ai->framesize;
+
+	err = snd_pcm_hw_params(phandle, setup);
+	if(err < 0)
+	{
+		_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
+				"set_alsa: %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
+		return AL_FALSE;
+	}
+
+	{
+		snd_pcm_sw_params_t *sw;
+		snd_pcm_uframes_t val;
+		snd_pcm_sw_params_alloca(&sw);
+		snd_pcm_sw_params_current(phandle, sw);
+		snd_pcm_sw_params_set_start_threshold(phandle, sw, 1);
+		snd_pcm_sw_params(phandle, sw);
+	}
+
+
+	err = snd_pcm_prepare(phandle);
 	if(err < 0)
 	{
 		_alDebug(ALD_MAXIMUS,  __FILE__, __LINE__,
-				"set_alsa %s", psnd_strerror(err));
-		psnd_pcm_hw_params_free(setup);
+				"set_alsa %s", snd_strerror(err));
+		snd_pcm_hw_params_free(setup);
 		return AL_FALSE;
 	}
 
@@ -661,7 +545,7 @@ static ALboolean set_write_alsa(void *ha
 		 "set_write_alsa: handle: %p, phandle: %p", handle, (void*)phandle);
 	ai->setup_write = 1;
 
-	psnd_pcm_hw_params_free(setup);
+	snd_pcm_hw_params_free(setup);
 	return AL_TRUE;
 }
 
@@ -692,9 +576,9 @@ void alsa_blitbuffer(void *handle, void 
 	channels= ai->channels;
 	frames  = (snd_pcm_uframes_t) bytes / ai->framesize;
 
-	while(data_len > 0)
-	{
-		err = psnd_pcm_writei(phandle, pdata, frames);
+	while(frames > 0)
+	{
+		err = snd_pcm_writei(phandle, pdata, frames);
 		switch(err)
 		{
 			case -EAGAIN:
@@ -703,7 +587,7 @@ void alsa_blitbuffer(void *handle, void 
 			case -ESTRPIPE:
 				do
 				{
-					err = psnd_pcm_resume(phandle);
+					err = snd_pcm_resume(phandle);
 				} while ( err == -EAGAIN );
 				break;
                         case -EPIPE:
@@ -711,7 +595,7 @@ void alsa_blitbuffer(void *handle, void 
 			default:
                                 if (err<0) {
                                         fprintf(stderr,"alsa_blitbuffer: Could not write audio data to sound device: %s\n",
-                                        	psnd_strerror(err));
+                                        	snd_strerror(err));
                                         break;
                                 }
                                 pdata += err * ai->framesize;
@@ -721,10 +605,10 @@ void alsa_blitbuffer(void *handle, void 
 		}
 		if(err < 0)
 		{
-                        err = psnd_pcm_prepare(phandle);
+                        err = snd_pcm_prepare(phandle);
 			if(err < 0)
 			{
-				const char *serr = psnd_strerror(err);
+				const char *serr = snd_strerror(err);
 
 				_alDebug(ALD_MAXIMUS, __FILE__, __LINE__,
                                  "alsa_blitbuffer: %s", serr);
@@ -755,13 +639,13 @@ ALsizei capture_alsa(void *handle,
 	frames = (snd_pcm_uframes_t) bufsize / ai->framesize;
 
 grab:
-	ret = psnd_pcm_readi (phandle, pdata, frames);
+	ret = snd_pcm_readi (phandle, pdata, frames);
 	if (ret < 0) {
 		if (ret == -EAGAIN)
 			return 0;
 		else if (ret == -EPIPE) {
 			fprintf(stderr, "Error, overrun occurred, trying to recover.\n");
-			ret = psnd_pcm_prepare(phandle);
+			ret = snd_pcm_prepare(phandle);
 			if (ret < 0)
 				fprintf(stderr, "Unable to recover: %d\n", ret);
 			else
openSUSE Build Service is sponsored by