Dynamic AudioMixer Pipelines
wunwunforever
michael at spalk.co
Thu Mar 5 03:15:07 UTC 2020
Hi All,
I'm writing an application which dynamically adds and removes app_sources
from an audiomixer element.
I'm currently stuck on:
audioaggregator
gstaudioaggregator.c:1188:gst_audio_aggregator_sink_event:<mix> Segment of
type bytes are not supported, only TIME segments are supported
Followed by repeating lines of:
** (<unknown>:49832): CRITICAL **: 15:56:06.488: gst_audio_buffer_clip:
assertion 'segment->format == GST_FORMAT_TIME || segment->format ==
GST_FORMAT_DEFAULT' failed
(<unknown>:49832): GStreamer-CRITICAL **: 15:56:06.488:
gst_segment_to_running_time: assertion 'segment->format == format' failed
(<unknown>:49832): GStreamer-CRITICAL **: 15:56:06.488:
gst_segment_to_running_time: assertion 'segment->format == format' failed
The function that adds the elements is:
GstElement *
gst_custom_add_audio_appsrc (GstElement * pipe)
{
GstPad *sinkpad, *convpad;
GstElement *src, *conv, *sink;
GstPadLinkReturn ret;
src = gst_element_factory_make ("appsrc", "audio_src");
g_object_set(src, "is-live", TRUE, "do-timestamp",TRUE, NULL);
conv = gst_element_factory_make ("audiorate", NULL);
sink = gst_bin_get_by_name (GST_BIN(pipe), "mix");
gst_bin_add_many (GST_BIN (pipe), src, conv, NULL);
gboolean r;
r = gst_element_sync_state_with_parent (src);
if (!r) {
g_print("Couldn't sync src, with parent\n");
}
r = gst_element_sync_state_with_parent (conv);
if (!r) {
g_print("Couldn't sync conv, with parent\n");
}
r = gst_element_link_many (src, conv, NULL);
if (!r) {
g_print("Couldn't link many\n");
}
convpad = gst_element_get_static_pad(conv, "src");
sinkpad = gst_element_get_request_pad (sink, "sink_%u");
if (gst_pad_link (convpad, sinkpad) != GST_PAD_LINK_OK) {
g_printerr ("mixer could not be linked.\n");
return NULL;
}
gst_object_unref (convpad);
return src;
}
This is called after the pipeline is already playing.
>From reading the documentation, it looks like the elements that are added,
have not received a SEGMENT Event, so are unaware of the current segment, so
fail to assign the current segment to the new buffers.
How should I go about resolving this? Do I need to trigger a new Segment
event, to propagate the current value to the new elements? If so, how do I
best generate one to not interrupt playback of the pipeline?
Thanks in advance,
--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
More information about the gstreamer-devel
mailing list