From 4fe12c1b095298e02fe88ca583ff2588b99167f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 14 Oct 2015 00:32:11 +0300 Subject: [PATCH] alsa: Use 8 bit pointer type for byte-based pointer arithmetic 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 for reporting. --- ext/alsa/gstalsasink.c | 5 +++-- ext/alsa/gstalsasrc.c | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/alsa/gstalsasink.c b/ext/alsa/gstalsasink.c index cc7230475c..c8989ced10 100644 --- a/ext/alsa/gstalsasink.c +++ b/ext/alsa/gstalsasink.c @@ -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]); } } diff --git a/ext/alsa/gstalsasrc.c b/ext/alsa/gstalsasrc.c index 0233748b24..a359cc351a 100644 --- a/ext/alsa/gstalsasrc.c +++ b/ext/alsa/gstalsasrc.c @@ -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);