From: Martin Ling Date: Sun, 30 Dec 2018 00:17:36 +0000 (+0100) Subject: Revised implementation without using constructor. X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=64b0db030beb584b6c8391f590981c810aaf8147;p=libsigrokflow.git Revised implementation without using constructor. --- diff --git a/include/libsigrokflow/libsigrokflow.hpp b/include/libsigrokflow/libsigrokflow.hpp index e800be0..4f0fcdb 100644 --- a/include/libsigrokflow/libsigrokflow.hpp +++ b/include/libsigrokflow/libsigrokflow.hpp @@ -51,16 +51,15 @@ class CaptureDevice : public Device { /* Operations specific to capture (source) devices go here */ -protected : - CaptureDevice(); }; class LegacyCaptureDevice : public CaptureDevice { public: - /* Construct from libsigrok device object */ - LegacyCaptureDevice(shared_ptr); + /* Create from libsigrok device object */ + static Glib::RefPtr create( + shared_ptr libsigrok_device); /* Retrieve libsigrok device object */ shared_ptr libsigrok_device(); @@ -68,7 +67,7 @@ public: /* Override state change */ Gst::StateChangeReturn change_state_vfunc(Gst::StateChange transition); private: - shared_ptr _device; + shared_ptr _libsigrok_device; Glib::RefPtr _src_pad; Glib::Threads::RecMutex _mutex; Glib::RefPtr _task; diff --git a/src/main.cpp b/src/main.cpp index d6bfe50..19d1f35 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,20 +32,25 @@ void init() { } -auto src_template = Gst::PadTemplate::create("src", - Gst::PAD_SRC, - Gst::PAD_ALWAYS, - Gst::Caps::create_any()); - -LegacyCaptureDevice::LegacyCaptureDevice(shared_ptr device) : - _device(device), _src_pad(Gst::Pad::create(src_template)) +Glib::RefPtrLegacyCaptureDevice::create( + shared_ptr libsigrok_device) { - add_pad(_src_pad); + auto element = Gst::ElementFactory::create_element("sigrok_legacy_capture_device"); + auto device = Glib::RefPtr::cast_static(element); + + auto src_template = Gst::PadTemplate::create("src", + Gst::PAD_SRC, + Gst::PAD_ALWAYS, + Gst::Caps::create_any()); + device->_src_pad = Gst::Pad::create(src_template); + device->add_pad(device->_src_pad); + device->_libsigrok_device = libsigrok_device; + return device; } shared_ptr LegacyCaptureDevice::libsigrok_device() { - return _device; + return _libsigrok_device; } Gst::StateChangeReturn LegacyCaptureDevice::change_state_vfunc(Gst::StateChange transition) @@ -55,8 +60,8 @@ Gst::StateChangeReturn LegacyCaptureDevice::change_state_vfunc(Gst::StateChange case Gst::STATE_CHANGE_READY_TO_PAUSED: return Gst::StateChangeReturn::STATE_CHANGE_NO_PREROLL; case Gst::STATE_CHANGE_PAUSED_TO_PLAYING: - _device->open(); - _device->config_set(sigrok::ConfigKey::LIMIT_SAMPLES, + _libsigrok_device->open(); + _libsigrok_device->config_set(sigrok::ConfigKey::LIMIT_SAMPLES, Glib::Variant::create(10)); _task = Gst::Task::create(std::bind(&LegacyCaptureDevice::_run, this)); _task->set_lock(_mutex); @@ -99,8 +104,8 @@ void LegacyCaptureDevice::_datafeed_callback( void LegacyCaptureDevice::_run() { - _session = _device->driver()->parent()->create_session(); - _session->add_device(_device); + _session = _libsigrok_device->driver()->parent()->create_session(); + _session->add_device(_libsigrok_device); _session->add_datafeed_callback(bind(&LegacyCaptureDevice::_datafeed_callback, this, _1, _2)); _session->start(); _session->run();