static gboolean gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps) { GstBaseAudioSrc *src = GST_BASE_AUDIO_SRC (bsrc); GstRingBufferSpec *spec; spec = &src->ringbuffer->spec; spec->buffer_time = src->buffer_time; spec->latency_time = src->latency_time; if (!gst_ring_buffer_parse_caps (spec, caps)) goto parse_error; /* calculate suggested segsize and segtotal */ spec->segsize = spec->rate * spec->bytes_per_sample * spec->latency_time / GST_MSECOND; spec->segtotal = spec->buffer_time / spec->latency_time; GST_DEBUG ("release old ringbuffer"); gst_ring_buffer_release (src->ringbuffer); gst_ring_buffer_debug_spec_buff (spec); GST_DEBUG ("acquire new ringbuffer"); if (!gst_ring_buffer_acquire (src->ringbuffer, spec)) goto acquire_error; /* calculate actual latency and buffer times */ spec->latency_time = spec->segsize * GST_MSECOND / (spec->rate * spec->bytes_per_sample); spec->buffer_time = spec->segtotal * spec->segsize * GST_MSECOND / (spec->rate * spec->bytes_per_sample); gst_ring_buffer_debug_spec_buff (spec); g_object_notify (G_OBJECT (src), "actual-buffer-time"); g_object_notify (G_OBJECT (src), "actual-latency-time"); return TRUE; /* ERRORS */ parse_error: { GST_DEBUG ("could not parse caps"); return FALSE; } acquire_error: { GST_DEBUG ("could not acquire ringbuffer"); return FALSE; } }
static gboolean gst_audio_ringbuffer_setcaps (GstPad * pad, GstCaps * caps) { GstAudioRingbuffer *ringbuffer; GstRingBufferSpec *spec; ringbuffer = GST_AUDIO_RINGBUFFER (GST_PAD_PARENT (pad)); if (!ringbuffer->buffer) return FALSE; spec = &ringbuffer->buffer->spec; GST_DEBUG_OBJECT (ringbuffer, "release old ringbuffer"); /* release old ringbuffer */ gst_ring_buffer_activate (ringbuffer->buffer, FALSE); gst_ring_buffer_release (ringbuffer->buffer); GST_DEBUG_OBJECT (ringbuffer, "parse caps"); spec->buffer_time = ringbuffer->buffer_time; spec->latency_time = ringbuffer->segment_time; /* parse new caps */ if (!gst_ring_buffer_parse_caps (spec, caps)) goto parse_error; gst_ring_buffer_debug_spec_buff (spec); GST_DEBUG_OBJECT (ringbuffer, "acquire ringbuffer"); if (!gst_ring_buffer_acquire (ringbuffer->buffer, spec)) goto acquire_error; GST_DEBUG_OBJECT (ringbuffer, "activate ringbuffer"); gst_ring_buffer_activate (ringbuffer->buffer, TRUE); /* calculate actual latency and buffer times. * FIXME: In 0.11, store the latency_time internally in ns */ spec->latency_time = gst_util_uint64_scale (spec->segsize, (GST_SECOND / GST_USECOND), spec->rate * spec->bytes_per_sample); spec->buffer_time = spec->segtotal * spec->latency_time; gst_ring_buffer_debug_spec_buff (spec); return TRUE; /* ERRORS */ parse_error: { GST_DEBUG_OBJECT (ringbuffer, "could not parse caps"); GST_ELEMENT_ERROR (ringbuffer, STREAM, FORMAT, (NULL), ("cannot parse audio format.")); return FALSE; } acquire_error: { GST_DEBUG_OBJECT (ringbuffer, "could not acquire ringbuffer"); return FALSE; } }