[MPlayer-cvslog] CVS: main/libao2 ao_alsa.c,1.35,1.36

Clemens Ladisch CVS syncmail at mplayerhq.hu
Mon Feb 13 12:48:31 CET 2006


CVS change done by Clemens Ladisch CVS

Update of /cvsroot/mplayer/main/libao2
In directory mail:/var2/tmp/cvs-serv6518/libao2

Modified Files:
	ao_alsa.c 
Log Message:
Fix the error handling in the play() function: add a handler for EINTR,
improve the reporting of other errors, and don't try to call
snd_pcm_writei() repeatedly when it aborts after a partial write due to
an error.

Index: ao_alsa.c
===================================================================
RCS file: /cvsroot/mplayer/main/libao2/ao_alsa.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -r1.35 -r1.36
--- ao_alsa.c	13 Feb 2006 11:43:25 -0000	1.35
+++ ao_alsa.c	13 Feb 2006 11:48:29 -0000	1.36
@@ -739,10 +739,7 @@
 
 static int play(void* data, int len, int flags)
 {
-
-  //bytes_per_sample is always 4 for 2 chn S16_LE
   int num_frames = len / bytes_per_sample;
-  char *output_samples = (char *)data;
   snd_pcm_sframes_t res = 0;
 
   //mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: frames=%i, len=%i\n",num_frames,len);
@@ -752,39 +749,33 @@
     return 0;
   }
 
-  while (num_frames > 0) {
+  if (num_frames == 0)
+    return 0;
 
-    res = snd_pcm_writei(alsa_handler, (void *)output_samples, num_frames);
+  do {
+    res = snd_pcm_writei(alsa_handler, data, num_frames);
 
-      if (res == -ESTRPIPE) {	/* suspend */
+      if (res == -EINTR) {
+	/* nothing to do */
+	res = 0;
+      }
+      else if (res == -ESTRPIPE) {	/* suspend */
 	mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: pcm in suspend mode. trying to resume\n");
 	while ((res = snd_pcm_resume(alsa_handler)) == -EAGAIN)
 	  sleep(1);
       }
-      else if (res < 0) {
-	mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: unknown status, trying to reset soundcard\n");
+      if (res < 0) {
+	mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: write error: %s\n", snd_strerror(res));
+	mp_msg(MSGT_AO,MSGL_INFO,"alsa-play: trying to reset soundcard\n");
 	if ((res = snd_pcm_prepare(alsa_handler)) < 0) {
-	   mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: snd prepare error");
+	  mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: pcm prepare error: %s\n", snd_strerror(res));
 	  return(0);
 	  break;
 	}
       }
+  } while (res == 0);
 
-      if (res > 0) {
-
-	/* output_samples += ao_data.channels * res; */
-	output_samples += res * bytes_per_sample;
-
-	num_frames -= res;
-      }
-
-  } //end while
-
-  if (res < 0) {
-    mp_msg(MSGT_AO,MSGL_ERR,"alsa-play: write error %s", snd_strerror(res));
-    return 0;
-  }
-  return len - len % bytes_per_sample;
+  return res < 0 ? res : res * bytes_per_sample;
 }
 
 /* how many byes are free in the buffer */




More information about the MPlayer-cvslog mailing list