Hi Bruce,
Sorry for late response. I've looked at your example, and turns out that it
was a bug in gstreamermm. I've fixed it, and the latest master branch
should be ok:
https://git.gnome.org/browse/gstreamermm/commit/?id=20090e4db48fa30e193be2637e881add4cb6d3d4

2018-04-30 11:36 GMT+01:00 Adams, Bruce (KMLWG) <[email protected]
>:

> Hi,
>
>       The attached is a minimal project that reproduces the issue.
>
> It just adds a main and a CMakeLists.txt the sample code I sent earlier.
>
>
>
> One other thing that seems dubious to me is that:
>
>
>
> #include <gstreamermm/private/audiosink_p.h>
>
>
>
> Is required in order for the register_element() function to compile.
>
>
>
> Regards,
>
>
>
> Bruce.
>
>
>
>
>
> *From:* Marcin Kolny [mailto:[email protected]]
> *Sent:* 29 April 2018 16:49
> *To:* Adams, Bruce (KMLWG)
> *Cc:* [email protected]
> *Subject:* Re: gstreamermm, Gst::AudioSink and virtual functions
>
>
>
> Hi Bruce,
>
> Could you post a whole project? It'd help me a lot with investigations.
>
>
>
> 2018-04-25 13:10 GMT+01:00 Adams, Bruce (KMLWG) <
> [email protected]>:
>
> Hi,
>
>       Thanks for your help so far. I’ve made some progress but I’m still
> stuck.
>
> I am still trying to create a ‘do nothing’ audiosink upon which I can
> build.
>
> Is there a clear statement somewhere of what an C++ audiosink class must
> provide?
>
> I was able to create a a ‘do nothing’ sink using “gst-element-maker
> mydemosink audiosink”
>
> which seems to work but there is nothing obvious to translate from that
> code into the C++ version.
>
>
>
> The latest output is:
>
>
>
> (gst-launch-1.0:16830): GStreamer-CRITICAL **: gst_object_set_parent:
> assertion 'GST_IS_OBJECT (object)' failed
>
>
>
> ** (gst-launch-1.0:16830): CRITICAL **: gst_audio_ring_buffer_open_device:
> assertion 'GST_IS_AUDIO_RING_BUFFER (buf)' failed
>
>
>
> (gst-launch-1.0:16830): GStreamer-CRITICAL **: gst_object_unparent:
> assertion 'GST_IS_OBJECT (object)' failed
>
> ERROR: Pipeline doesn't want to pause.
>
>
>
> I thought the ring buffer was provided by the parent class AudioBaseSink
> but it seems not.
>
>
>
> Note for testing this I’m using:
>
>
>
>    gst-launch-1.0 -v audiotestsrc blocksize=8000 num-buffers=10 !
> audio/x-raw,rate=8000,channels=1 ! myaudiosink
>
>
>
> The simplest MyAudioSink.hpp to reproduce this:
>
>
>
> #include <gstreamermm.h>
>
> #include <gstreamermm/audiosink.h>
>
>
>
> class MyAudioSink: public Gst::AudioSink
>
> {
>
> public:
>
>    explicit MyAudioSink(Gst::AudioSink::BaseObjectType* gobj):
>
>       Glib::ObjectBase(typeid (MyAudioSink)), // type must be registered
> before use
>
>       Gst::AudioSink(gobj)
>
>    {
>
>    }
>
>
>
>    virtual ~MyAudioSink()
>
>    {
>
>    }
>
>
>
>    static void class_init(Gst::ElementClass<MyAudioSink> *klass)
>
>    {
>
>       klass->set_metadata("MyAudioSink",
>
>                           "Sink/Audio", "A test audio sink", "author");
>
>       klass->add_pad_template(Gst::PadTemplate::create("sink",
> Gst::PAD_SINK, Gst::PAD_ALWAYS,
>
>
> Gst::Caps::create_from_string("audio/x-raw,format=S16LE,
> rate=8000,channels=1")));
>
>    }
>
> };
>
>
>
>
>
> A C++ myaudiofilter derived from AudioFilter on the other hand seems to
> just work:
>
>
>
> gst-launch-1.0 audiotestsrc blocksize=8000 num-buffers=10 !
> audio/x-raw,rate=8000,channels=1 ! myaudiofilter ! fakesink
>
>
>
> Calling create_ring_buffer() in the constructor MyAudioSink causes a seg
> fault:
>
>
>
> (gst-inspect-1.0:23564): GStreamer-CRITICAL **: gst_object_set_parent:
> assertion 'GST_IS_OBJECT (object)' failed
>
>
>
> (gst-inspect-1.0:23564): GLib-GObject-CRITICAL **: g_object_get_qdata:
> assertion 'G_IS_OBJECT (object)' failed
>
>
>
> (gst-inspect-1.0:23564): GLib-GObject-CRITICAL **: g_object_get_qdata:
> assertion 'G_IS_OBJECT (object)' failed
>
> Segmentation fault (core dumped)
>
>
>
> #3  fault_handler_sighandler (signum=11) at gst-launch.c:94
>
> #4  <signal handler called>
>
> #5  0x00007eff8272b898 in Glib::wrap_auto(_GObject*, bool) () from
> /usr/lib/x86_64-linux-gnu/libglibmm-2.4.so.1
>
> #6  0x00007eff82df5bcf in Glib::wrap(_GstAudioRingBuffer*, bool) () from
> /usr/lib/x86_64-linux-gnu/libgstreamermm-1.0.so.1
>
> #7  0x00007eff82df16c6 in Gst::AudioBaseSink::create_ring_buffer() ()
> from /usr/lib/x86_64-linux-gnu/libgstreamermm-1.0.so.1
>
> #8  0x00007eff830f5eb4 in MyAudioSink::MyAudioSink
>
>
>
> I tried putting it in some of the vfunc’s like open, reset , write and
> start instead but none of them are invoked before it starts asserting.
>
>
>
> Its not immediately obvious where to set a breakpoint to try and track
> this down
>
> I’m wading through glib and gstreamer source trying to find out without
> much success so far.
>
> Any tips would be appreciated.
>
>
>
> Regards,
>
>
>
> Bruce.
>
>
>
>
> --
>
> Pozdrawiam
> Marcin Kolny
>



-- 
Pozdrawiam
Marcin Kolny
_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to