diff options
author | David Robillard <d@drobilla.net> | 2012-03-16 22:27:16 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-03-16 22:27:16 +0000 |
commit | bc3afd8380d59c750c8f8e9bf1ed1b8d4a6826e9 (patch) | |
tree | b42f56620ce85f6207568eadfb901360436c6f74 /src/shared/AtomWriter.cpp | |
parent | 7126f005be3e49818dafe0d2666b6745e09f8aff (diff) | |
download | ingen-bc3afd8380d59c750c8f8e9bf1ed1b8d4a6826e9.tar.gz ingen-bc3afd8380d59c750c8f8e9bf1ed1b8d4a6826e9.tar.bz2 ingen-bc3afd8380d59c750c8f8e9bf1ed1b8d4a6826e9.zip |
Preliminary work towards native LV2 UI.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4074 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/shared/AtomWriter.cpp')
-rw-r--r-- | src/shared/AtomWriter.cpp | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/src/shared/AtomWriter.cpp b/src/shared/AtomWriter.cpp index a5317bfb..c86ac96f 100644 --- a/src/shared/AtomWriter.cpp +++ b/src/shared/AtomWriter.cpp @@ -15,19 +15,50 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "ingen/shared/AtomSink.hpp" +#include "ingen/shared/AtomWriter.hpp" #include "raul/Path.hpp" - -#include "AtomWriter.hpp" +#include "serd/serd.h" namespace Ingen { namespace Shared { -AtomWriter::AtomWriter(LV2URIMap& map, URIs& uris) +static LV2_Atom_Forge_Ref +forge_sink(LV2_Atom_Forge_Sink_Handle handle, + const void* buf, + uint32_t size) +{ + SerdChunk* chunk = (SerdChunk*)handle; + const LV2_Atom_Forge_Ref ref = chunk->len + 1; + serd_chunk_sink(buf, size, chunk); + return ref; +} + +static LV2_Atom* +forge_deref(LV2_Atom_Forge_Sink_Handle handle, LV2_Atom_Forge_Ref ref) +{ + SerdChunk* chunk = (SerdChunk*)handle; + return (LV2_Atom*)(chunk->buf + ref - 1); +} + + +AtomWriter::AtomWriter(LV2URIMap& map, URIs& uris, AtomSink& sink) : _map(map) , _uris(uris) - , _id(-1) + , _sink(sink) + , _id(1) { + _out.buf = NULL; + _out.len = 0; lv2_atom_forge_init(&_forge, &map.urid_map_feature()->urid_map); + lv2_atom_forge_set_sink(&_forge, forge_sink, forge_deref, &_out); +} + +void +AtomWriter::finish_msg() +{ + _sink.write((LV2_Atom*)_out.buf); + _out.len = 0; } int32_t @@ -55,6 +86,11 @@ AtomWriter::put(const Raul::URI& uri, const Resource::Properties& properties, Resource::Graph ctx) { + LV2_Atom_Forge_Frame msg; + lv2_atom_forge_blank(&_forge, &msg, next_id(), _uris.patch_Put); + // ... + lv2_atom_forge_pop(&_forge, &msg); + finish_msg(); } void @@ -92,6 +128,8 @@ AtomWriter::connect(const Raul::Path& src, lv2_atom_forge_pop(&_forge, &body); lv2_atom_forge_pop(&_forge, &msg); + + finish_msg(); } void @@ -126,6 +164,7 @@ AtomWriter::get(const Raul::URI& uri) lv2_atom_forge_property_head(&_forge, _uris.patch_subject, 0); lv2_atom_forge_uri(&_forge, uri.c_str(), uri.length()); lv2_atom_forge_pop(&_forge, &msg); + finish_msg(); } void @@ -136,6 +175,7 @@ AtomWriter::response(int32_t id, Status status) lv2_atom_forge_property_head(&_forge, _uris.patch_request, 0); lv2_atom_forge_int32(&_forge, id); lv2_atom_forge_pop(&_forge, &msg); + finish_msg(); } void |