2 * This file is part of the libsigrokflow project.
4 * Copyright (C) 2018 Martin Ling <martin-sigrok@earth.li>
5 * Copyright (C) 2018 Uwe Hermann <uwe@hermann-uwe.de>
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #ifndef LIBSIGROKFLOW_LIBSIGROKFLOW_HPP
22 #define LIBSIGROKFLOW_LIBSIGROKFLOW_HPP
24 #include <gstreamermm.h>
25 #include <gstreamermm/private/element_p.h>
26 #include <gstreamermm/private/basesink_p.h>
27 #ifdef HAVE_LIBSIGROKCXX
28 #include <libsigrokcxx/libsigrokcxx.hpp>
30 #include <libsigrokdecode/libsigrokdecode.h>
41 /* Config API etc goes here */
48 explicit Sink(GstBaseSink *gobj);
54 /* Operations specific to hardware devices go here */
56 explicit Device(GstElement *gobj);
62 /* Operations specific to capture (source) devices go here */
64 explicit CaptureDevice(GstElement *gobj);
67 #ifdef HAVE_LIBSIGROKCXX
68 class LegacyCaptureDevice :
72 /* Create from libsigrok device object */
73 static Glib::RefPtr<LegacyCaptureDevice> create(
74 shared_ptr<sigrok::HardwareDevice> libsigrok_device);
76 /* Retrieve libsigrok device object */
77 shared_ptr<sigrok::HardwareDevice> libsigrok_device();
79 /* Override state change */
80 Gst::StateChangeReturn change_state_vfunc(Gst::StateChange transition);
83 static void class_init(Gst::ElementClass<LegacyCaptureDevice> *klass);
85 /* Register class with plugin */
86 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
88 /* Construcor used by element factory */
89 explicit LegacyCaptureDevice(GstElement *gobj);
91 shared_ptr<sigrok::HardwareDevice> _libsigrok_device;
92 Glib::RefPtr<Gst::Pad> _src_pad;
93 Glib::Threads::RecMutex _mutex;
94 Glib::RefPtr<Gst::Task> _task;
95 shared_ptr<sigrok::Session> _session;
97 void _datafeed_callback(shared_ptr<sigrok::Device> device,
98 shared_ptr<sigrok::Packet> packet);
106 /* Create from libsigrok input */
107 static Glib::RefPtr<LegacyInput> create(
108 shared_ptr<sigrok::InputFormat> format,
109 map<string, Glib::VariantBase> options = map<string, Glib::VariantBase>());
115 Gst::FlowReturn chain(const Glib::RefPtr<Gst::Pad> &pad,
116 const Glib::RefPtr<Gst::Buffer> &buf);
122 static void class_init(Gst::ElementClass<LegacyInput> *klass);
124 /* Register class with plugin */
125 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
127 /* Construcor used by element factory */
128 explicit LegacyInput(GstElement *gobj);
130 shared_ptr<sigrok::InputFormat> _libsigrok_input_format;
131 shared_ptr<sigrok::Input> _libsigrok_input;
132 shared_ptr<sigrok::Session> _session;
133 map<string, Glib::VariantBase> _options;
134 Glib::RefPtr<Gst::Pad> _sink_pad;
135 Glib::RefPtr<Gst::Pad> _src_pad;
137 void _datafeed_callback(shared_ptr<sigrok::Device> device,
138 shared_ptr<sigrok::Packet> packet);
145 /* Create from libsigrok output object */
146 static Glib::RefPtr<LegacyOutput> create(
147 shared_ptr<sigrok::OutputFormat> libsigrok_output_format,
148 shared_ptr<sigrok::Device> libsigrok_device,
149 map<string, Glib::VariantBase> options = map<string, Glib::VariantBase>());
154 /* Override render */
155 Gst::FlowReturn render_vfunc(const Glib::RefPtr<Gst::Buffer> &buffer);
161 static void class_init(Gst::ElementClass<LegacyOutput> *klass);
163 /* Register class with plugin */
164 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
166 /* Constructor used by element factory */
167 explicit LegacyOutput(GstBaseSink *gobj);
169 shared_ptr<sigrok::OutputFormat> _libsigrok_output_format;
170 shared_ptr<sigrok::Device> _libsigrok_device;
171 shared_ptr<sigrok::Output> _libsigrok_output;
172 map<string, Glib::VariantBase> _options;
176 class LegacyDecoder :
180 static Glib::RefPtr<LegacyDecoder> create(
181 struct srd_session *libsigrokdecode_session, uint64_t unitsize);
183 /* Retrieve libsigrokdecode session */
184 struct srd_session *libsigrokdecode_session();
189 /* Override render */
190 Gst::FlowReturn render_vfunc(const Glib::RefPtr<Gst::Buffer> &buffer);
196 static void class_init(Gst::ElementClass<LegacyDecoder> *klass);
198 /* Register class with plugin */
199 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
201 /* Constructor used by element factory */
202 explicit LegacyDecoder(GstBaseSink *gobj);
204 struct srd_session *_session;