From 79fe75853ed8205674335f88e4e9c0e9dec137f9 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/AtomWriter.hpp | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) (limited to 'ingen/AtomWriter.hpp') diff --git a/ingen/AtomWriter.hpp b/ingen/AtomWriter.hpp index bb6ab921..5d03c5e0 100644 --- a/ingen/AtomWriter.hpp +++ b/ingen/AtomWriter.hpp @@ -25,6 +25,7 @@ #include "ingen/Properties.hpp" #include "ingen/Resource.hpp" #include "ingen/ingen.h" +#include "lv2/atom/Forge.hpp" #include "lv2/atom/forge.h" #include "lv2/urid/urid.h" @@ -66,19 +67,51 @@ 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 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 -- cgit v1.2.1