alsa: Use 8 bit pointer type for byte-based pointer arithmetic
authorSebastian Dröge <sebastian@centricular.com>
Tue, 13 Oct 2015 21:32:11 +0000 (00:32 +0300)
committerSebastian Dröge <sebastian@centricular.com>
Sat, 17 Oct 2015 08:02:44 +0000 (11:02 +0300)
Usually these loops only run once, so there's no problem here. But sometimes
they run twice, and by adding the number of bytes to a 16 bit pointer type we
would advance twice as much as we should.

Also use snd_pcm_frames_to_bytes() in alsasrc to calculate
the number of bytes to skip, same as we do in alsasink.

Thanks to Lucio A. Hernandez <lucio.a.hernandez@gmail.com> for reporting.

ext/alsa/gstalsasink.c
ext/alsa/gstalsasrc.c

index cc72304..c8989ce 100644 (file)
@@ -1020,16 +1020,17 @@ gst_alsasink_write (GstAudioSink * asink, gpointer data, guint length)
   GstAlsaSink *alsa;
   gint err;
   gint cptr;
-  gint16 *ptr = data;
+  guint8 *ptr = data;
 
   alsa = GST_ALSA_SINK (asink);
 
   if (alsa->iec958 && alsa->need_swap) {
     guint i;
+    guint16 *ptr_tmp = (guint16 *) ptr;
 
     GST_DEBUG_OBJECT (asink, "swapping bytes");
     for (i = 0; i < length / 2; i++) {
-      ptr[i] = GUINT16_SWAP_LE_BE (ptr[i]);
+      ptr_tmp[i] = GUINT16_SWAP_LE_BE (ptr_tmp[i]);
     }
   }
 
index 0233748..a359cc3 100644 (file)
@@ -954,12 +954,11 @@ gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length,
   GstAlsaSrc *alsa;
   gint err;
   gint cptr;
-  gint16 *ptr;
+  guint8 *ptr = data;
 
   alsa = GST_ALSA_SRC (asrc);
 
   cptr = length / alsa->bpf;
-  ptr = data;
 
   GST_ALSA_SRC_LOCK (asrc);
   while (cptr > 0) {
@@ -975,7 +974,7 @@ gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length,
       continue;
     }
 
-    ptr += err * alsa->channels;
+    ptr += snd_pcm_frames_to_bytes (alsa->handle, err);
     cptr -= err;
   }
   GST_ALSA_SRC_UNLOCK (asrc);