]> sigrok.org Git - libsigrokflow.git/blame - include/libsigrokflow/libsigrokflow.hpp
Check for the (optional) libsigrokcxx dependency.
[libsigrokflow.git] / include / libsigrokflow / libsigrokflow.hpp
CommitLineData
572e76fe
UH
1/*
2 * This file is part of the libsigrokflow project.
3 *
f1eaad84 4 * Copyright (C) 2018 Martin Ling <martin-sigrok@earth.li>
572e76fe
UH
5 * Copyright (C) 2018 Uwe Hermann <uwe@hermann-uwe.de>
6 *
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.
11 *
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.
16 *
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/>.
19 */
20
21#ifndef LIBSIGROKFLOW_LIBSIGROKFLOW_HPP
22#define LIBSIGROKFLOW_LIBSIGROKFLOW_HPP
23
f7363af1 24#include <gstreamermm.h>
37469b3d 25#include <gstreamermm/private/element_p.h>
e2cfc0ef 26#include <gstreamermm/private/basesink_p.h>
1060e9b5 27#ifdef HAVE_LIBSIGROKCXX
f7363af1 28#include <libsigrokcxx/libsigrokcxx.hpp>
1060e9b5 29#endif
b1322000 30#include <libsigrokdecode/libsigrokdecode.h>
f7363af1 31
b903bb0a
UH
32namespace Srf
33{
34
f7363af1
ML
35using namespace std;
36
b903bb0a
UH
37void init();
38
f7363af1
ML
39class Block
40{
41 /* Config API etc goes here */
42};
43
e2cfc0ef
ML
44class Sink :
45 public Gst::BaseSink
f7363af1 46{
6d71d36a 47protected:
e2cfc0ef 48 explicit Sink(GstBaseSink *gobj);
f7363af1
ML
49};
50
51class Device :
e2cfc0ef 52 public Gst::Element
f7363af1
ML
53{
54 /* Operations specific to hardware devices go here */
6d71d36a
ML
55protected:
56 explicit Device(GstElement *gobj);
f7363af1 57};
b903bb0a 58
f7363af1
ML
59class CaptureDevice :
60 public Device
61{
62 /* Operations specific to capture (source) devices go here */
6d71d36a
ML
63protected:
64 explicit CaptureDevice(GstElement *gobj);
f7363af1
ML
65};
66
1060e9b5 67#ifdef HAVE_LIBSIGROKCXX
f7363af1
ML
68class LegacyCaptureDevice :
69 public CaptureDevice
70{
71public:
64b0db03
ML
72 /* Create from libsigrok device object */
73 static Glib::RefPtr<LegacyCaptureDevice> create(
74 shared_ptr<sigrok::HardwareDevice> libsigrok_device);
f7363af1
ML
75
76 /* Retrieve libsigrok device object */
d03b3a98
ML
77 shared_ptr<sigrok::HardwareDevice> libsigrok_device();
78
79 /* Override state change */
80 Gst::StateChangeReturn change_state_vfunc(Gst::StateChange transition);
6d71d36a
ML
81
82 /* Gst class init */
83 static void class_init(Gst::ElementClass<LegacyCaptureDevice> *klass);
84
85 /* Register class with plugin */
86 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
87
88 /* Construcor used by element factory */
89 explicit LegacyCaptureDevice(GstElement *gobj);
f7363af1 90private:
64b0db03 91 shared_ptr<sigrok::HardwareDevice> _libsigrok_device;
d03b3a98
ML
92 Glib::RefPtr<Gst::Pad> _src_pad;
93 Glib::Threads::RecMutex _mutex;
94 Glib::RefPtr<Gst::Task> _task;
95 shared_ptr<sigrok::Session> _session;
96
97 void _datafeed_callback(shared_ptr<sigrok::Device> device,
98 shared_ptr<sigrok::Packet> packet);
99 void _run();
f7363af1
ML
100};
101
92d521e7
ML
102class LegacyInput :
103 public Gst::Element
104{
105public:
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>());
110
111 /* Override start */
112 bool start_vfunc();
113
114 /* Chain function */
115 Gst::FlowReturn chain(const Glib::RefPtr<Gst::Pad> &pad,
116 const Glib::RefPtr<Gst::Buffer> &buf);
117
118 /* Override stop */
119 bool stop_vfunc();
120
121 /* Gst class init */
122 static void class_init(Gst::ElementClass<LegacyInput> *klass);
123
124 /* Register class with plugin */
125 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
126
127 /* Construcor used by element factory */
128 explicit LegacyInput(GstElement *gobj);
129private:
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;
136
137 void _datafeed_callback(shared_ptr<sigrok::Device> device,
138 shared_ptr<sigrok::Packet> packet);
139};
140
e2cfc0ef
ML
141class LegacyOutput :
142 public Sink
143{
144public:
145 /* Create from libsigrok output object */
146 static Glib::RefPtr<LegacyOutput> create(
726122c2
ML
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>());
e2cfc0ef 150
726122c2
ML
151 /* Override start */
152 bool start_vfunc();
e2cfc0ef
ML
153
154 /* Override render */
155 Gst::FlowReturn render_vfunc(const Glib::RefPtr<Gst::Buffer> &buffer);
156
157 /* Override stop */
158 bool stop_vfunc();
159
160 /* Gst class init */
161 static void class_init(Gst::ElementClass<LegacyOutput> *klass);
162
163 /* Register class with plugin */
164 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
165
166 /* Constructor used by element factory */
167 explicit LegacyOutput(GstBaseSink *gobj);
168private:
726122c2
ML
169 shared_ptr<sigrok::OutputFormat> _libsigrok_output_format;
170 shared_ptr<sigrok::Device> _libsigrok_device;
e2cfc0ef 171 shared_ptr<sigrok::Output> _libsigrok_output;
726122c2 172 map<string, Glib::VariantBase> _options;
e2cfc0ef 173};
1060e9b5 174#endif
e2cfc0ef 175
b1322000
UH
176class LegacyDecoder :
177 public Sink
178{
179public:
180 static Glib::RefPtr<LegacyDecoder> create(
181 struct srd_session *libsigrokdecode_session, uint64_t unitsize);
182
183 /* Retrieve libsigrokdecode session */
184 struct srd_session *libsigrokdecode_session();
185
186 /* Override start */
187 bool start_vfunc();
188
189 /* Override render */
190 Gst::FlowReturn render_vfunc(const Glib::RefPtr<Gst::Buffer> &buffer);
191
192 /* Override stop */
193 bool stop_vfunc();
194
195 /* Gst class init */
196 static void class_init(Gst::ElementClass<LegacyDecoder> *klass);
197
198 /* Register class with plugin */
199 static bool register_element(Glib::RefPtr<Gst::Plugin> plugin);
200
201 /* Constructor used by element factory */
202 explicit LegacyDecoder(GstBaseSink *gobj);
203private:
204 struct srd_session *_session;
205 uint64_t _abs_ss;
206 uint64_t _unitsize;
207};
f7363af1
ML
208
209}
572e76fe 210#endif