]> git.sesse.net Git - vlc/commitdiff
access/alsa.c: simplify error recovery when capturing
authorJean-Paul Saman <jean-paul.saman@m2x.nl>
Fri, 2 Sep 2011 14:43:34 +0000 (16:43 +0200)
committerJean-Paul Saman <jean-paul.saman@m2x.nl>
Sat, 3 Sep 2011 08:18:03 +0000 (10:18 +0200)
Use highlevel function snd_pcm_recover() the recover from error states.

modules/access/alsa.c

index 19dbd0120b29514394a98f6e233cded12236bfee..44777da4280894a5b2d608fd09ba518b7f879799 100644 (file)
@@ -377,33 +377,26 @@ static block_t* GrabAudio( demux_t *p_demux )
         return NULL;
     }
 
+    if( i_read < 0 )
+        i_read = snd_pcm_recover( p_sys->p_alsa_pcm, i_read, 0 );
+
     if( i_read <= 0 )
     {
         switch( i_read )
         {
-            case -EPIPE:
-                /* xrun */
-                snd_pcm_prepare( p_sys->p_alsa_pcm );
-                break;
-            case -ESTRPIPE:
-            {
-                /* suspend */
-                int i_resume = snd_pcm_resume( p_sys->p_alsa_pcm );
-                if( i_resume < 0 && i_resume != -EAGAIN ) snd_pcm_prepare( p_sys->p_alsa_pcm );
-                break;
-            }
+            case 0: /* state recovered or no data */
+                return NULL;
+            case -EAGAIN:
+                snd_pcm_wait( p_sys->p_alsa_pcm, 10 ); /* See poll() comment in oss.c */
+                return NULL;
             default:
                 msg_Err( p_demux, "Failed to read alsa frame (%s)", snd_strerror( i_read ) );
                 return 0;
         }
     }
-    else
-    {
-        /* convert from frames to bytes */
-        i_read *= p_sys->i_alsa_frame_size;
-    }
 
-    if( i_read <= 0 ) return 0;
+    /* convert from frames to bytes */
+    i_read *= p_sys->i_alsa_frame_size;
 
     p_block->i_buffer = i_read;
     p_sys->p_block = 0;