diff src/alsa/audio.c @ 2398:684a26ccca54

check input fmt thoughtfully
author Eugene Zagidullin <e.asphyx@gmail.com>
date Sat, 16 Feb 2008 01:36:41 +0300
parents 74ab1fa87598
children ccfc52a92504
line wrap: on
line diff
--- a/src/alsa/audio.c	Fri Feb 15 21:52:09 2008 +0900
+++ b/src/alsa/audio.c	Sat Feb 16 01:36:41 2008 +0300
@@ -80,7 +80,6 @@
 };
 
 static struct snd_format *inputf = NULL;
-static struct snd_format *effectf = NULL;
 static struct snd_format *outputf = NULL;
 
 static int alsa_setup(struct snd_format *f);
@@ -287,8 +286,6 @@
 
 	g_free(inputf);
 	inputf = NULL;
-	g_free(effectf);
-	effectf = NULL;
 	g_free(outputf);
 	outputf = NULL;
 
@@ -730,8 +727,7 @@
 int alsa_open(AFormat fmt, int rate, int nch)
 {
 	debug("Opening device");
-	inputf = snd_format_from_xmms(fmt, rate, nch);
-	effectf = snd_format_from_xmms(fmt, rate, nch);
+	if((inputf = snd_format_from_xmms(fmt, rate, nch)) == NULL) return 0;
 
 	if (alsa_cfg.debug)
 		snd_output_stdio_attach(&logs, stdout, 0);
@@ -779,6 +775,7 @@
 {
 	struct snd_format *f = g_malloc(sizeof(struct snd_format));
 	size_t i;
+        int found = 0;
 
 	f->xmms_format = fmt;
 	f->format = SND_PCM_FORMAT_UNKNOWN;
@@ -788,9 +785,15 @@
 		{
 			printf("match!\n");
 			f->format = format_table[i].alsa;
+                        found = 1;
 			break;
 		}
 
+        if(!found) {
+            g_free(f);
+            return NULL;
+        }
+
 	/* Get rid of _NE */
 	for (i = 0; i < sizeof(format_table) / sizeof(format_table[0]); i++)
 		if (format_table[i].alsa == f->format)
@@ -820,6 +823,7 @@
 
 	g_free(outputf);
 	outputf = snd_format_from_xmms(f->xmms_format, f->rate, f->channels);
+        if(outputf == NULL) return -1;
 
 	debug("Opening device: %s", alsa_cfg.pcm_device);
 	/* FIXME: Can snd_pcm_open() return EAGAIN? */