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 --- src/AtomWriter.cpp | 220 +++++++++++++++++----------------------------- src/Forge.cpp | 8 +- src/Parser.cpp | 7 +- src/SocketReader.cpp | 9 +- src/server/JackDriver.cpp | 43 +++++---- src/server/JackDriver.hpp | 4 +- 6 files changed, 114 insertions(+), 177 deletions(-) (limited to 'src') diff --git a/src/AtomWriter.cpp b/src/AtomWriter.cpp index 9c7da98e..015e5fc7 100644 --- a/src/AtomWriter.cpp +++ b/src/AtomWriter.cpp @@ -60,15 +60,16 @@ #include "raul/Path.hpp" #include "serd/serd.h" +using namespace lv2; + namespace ingen { AtomWriter::AtomWriter(URIMap& map, URIs& uris, AtomSink& sink) : _map(map) , _uris(uris) , _sink(sink) + , _forge(&map.urid_map_feature()->urid_map, _out) { - lv2_atom_forge_init(&_forge, &map.urid_map_feature()->urid_map); - _out.set_forge_sink(&_forge); } void @@ -106,41 +107,34 @@ AtomWriter::message(const Message& message) void AtomWriter::operator()(const BundleBegin& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_BundleStart, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_BundleStart, message.seq); } void AtomWriter::operator()(const BundleEnd& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_BundleEnd, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_BundleEnd, message.seq); } void AtomWriter::forge_uri(const URI& uri) { if (serd_uri_string_has_scheme((const uint8_t*)uri.c_str())) { - lv2_atom_forge_urid(&_forge, _map.map_uri(uri.c_str())); + _forge.urid(_map.map_uri(uri.c_str())); } else { - lv2_atom_forge_uri(&_forge, uri.c_str(), uri.length()); + _forge.uri(uri); } } void -AtomWriter::forge_properties(const Properties& properties) +AtomWriter::forge_properties(ScopedObject& object, const Properties& properties) { for (auto p : properties) { - lv2_atom_forge_key(&_forge, _map.map_uri(p.first.c_str())); + object.key(_map.map_uri(p.first.c_str())); if (p.second.type() == _forge.URI) { forge_uri(URI(p.second.ptr())); } else { - lv2_atom_forge_atom(&_forge, p.second.size(), p.second.type()); - lv2_atom_forge_write(&_forge, p.second.get_body(), p.second.size()); + _forge.atom(p.second.size(), p.second.type(), p.second.get_body()); } } } @@ -148,36 +142,23 @@ AtomWriter::forge_properties(const Properties& properties) void AtomWriter::forge_arc(const Raul::Path& tail, const Raul::Path& head) { - LV2_Atom_Forge_Frame arc; - lv2_atom_forge_object(&_forge, &arc, 0, _uris.ingen_Arc); - lv2_atom_forge_key(&_forge, _uris.ingen_tail); + ScopedObject arc(_forge, 0, _uris.ingen_Arc); + arc.key(_uris.ingen_tail); forge_uri(path_to_uri(tail)); - lv2_atom_forge_key(&_forge, _uris.ingen_head); + arc.key(_uris.ingen_head); forge_uri(path_to_uri(head)); - lv2_atom_forge_pop(&_forge, &arc); } void -AtomWriter::forge_request(LV2_Atom_Forge_Frame* frame, LV2_URID type, int32_t id) -{ - lv2_atom_forge_object(&_forge, frame, 0, type); - - if (id) { - lv2_atom_forge_key(&_forge, _uris.patch_sequenceNumber); - lv2_atom_forge_int(&_forge, id); - } -} - -void -AtomWriter::forge_context(Resource::Graph ctx) +AtomWriter::forge_context(ScopedMessage& msg, Resource::Graph ctx) { switch (ctx) { case Resource::Graph::EXTERNAL: - lv2_atom_forge_key(&_forge, _uris.patch_context); + msg.object.key(_uris.patch_context); forge_uri(_uris.ingen_externalContext); break; case Resource::Graph::INTERNAL: - lv2_atom_forge_key(&_forge, _uris.patch_context); + msg.object.key(_uris.patch_context); forge_uri(_uris.ingen_internalContext); break; default: break; @@ -211,20 +192,15 @@ AtomWriter::forge_context(Resource::Graph ctx) void AtomWriter::operator()(const Put& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Put, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); - forge_uri(message.uri); - lv2_atom_forge_key(&_forge, _uris.patch_body); + ScopedMessage msg(*this, _uris.patch_Put, message.seq); + forge_context(msg, message.ctx); - LV2_Atom_Forge_Frame body; - lv2_atom_forge_object(&_forge, &body, 0, 0); - forge_properties(message.properties); - lv2_atom_forge_pop(&_forge, &body); + msg.object.key(_uris.patch_subject); + forge_uri(message.uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + ScopedObject body(_forge, 0, 0); + forge_properties(body, message.properties); } /** @page protocol @@ -256,26 +232,22 @@ AtomWriter::operator()(const Put& message) void AtomWriter::operator()(const Delta& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Patch, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Patch, message.seq); + forge_context(msg, message.ctx); + msg.object.key(_uris.patch_subject); forge_uri(message.uri); - lv2_atom_forge_key(&_forge, _uris.patch_remove); - LV2_Atom_Forge_Frame remove_obj; - lv2_atom_forge_object(&_forge, &remove_obj, 0, 0); - forge_properties(message.remove); - lv2_atom_forge_pop(&_forge, &remove_obj); - - lv2_atom_forge_key(&_forge, _uris.patch_add); - LV2_Atom_Forge_Frame add_obj; - lv2_atom_forge_object(&_forge, &add_obj, 0, 0); - forge_properties(message.add); - lv2_atom_forge_pop(&_forge, &add_obj); + msg.object.key(_uris.patch_remove); + { + ScopedObject remove_obj(_forge, 0, 0); + forge_properties(remove_obj, message.remove); + } - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_add); + { + ScopedObject add_obj(_forge, 0, 0); + forge_properties(add_obj, message.add); + } } /** @page protocol @@ -304,14 +276,11 @@ AtomWriter::operator()(const Delta& message) void AtomWriter::operator()(const Copy& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Copy, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Copy, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.old_uri); - lv2_atom_forge_key(&_forge, _uris.patch_destination); + msg.object.key(_uris.patch_destination); forge_uri(message.new_uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -333,14 +302,11 @@ AtomWriter::operator()(const Copy& message) void AtomWriter::operator()(const Move& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Move, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Move, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(message.old_path)); - lv2_atom_forge_key(&_forge, _uris.patch_destination); + msg.object.key(_uris.patch_destination); forge_uri(path_to_uri(message.new_path)); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -361,12 +327,9 @@ AtomWriter::operator()(const Move& message) void AtomWriter::operator()(const Del& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.uri); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -386,19 +349,18 @@ AtomWriter::operator()(const Del& message) void AtomWriter::operator()(const SetProperty& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Set, message.seq); - forge_context(message.ctx); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Set, message.seq); + forge_context(msg, message.ctx); + + msg.object.key(_uris.patch_subject); forge_uri(message.subject); - lv2_atom_forge_key(&_forge, _uris.patch_property); - lv2_atom_forge_urid(&_forge, _map.map_uri(message.predicate.c_str())); - lv2_atom_forge_key(&_forge, _uris.patch_value); - lv2_atom_forge_atom(&_forge, message.value.size(), message.value.type()); - lv2_atom_forge_write(&_forge, message.value.get_body(), message.value.size()); - - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + + msg.object.key(_uris.patch_property); + _forge.urid(_map.map_uri(message.predicate.c_str())); + + const auto& value = message.value; + msg.object.key(_uris.patch_value); + _forge.atom(value.size(), value.type(), value.get_body()); } /** @page protocol @@ -416,10 +378,7 @@ AtomWriter::operator()(const SetProperty& message) void AtomWriter::operator()(const Undo& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_Undo, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_Undo, message.seq); } /** @page protocol @@ -434,10 +393,7 @@ AtomWriter::operator()(const Undo& message) void AtomWriter::operator()(const Redo& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.ingen_Redo, message.seq); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + ScopedMessage msg(*this, _uris.ingen_Redo, message.seq); } /** @page protocol @@ -455,12 +411,9 @@ AtomWriter::operator()(const Redo& message) void AtomWriter::operator()(const Get& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Get, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Get, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(message.subject); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -489,14 +442,11 @@ AtomWriter::operator()(const Get& message) void AtomWriter::operator()(const Connect& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Put, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + ScopedMessage msg(*this, _uris.patch_Put, message.seq); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(Raul::Path::lca(message.tail, message.head))); - lv2_atom_forge_key(&_forge, _uris.patch_body); + msg.object.key(_uris.patch_body); forge_arc(message.tail, message.head); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -518,12 +468,9 @@ AtomWriter::operator()(const Connect& message) void AtomWriter::operator()(const Disconnect& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_body); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); + msg.object.key(_uris.patch_body); forge_arc(message.tail, message.head); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); } /** @page protocol @@ -547,21 +494,17 @@ AtomWriter::operator()(const Disconnect& message) void AtomWriter::operator()(const DisconnectAll& message) { - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Delete, message.seq); + ScopedMessage msg(*this, _uris.patch_Delete, message.seq); - lv2_atom_forge_key(&_forge, _uris.patch_subject); + msg.object.key(_uris.patch_subject); forge_uri(path_to_uri(message.graph)); - lv2_atom_forge_key(&_forge, _uris.patch_body); - LV2_Atom_Forge_Frame arc; - lv2_atom_forge_object(&_forge, &arc, 0, _uris.ingen_Arc); - lv2_atom_forge_key(&_forge, _uris.ingen_incidentTo); - forge_uri(path_to_uri(message.path)); - lv2_atom_forge_pop(&_forge, &arc); - - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + { + ScopedObject arc(_forge, 0, _uris.ingen_Arc); + arc.key(_uris.ingen_incidentTo); + forge_uri(path_to_uri(message.path)); + } } /** @page protocol @@ -602,18 +545,15 @@ AtomWriter::operator()(const Response& response) return; } - LV2_Atom_Forge_Frame msg; - forge_request(&msg, _uris.patch_Response, 0); - lv2_atom_forge_key(&_forge, _uris.patch_sequenceNumber); - lv2_atom_forge_int(&_forge, response.id); - if (!subject.empty()) { - lv2_atom_forge_key(&_forge, _uris.patch_subject); - lv2_atom_forge_uri(&_forge, subject.c_str(), subject.length()); + ScopedMessage msg(*this, _uris.patch_Response, 0); + msg.object.key(_uris.patch_sequenceNumber); + _forge.write(response.id); + if (!subject.empty() && URI::is_valid(subject)) { + msg.object.key(_uris.patch_subject); + _forge.uri(subject); } - lv2_atom_forge_key(&_forge, _uris.patch_body); - lv2_atom_forge_int(&_forge, static_cast(response.status)); - lv2_atom_forge_pop(&_forge, &msg); - finish_msg(); + msg.object.key(_uris.patch_body); + _forge.write(static_cast(response.status)); } void diff --git a/src/Forge.cpp b/src/Forge.cpp index 9ac406fc..fbebbeb5 100644 --- a/src/Forge.cpp +++ b/src/Forge.cpp @@ -24,16 +24,16 @@ namespace ingen { Forge::Forge(URIMap& map) - : _map(map) + : lv2::atom::Forge(&map.urid_map_feature()->urid_map) + , _map(map) { - lv2_atom_forge_init(this, &map.urid_map_feature()->urid_map); } Atom Forge::make_urid(const ingen::URI& u) { - const LV2_URID urid = _map.map_uri(u.string()); - return Atom(sizeof(int32_t), URID, &urid); + const LV2_URID urid = _map.map_uri(u); + return Atom(sizeof(urid), URID, &urid); } std::string diff --git a/src/Parser.cpp b/src/Parser.cpp index 9318d44a..a0341747 100644 --- a/src/Parser.cpp +++ b/src/Parser.cpp @@ -31,6 +31,7 @@ #include "ingen/World.hpp" #include "ingen/filesystem.hpp" #include "ingen/paths.hpp" +#include "lv2/atom/Forge.hpp" #include "lv2/atom/atom.h" #include "serd/serd.h" #include "sord/sordmm.hpp" @@ -102,10 +103,8 @@ get_properties(ingen::World* world, LV2_URID_Map* map = &world->uri_map().urid_map_feature()->urid_map; Sratom* sratom = sratom_new(map); - LV2_Atom_Forge forge; - lv2_atom_forge_init(&forge, map); - - AtomForgeSink out(&forge); + AtomForgeSink out; + lv2::atom::Forge forge(map, out); const Sord::Node nil; Properties props; diff --git a/src/SocketReader.cpp b/src/SocketReader.cpp index de2f3342..6e21f7d2 100644 --- a/src/SocketReader.cpp +++ b/src/SocketReader.cpp @@ -25,6 +25,7 @@ #include "ingen/SocketReader.hpp" #include "ingen/URIMap.hpp" #include "ingen/World.hpp" +#include "lv2/atom/Forge.hpp" #include "raul/Socket.hpp" #include "sord/sordmm.hpp" #include "sratom/sratom.h" @@ -103,11 +104,9 @@ SocketReader::run() } // Set up sratom and a forge to build LV2 atoms from model - Sratom* sratom = sratom_new(map); - LV2_Atom_Forge forge; - lv2_atom_forge_init(&forge, map); - - AtomForgeSink buffer(&forge); + Sratom* sratom(sratom_new(map)); + AtomForgeSink buffer; + lv2::atom::Forge forge(map, buffer); SordNode* base_uri = nullptr; SordModel* model = nullptr; diff --git a/src/server/JackDriver.cpp b/src/server/JackDriver.cpp index a331811e..11f7cafe 100644 --- a/src/server/JackDriver.cpp +++ b/src/server/JackDriver.cpp @@ -54,6 +54,7 @@ namespace server { JackDriver::JackDriver(Engine& engine) : _engine(engine) + , _forge(&engine.world()->uri_map().urid_map_feature()->urid_map) , _sem(0) , _flag(false) , _client(nullptr) @@ -66,8 +67,6 @@ JackDriver::JackDriver(Engine& engine) , _old_rolling(false) { _midi_event_type = _engine.world()->uris().midi_MidiEvent; - lv2_atom_forge_init( - &_forge, &engine.world()->uri_map().urid_map_feature()->urid_map); } JackDriver::~JackDriver() @@ -437,26 +436,26 @@ JackDriver::append_time_events(RunContext& context, _old_bpm = pos->beats_per_minute; // Build an LV2 position object to append to the buffer - LV2_Atom pos_buf[16]; - LV2_Atom_Forge_Frame frame; - lv2_atom_forge_set_buffer(&_forge, (uint8_t*)pos_buf, sizeof(pos_buf)); - lv2_atom_forge_object(&_forge, &frame, 0, uris.time_Position); - lv2_atom_forge_key(&_forge, uris.time_frame); - lv2_atom_forge_long(&_forge, pos->frame); - lv2_atom_forge_key(&_forge, uris.time_speed); - lv2_atom_forge_float(&_forge, rolling ? 1.0 : 0.0); - if (pos->valid & JackPositionBBT) { - lv2_atom_forge_key(&_forge, uris.time_barBeat); - lv2_atom_forge_float( - &_forge, pos->beat - 1 + (pos->tick / pos->ticks_per_beat)); - lv2_atom_forge_key(&_forge, uris.time_bar); - lv2_atom_forge_long(&_forge, pos->bar - 1); - lv2_atom_forge_key(&_forge, uris.time_beatUnit); - lv2_atom_forge_int(&_forge, pos->beat_type); - lv2_atom_forge_key(&_forge, uris.time_beatsPerBar); - lv2_atom_forge_float(&_forge, pos->beats_per_bar); - lv2_atom_forge_key(&_forge, uris.time_beatsPerMinute); - lv2_atom_forge_float(&_forge, pos->beats_per_minute); + LV2_Atom pos_buf[16]; + _forge.set_buffer((uint8_t*)pos_buf, sizeof(pos_buf)); + { + lv2::atom::Forge::ScopedObject position(_forge, 0, uris.time_Position); + position.key(uris.time_frame); + _forge.write(int64_t(pos->frame)); + position.key(uris.time_speed); + _forge.write(rolling ? 1.0f : 0.0f); + if (pos->valid & JackPositionBBT) { + position.key(uris.time_barBeat); + _forge.write(pos->beat - 1 + (pos->tick / pos->ticks_per_beat)); + position.key(uris.time_bar); + _forge.write(int64_t(pos->bar - 1)); + position.key(uris.time_beatUnit); + _forge.write(int32_t(pos->beat_type)); + position.key(uris.time_beatsPerBar); + _forge.write(float(pos->beats_per_bar)); + position.key(uris.time_beatsPerMinute); + _forge.write(float(pos->beats_per_minute)); + } } // Append position to buffer at offset 0 (start of this cycle) diff --git a/src/server/JackDriver.hpp b/src/server/JackDriver.hpp index c9307623..0f57431e 100644 --- a/src/server/JackDriver.hpp +++ b/src/server/JackDriver.hpp @@ -30,7 +30,7 @@ #endif #include "ingen/types.hpp" -#include "lv2/atom/forge.h" +#include "lv2/atom/Forge.hpp" #include "raul/Semaphore.hpp" #include "Driver.hpp" @@ -150,7 +150,7 @@ protected: Engine& _engine; Ports _ports; AudioBufPtr _fallback_buffer; - LV2_Atom_Forge _forge; + lv2::atom::Forge _forge; Raul::Semaphore _sem; std::atomic _flag; jack_client_t* _client; -- cgit v1.2.1