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 <lucio.a.hernandez@gmail.com> for reporting.
This commit is contained in:
parent
b60ab758e4
commit
4fe12c1b09
@ -1020,16 +1020,17 @@ gst_alsasink_write (GstAudioSink * asink, gpointer data, guint length)
|
|||||||
GstAlsaSink *alsa;
|
GstAlsaSink *alsa;
|
||||||
gint err;
|
gint err;
|
||||||
gint cptr;
|
gint cptr;
|
||||||
gint16 *ptr = data;
|
guint8 *ptr = data;
|
||||||
|
|
||||||
alsa = GST_ALSA_SINK (asink);
|
alsa = GST_ALSA_SINK (asink);
|
||||||
|
|
||||||
if (alsa->iec958 && alsa->need_swap) {
|
if (alsa->iec958 && alsa->need_swap) {
|
||||||
guint i;
|
guint i;
|
||||||
|
guint16 *ptr_tmp = (guint16 *) ptr;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (asink, "swapping bytes");
|
GST_DEBUG_OBJECT (asink, "swapping bytes");
|
||||||
for (i = 0; i < length / 2; i++) {
|
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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -954,12 +954,11 @@ gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length,
|
|||||||
GstAlsaSrc *alsa;
|
GstAlsaSrc *alsa;
|
||||||
gint err;
|
gint err;
|
||||||
gint cptr;
|
gint cptr;
|
||||||
gint16 *ptr;
|
guint8 *ptr = data;
|
||||||
|
|
||||||
alsa = GST_ALSA_SRC (asrc);
|
alsa = GST_ALSA_SRC (asrc);
|
||||||
|
|
||||||
cptr = length / alsa->bpf;
|
cptr = length / alsa->bpf;
|
||||||
ptr = data;
|
|
||||||
|
|
||||||
GST_ALSA_SRC_LOCK (asrc);
|
GST_ALSA_SRC_LOCK (asrc);
|
||||||
while (cptr > 0) {
|
while (cptr > 0) {
|
||||||
@ -975,7 +974,7 @@ gst_alsasrc_read (GstAudioSrc * asrc, gpointer data, guint length,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr += err * alsa->channels;
|
ptr += snd_pcm_frames_to_bytes (alsa->handle, err);
|
||||||
cptr -= err;
|
cptr -= err;
|
||||||
}
|
}
|
||||||
GST_ALSA_SRC_UNLOCK (asrc);
|
GST_ALSA_SRC_UNLOCK (asrc);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user