Dynamically add filesrc to audiomixer: 'pad not activated yet'

Tom Gilbert twcgilbert at gmail.com
Mon Apr 19 09:24:51 UTC 2021

I have a send-only pipeline constructed as follows:
 "webrtcbin name=sendonly bundle-policy=max-bundle autoaudiosrc ! queue !
audioconvert ! audioresample ! audiomixer name=mix ! volume name=vol !
level message=TRUE ! queue ! opusenc inband-fec=TRUE ! rtpopuspay ! queue !
! sendonly.sink_0 "

 In response to UI interaction I'd like to play a short sample mixed in.
The following code *partially* works: playback starts up to a couple of
seconds after user interaction, but only for a long file (nothing if I try
sample files of order 2s or less). Log output shows:
 gst_base_src_start_complete:<filesrc0> pad not activated yet

To finish this up, I'd expect to add a probe to detect EOS & then remove
the bin. Is a probe and wait for something required as part of startup for
the bin?

GstElement *mixer = gst_bin_get_by_name(GST_BIN (pipeline), "mix");
    if (mixer) {
        GstPad *mixerSink, *binSrc, *resamplerSrc;
        GstElement *bin, *filesrc, *parse, *dec, *convert, *resample;
        GstPadLinkReturn ret;

        bin = gst_bin_new(NULL);
        filesrc = gst_element_factory_make("filesrc", NULL);
        g_assert (filesrc);
        parse = gst_element_factory_make("mpegaudioparse", NULL);
        g_assert (parse);
        dec = gst_element_factory_make("mpg123audiodec", NULL);
        g_assert (dec);
        convert = gst_element_factory_make("audioconvert", NULL);
        resample = gst_element_factory_make("audioresample", NULL);

        g_object_set(filesrc, "location", name, NULL);
        gst_bin_add_many(GST_BIN (bin), filesrc, parse, dec, convert,
resample, NULL);

        gboolean linkRet = gst_element_link_many(filesrc, parse, dec,
convert, resample, NULL);
        g_assert (linkRet == TRUE);

        // create a ghost pad on the bin
        resamplerSrc = gst_element_get_static_pad(resample, "src");
        gst_element_add_pad(bin, gst_ghost_pad_new("src", resamplerSrc));

        // now add the new bin to the pipeline
        gst_bin_add(GST_BIN(pipeline), bin);

        mixerSink = gst_element_get_request_pad(mixer, "sink_%u");
        binSrc = gst_element_get_static_pad(bin, "src");
        ret = gst_pad_link(binSrc, mixerSink);
        g_assert (ret == GST_PAD_LINK_OK);

        // OK, start it up...
        gst_element_set_state(bin, GST_STATE_READY);
        gst_element_set_state(bin, GST_STATE_PLAYING);


any insight greatly appreciated!
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20210419/81051f15/attachment.htm>

More information about the gstreamer-devel mailing list