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 !
application/x-rtp,media=audio,encoding-name=OPUS,payload=111,clock-rate=48000
! 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);
g_assert(bin);
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);
g_assert(convert);
resample = gst_element_factory_make("audioresample", NULL);
g_assert(resample);
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));
gst_object_unref(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);
gst_object_unref(binSrc);
gst_object_unref(mixerSink);
gst_object_unref(mixer);
}
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