From f008cb00f73ebca04c531b2dc2607b9f601ec885 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Thu, 27 May 2021 16:20:09 +0900 Subject: audiobasesrc: Fix divide by zero assertion GstAudioRingBufferSpec can be cleared from other thread, then rate value will be zero Part-of: --- gst-libs/gst/audio/gstaudiobasesrc.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/gst-libs/gst/audio/gstaudiobasesrc.c b/gst-libs/gst/audio/gstaudiobasesrc.c index 9bfee07df..3480ee7b8 100644 --- a/gst-libs/gst/audio/gstaudiobasesrc.c +++ b/gst-libs/gst/audio/gstaudiobasesrc.c @@ -305,21 +305,26 @@ gst_audio_base_src_get_time (GstClock * clock, GstAudioBaseSrc * src) guint64 raw, samples; guint delay; GstClockTime result; + GstAudioRingBuffer *ringbuffer; + gint rate; + + ringbuffer = src->ringbuffer; + if (!ringbuffer) + return GST_CLOCK_TIME_NONE; - if (G_UNLIKELY (src->ringbuffer == NULL - || src->ringbuffer->spec.info.rate == 0)) + rate = ringbuffer->spec.info.rate; + if (rate == 0) return GST_CLOCK_TIME_NONE; - raw = samples = gst_audio_ring_buffer_samples_done (src->ringbuffer); + raw = samples = gst_audio_ring_buffer_samples_done (ringbuffer); /* the number of samples not yet processed, this is still queued in the * device (not yet read for capture). */ - delay = gst_audio_ring_buffer_delay (src->ringbuffer); + delay = gst_audio_ring_buffer_delay (ringbuffer); samples += delay; - result = gst_util_uint64_scale_int (samples, GST_SECOND, - src->ringbuffer->spec.info.rate); + result = gst_util_uint64_scale_int (samples, GST_SECOND, rate); GST_DEBUG_OBJECT (src, "processed samples: raw %" G_GUINT64_FORMAT ", delay %u, real %" -- cgit v1.2.1