/*
This file is part of Ingen.
Copyright 2007-2017 David Robillard
Ingen is free software: you can redistribute it and/or modify it under the
terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or any later version.
Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU Affero General Public License for details.
You should have received a copy of the GNU Affero General Public License
along with Ingen. If not, see .
*/
/** @page protocol Ingen Protocol
* @tableofcontents
*
* @section introduction Controlling Ingen
*
* Ingen is controlled via a simple RDF-based protocol. This conceptual
* protocol can be used in two concrete ways:
*
* 1. When Ingen is running as a process, a socket accepts messages in
* (textual) Turtle syntax, and responds in the same syntax. Transfers are
* delimited by null characters in the stream, so the client knows when to
* finish parsing to interpret responses. By default, Ingen listens on
* unix:///tmp/ingen.sock and tcp://localhost:16180
*
* 2. When Ingen is running as an LV2 plugin, the control and notify ports
* accept and respond using (binary) LV2 atoms. Messages are read and written
* as events with atom:Object bodies. The standard rules for LV2 event
* transmission apply, but note that the graph manipulations described here are
* executed asynchronously and not with sample accuracy, so the response may
* come at a later frame or cycle.
*
* For documentation purposes, this page discusses messages in Turtle syntax,
* but the same protocol is used in the LV2 case, just in a more compact binary
* encoding.
*
* Conceptually, Ingen represents a tree of objects, each of which has a path
* (like /main/in or /main/osc/out) and a set of properties. A property is a
* URI key and some value. All changes to Ingen are represented as
* manipulations of this tree of dictionaries. The core of the protocol is
* based on the LV2 patch extension, which defines several messages for
* manipulating data in this model which resemble HTTP methods.
*/
#include "ingen/AtomWriter.hpp"
#include "ingen/Atom.hpp"
#include "ingen/AtomForge.hpp"
#include "ingen/AtomSink.hpp"
#include "ingen/Message.hpp"
#include "ingen/Properties.hpp"
#include "ingen/Resource.hpp"
#include "ingen/URI.hpp"
#include "ingen/URIMap.hpp"
#include "ingen/URIs.hpp"
#include "ingen/paths.hpp"
#include "lv2/atom/forge.h"
#include "lv2/urid/urid.h"
#include "raul/Path.hpp"
#include "serd/serd.h"
#include
#include
#include