From 7f37e2306f79d3f77934aa97e5f784fb0b39b838 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 17 Dec 2017 20:33:47 +0100 Subject: Use LV2 atom forge C++ bindings --- ingen/AtomForgeSink.hpp | 24 ++++-------------------- ingen/AtomWriter.hpp | 49 +++++++++++++++++++++++++++++++++++++++---------- ingen/Forge.hpp | 5 +++-- 3 files changed, 46 insertions(+), 32 deletions(-) (limited to 'ingen') diff --git a/ingen/AtomForgeSink.hpp b/ingen/AtomForgeSink.hpp index 5520906c..b32d9679 100644 --- a/ingen/AtomForgeSink.hpp +++ b/ingen/AtomForgeSink.hpp @@ -17,9 +17,10 @@ #ifndef INGEN_ATOMFORGESINK_HPP #define INGEN_ATOMFORGESINK_HPP +#include #include -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/ext/atom/util.h" namespace Ingen { @@ -27,24 +28,17 @@ namespace Ingen { class AtomForgeSink { public: - AtomForgeSink(LV2_Atom_Forge* forge = nullptr) + AtomForgeSink() : _capacity(8 * sizeof(LV2_Atom)) , _size(0) , _buf((LV2_Atom*)calloc(8, sizeof(LV2_Atom))) { - if (forge) { - set_forge_sink(forge); - } } ~AtomForgeSink() { free(_buf); } - void set_forge_sink(LV2_Atom_Forge* forge) { - lv2_atom_forge_set_sink(forge, c_append, c_deref, this); - } - /** Append some data and return a reference to its start. */ - intptr_t append(const void* buf, uint32_t len) { + intptr_t write(const void* buf, uint32_t len) { // Record offset of the start of this write (+1 to avoid NULL) const intptr_t ref = _size + 1; @@ -76,16 +70,6 @@ public: void clear() { _buf->type = 0; _buf->size = 0; _size = 0; } - static LV2_Atom_Forge_Ref - c_append(void* handle, const void* buf, uint32_t len) { - return ((AtomForgeSink*)handle)->append(buf, len); - } - - static LV2_Atom* - c_deref(void* handle, LV2_Atom_Forge_Ref ref) { - return ((AtomForgeSink*)handle)->deref(ref); - } - private: size_t _capacity; size_t _size; diff --git a/ingen/AtomWriter.hpp b/ingen/AtomWriter.hpp index 20d152e6..aca1f5bb 100644 --- a/ingen/AtomWriter.hpp +++ b/ingen/AtomWriter.hpp @@ -23,7 +23,7 @@ #include "ingen/Interface.hpp" #include "ingen/URIs.hpp" #include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/ext/atom/Forge.hpp" namespace Ingen { @@ -36,8 +36,6 @@ class INGEN_API AtomWriter : public Interface public: AtomWriter(URIMap& map, URIs& uris, AtomSink& sink); - ~AtomWriter(); - Raul::URI uri() const { return Raul::URI("ingen:/clients/atom_writer"); } @@ -62,19 +60,50 @@ public: void operator()(const Undo&); private: + using ScopedObject = lv2::atom::Forge::ScopedObject; + + struct ScopedEmitter + { + ScopedEmitter(AtomWriter& writer) : writer(writer) {} + ~ScopedEmitter() { writer.finish_msg(); } + + ScopedEmitter(const ScopedEmitter&) = delete; + ScopedEmitter& operator=(const ScopedEmitter&) = delete; + + AtomWriter& writer; + }; + + struct ScopedMessage + { + ScopedMessage(AtomWriter& writer, + const LV2_URID type, + const int32_t seq = 0) + : emitter(writer) + , object(writer._forge, 0, type) + { + if (seq) { + object.key(writer._uris.patch_sequenceNumber); + writer._forge.write(seq); + } + } + + ScopedEmitter emitter; + ScopedObject object; + }; + void forge_uri(const Raul::URI& uri); - void forge_properties(const Properties& properties); + void forge_properties(ScopedObject& object, const Properties& properties); void forge_arc(const Raul::Path& tail, const Raul::Path& head); void forge_request(LV2_Atom_Forge_Frame* frame, LV2_URID type, int32_t id); - void forge_context(Resource::Graph ctx); + void forge_context(ScopedMessage& message, Resource::Graph ctx); void finish_msg(); - URIMap& _map; - URIs& _uris; - AtomSink& _sink; - AtomForgeSink _out; - LV2_Atom_Forge _forge; + URIMap& _map; + URIs& _uris; + AtomSink& _sink; + AtomForgeSink _out; + lv2::atom::Forge _forge; }; } // namespace Ingen diff --git a/ingen/Forge.hpp b/ingen/Forge.hpp index 9b45bde1..a2395636 100644 --- a/ingen/Forge.hpp +++ b/ingen/Forge.hpp @@ -21,7 +21,7 @@ #include "ingen/Atom.hpp" #include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" +#include "lv2/lv2plug.in/ns/ext/atom/Forge.hpp" #include "raul/URI.hpp" namespace Ingen { @@ -29,9 +29,10 @@ namespace Ingen { class URIMap; /** Forge for Atoms. + * * @ingroup IngenShared */ -class INGEN_API Forge : public LV2_Atom_Forge { +class INGEN_API Forge : public lv2::atom::Forge { public: explicit Forge(URIMap& map); -- cgit v1.2.1