X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=include%2Flibsigrokflow%2Flibsigrokflow.hpp;h=baa41f2af54c971830234bd0fcfea671eb727141;hb=fc5450cb62d7dc06f7928e5dfb587ccc908547d4;hp=2c13cb4be875b77e6d1ef78624c258143589d3c2;hpb=6d71d36a6150cc76ac2408a7a41dcd473328e4fa;p=libsigrokflow.git diff --git a/include/libsigrokflow/libsigrokflow.hpp b/include/libsigrokflow/libsigrokflow.hpp index 2c13cb4..baa41f2 100644 --- a/include/libsigrokflow/libsigrokflow.hpp +++ b/include/libsigrokflow/libsigrokflow.hpp @@ -1,6 +1,7 @@ /* * This file is part of the libsigrokflow project. * + * Copyright (C) 2018 Martin Ling * Copyright (C) 2018 Uwe Hermann * * This program is free software: you can redistribute it and/or modify @@ -20,8 +21,19 @@ #ifndef LIBSIGROKFLOW_LIBSIGROKFLOW_HPP #define LIBSIGROKFLOW_LIBSIGROKFLOW_HPP +/* Temporary workaround, will be dropped later. */ +#define HAVE_LIBSIGROKCXX 1 +#define HAVE_LIBSIGROKDECODE 1 + #include +#include +#include +#ifdef HAVE_LIBSIGROKCXX #include +#endif +#ifdef HAVE_LIBSIGROKDECODE +#include +#endif namespace Srf { @@ -30,69 +42,183 @@ using namespace std; void init(); +void deinit(); + class Block { - /* Config API etc goes here */ + /* Config API etc. goes here. */ }; -class GstBlock : - public Gst::Element +class Sink : + public Gst::BaseSink { - /* Operations specific to sigrok GStreamer blocks go here. */ protected: - explicit GstBlock(GstElement *gobj); + explicit Sink(GstBaseSink *gobj); }; class Device : - public GstBlock + public Gst::Element { - /* Operations specific to hardware devices go here */ + /* Operations specific to hardware devices go here. */ protected: - explicit Device(GstElement *gobj); + explicit Device(GstElement *gobj); }; class CaptureDevice : - public Device + public Device { - /* Operations specific to capture (source) devices go here */ + /* Operations specific to capture (source) devices go here. */ protected: - explicit CaptureDevice(GstElement *gobj); + explicit CaptureDevice(GstElement *gobj); }; +#ifdef HAVE_LIBSIGROKCXX class LegacyCaptureDevice : - public CaptureDevice + public CaptureDevice +{ +public: + /* Create from libsigrok device object. */ + static Glib::RefPtr create( + shared_ptr libsigrok_device); + + /* Retrieve libsigrok device object. */ + shared_ptr libsigrok_device(); + + /* Override state change. */ + Gst::StateChangeReturn change_state_vfunc(Gst::StateChange transition); + + /* Gst class init. */ + static void class_init(Gst::ElementClass *klass); + + /* Register class with plugin. */ + static bool register_element(Glib::RefPtr plugin); + + /* Constructor used by element factory. */ + explicit LegacyCaptureDevice(GstElement *gobj); + +private: + shared_ptr libsigrok_device_; + Glib::RefPtr src_pad_; + Glib::Threads::RecMutex mutex_; + Glib::RefPtr task_; + shared_ptr session_; + + void datafeed_callback_(shared_ptr device, + shared_ptr packet); + void run_(); +}; + +class LegacyInput : + public Gst::Element { public: - /* Create from libsigrok device object */ - static Glib::RefPtr create( - shared_ptr libsigrok_device); + /* Create from libsigrok input. */ + static Glib::RefPtr create( + shared_ptr format, + map options = map()); + + /* Override start. */ + bool start_vfunc(); + + /* Chain function. */ + Gst::FlowReturn chain(const Glib::RefPtr &pad, + const Glib::RefPtr &buf); - /* Retrieve libsigrok device object */ - shared_ptr libsigrok_device(); + /* Override stop. */ + bool stop_vfunc(); - /* Override state change */ - Gst::StateChangeReturn change_state_vfunc(Gst::StateChange transition); + /* Gst class init. */ + static void class_init(Gst::ElementClass *klass); - /* Gst class init */ - static void class_init(Gst::ElementClass *klass); + /* Register class with plugin. */ + static bool register_element(Glib::RefPtr plugin); - /* Register class with plugin */ - static bool register_element(Glib::RefPtr plugin); + /* Constructor used by element factory. */ + explicit LegacyInput(GstElement *gobj); - /* Construcor used by element factory */ - explicit LegacyCaptureDevice(GstElement *gobj); private: - shared_ptr _libsigrok_device; - Glib::RefPtr _src_pad; - Glib::Threads::RecMutex _mutex; - Glib::RefPtr _task; - shared_ptr _session; - - void _datafeed_callback(shared_ptr device, - shared_ptr packet); - void _run(); + shared_ptr libsigrok_input_format_; + shared_ptr libsigrok_input_; + shared_ptr session_; + map options_; + Glib::RefPtr sink_pad_; + Glib::RefPtr src_pad_; + + void datafeed_callback_(shared_ptr device, + shared_ptr packet); }; +class LegacyOutput : + public Sink +{ +public: + /* Create from libsigrok output object. */ + static Glib::RefPtr create( + shared_ptr libsigrok_output_format, + shared_ptr libsigrok_device, + map options = map()); + + /* Override start. */ + bool start_vfunc(); + + /* Override render. */ + Gst::FlowReturn render_vfunc(const Glib::RefPtr &buffer); + + /* Override stop. */ + bool stop_vfunc(); + + /* Gst class init. */ + static void class_init(Gst::ElementClass *klass); + + /* Register class with plugin. */ + static bool register_element(Glib::RefPtr plugin); + + /* Constructor used by element factory. */ + explicit LegacyOutput(GstBaseSink *gobj); + +private: + shared_ptr libsigrok_output_format_; + shared_ptr libsigrok_device_; + shared_ptr libsigrok_output_; + map options_; +}; +#endif + +#ifdef HAVE_LIBSIGROKDECODE +class LegacyDecoder : + public Sink +{ +public: + static Glib::RefPtr create( + struct srd_session *libsigrokdecode_session, uint64_t unitsize); + + /* Retrieve libsigrokdecode session. */ + struct srd_session *libsigrokdecode_session(); + + /* Override start. */ + bool start_vfunc(); + + /* Override render. */ + Gst::FlowReturn render_vfunc(const Glib::RefPtr &buffer); + + /* Override stop. */ + bool stop_vfunc(); + + /* Gst class init. */ + static void class_init(Gst::ElementClass *klass); + + /* Register class with plugin. */ + static bool register_element(Glib::RefPtr plugin); + + /* Constructor used by element factory. */ + explicit LegacyDecoder(GstBaseSink *gobj); + +private: + struct srd_session *session_; + uint64_t abs_ss_; + uint64_t unitsite_; +}; +#endif } #endif