summaryrefslogtreecommitdiffstats
path: root/ingen
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2017-12-17 20:33:47 +0100
committerDavid Robillard <d@drobilla.net>2017-12-17 20:33:47 +0100
commit7f37e2306f79d3f77934aa97e5f784fb0b39b838 (patch)
tree32a8b3b87795ba494ff5f0fcaf7ea893a8fb5594 /ingen
parent86bf9cbd7af99c8964745d414494c26af11af0f4 (diff)
downloadingen-7f37e2306f79d3f77934aa97e5f784fb0b39b838.tar.gz
ingen-7f37e2306f79d3f77934aa97e5f784fb0b39b838.tar.bz2
ingen-7f37e2306f79d3f77934aa97e5f784fb0b39b838.zip
Use LV2 atom forge C++ bindings
Diffstat (limited to 'ingen')
-rw-r--r--ingen/AtomForgeSink.hpp24
-rw-r--r--ingen/AtomWriter.hpp49
-rw-r--r--ingen/Forge.hpp5
3 files changed, 46 insertions, 32 deletions
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 <cassert>
#include <cstdlib>
-#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);