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