diff options
Diffstat (limited to 'ingen')
54 files changed, 0 insertions, 5057 deletions
diff --git a/ingen/Arc.hpp b/ingen/Arc.hpp deleted file mode 100644 index 043ffc0b..00000000 --- a/ingen/Arc.hpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ARC_HPP -#define INGEN_ARC_HPP - -#include "ingen/ingen.h" -#include "raul/Deletable.hpp" - -namespace Raul { class Path; } - -namespace Ingen { - -/** A connection between two ports. - * - * @ingroup Ingen - */ -class INGEN_API Arc : public Raul::Deletable -{ -public: - virtual const Raul::Path& tail_path() const = 0; - virtual const Raul::Path& head_path() const = 0; -}; - -} // namespace Ingen - -#endif // INGEN_ARC_HPP diff --git a/ingen/Atom.hpp b/ingen/Atom.hpp deleted file mode 100644 index 5e90903a..00000000 --- a/ingen/Atom.hpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ATOM_HPP -#define INGEN_ATOM_HPP - -#include <algorithm> -#include <cassert> -#include <cstdint> -#include <cstdlib> -#include <cstring> - -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" - -namespace Ingen { - -/** - A generic typed data container. - - An Atom holds a value with some type and size, both specified by a uint32_t. - Values with size less than sizeof(void*) are stored inline: no dynamic - allocation occurs so Atoms may be created in hard real-time threads. - Otherwise, if the size is larger than sizeof(void*), the value will be - dynamically allocated in a separate chunk of memory. - - In either case, the data is stored in a binary compatible format to LV2_Atom - (i.e., if the value is dynamically allocated, the header is repeated there). -*/ -class INGEN_API Atom { -public: - Atom() noexcept { _atom.size = 0; _atom.type = 0; _body.ptr = nullptr; } - ~Atom() { dealloc(); } - - /** Construct a raw atom. - * - * Typically this is not used directly, use Forge methods to make atoms. - */ - Atom(uint32_t size, LV2_URID type, const void* body) { - _atom.size = size; - _atom.type = type; - _body.ptr = nullptr; - if (is_reference()) { - _body.ptr = (LV2_Atom*)malloc(sizeof(LV2_Atom) + size); - memcpy(_body.ptr, &_atom, sizeof(LV2_Atom)); - } - if (body) { - memcpy(get_body(), body, size); - } - } - - Atom(const Atom& copy) - : _atom(copy._atom) - { - if (is_reference()) { - _body.ptr = (LV2_Atom*)malloc(sizeof(LV2_Atom) + _atom.size); - memcpy(_body.ptr, copy._body.ptr, sizeof(LV2_Atom) + _atom.size); - } else { - _body.val = copy._body.val; - } - } - - Atom& operator=(const Atom& other) { - if (&other == this) { - return *this; - } - dealloc(); - _atom = other._atom; - if (is_reference()) { - _body.ptr = (LV2_Atom*)malloc(sizeof(LV2_Atom) + _atom.size); - memcpy(_body.ptr, other._body.ptr, sizeof(LV2_Atom) + _atom.size); - } else { - _body.val = other._body.val; - } - return *this; - } - - inline bool operator==(const Atom& other) const { - if (_atom.type != other._atom.type || - _atom.size != other._atom.size) { - return false; - } - return is_reference() - ? !memcmp(_body.ptr, other._body.ptr, sizeof(LV2_Atom) + _atom.size) - : _body.val == other._body.val; - } - - inline bool operator!=(const Atom& other) const { - return !operator==(other); - } - - inline bool operator<(const Atom& other) const { - if (_atom.type == other._atom.type) { - const uint32_t min_size = std::min(_atom.size, other._atom.size); - const int cmp = is_reference() - ? memcmp(_body.ptr, other._body.ptr, min_size) - : memcmp(&_body.val, &other._body.val, min_size); - return cmp < 0 || (cmp == 0 && _atom.size < other._atom.size); - } - return type() < other.type(); - } - - /** Like assignment, but only works for value atoms (not references). - * Always real-time safe. - * @return true iff set succeeded. - */ - inline bool set_rt(const Atom& other) { - if (is_reference()) { - return false; - } else { - _atom = other._atom; - _body.val = other._body.val; - return true; - } - } - - inline uint32_t size() const { return _atom.size; } - inline LV2_URID type() const { return _atom.type; } - inline bool is_valid() const { return _atom.type; } - - inline const void* get_body() const { - return is_reference() ? (void*)(_body.ptr + 1) : &_body.val; - } - - inline void* get_body() { - return is_reference() ? (void*)(_body.ptr + 1) : &_body.val; - } - - template <typename T> const T& get() const { - assert(size() == sizeof(T)); - return *static_cast<const T*>(get_body()); - } - - template <typename T> const T* ptr() const { - return static_cast<const T*>(get_body()); - } - - const LV2_Atom* atom() const { - return is_reference() ? _body.ptr : &_atom; - } - -private: - /** Free dynamically allocated value, if applicable. */ - inline void dealloc() { - if (is_reference()) { - free(_body.ptr); - } - } - - /** Return true iff this value is dynamically allocated. */ - inline bool is_reference() const { - return _atom.size > sizeof(_body.val); - } - - LV2_Atom _atom; - union { - intptr_t val; - LV2_Atom* ptr; - } _body; -}; - -} // namespace Ingen - -#endif // INGEN_ATOM_HPP diff --git a/ingen/AtomForgeSink.hpp b/ingen/AtomForgeSink.hpp deleted file mode 100644 index 8c070701..00000000 --- a/ingen/AtomForgeSink.hpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ATOMFORGESINK_HPP -#define INGEN_ATOMFORGESINK_HPP - -#include <cassert> -#include <cstdint> -#include <cstdlib> -#include <cstring> - -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" -#include "lv2/lv2plug.in/ns/ext/atom/util.h" - -namespace Ingen { - -/** A resizing sink for LV2_Atom_Forge. */ -class AtomForgeSink -{ -public: - explicit AtomForgeSink(LV2_Atom_Forge* forge = nullptr) - : _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) { - // Record offset of the start of this write (+1 to avoid NULL) - const intptr_t ref = _size + 1; - - // Update size and reallocate if necessary - if (lv2_atom_pad_size(_size + len) > _capacity) { - _capacity = lv2_atom_pad_size(_size + len); - _buf = (LV2_Atom*)realloc(_buf, _capacity); - } - - // Append new data - memcpy((uint8_t*)_buf + _size, buf, len); - _size += len; - return ref; - } - - /** Dereference a reference previously returned by append. */ - LV2_Atom* deref(intptr_t ref) { - /* Make some assumptions and do unnecessary math to appease - -Wcast-align. This is questionable at best, though the forge should - only dereference references to aligned atoms. */ - assert((ref - 1) % sizeof(LV2_Atom) == 0); - return (LV2_Atom*)(_buf + (ref - 1) / sizeof(LV2_Atom)); - - // Alternatively: - // return (LV2_Atom*)((uint8_t*)_buf + ref - 1); - } - - const LV2_Atom* atom() const { return _buf; } - - 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; - LV2_Atom* _buf; -}; - -} // namespace Ingen - -#endif // INGEN_ATOMFORGESINK_HPP diff --git a/ingen/AtomReader.hpp b/ingen/AtomReader.hpp deleted file mode 100644 index 7ea4654a..00000000 --- a/ingen/AtomReader.hpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ATOMREADER_HPP -#define INGEN_ATOMREADER_HPP - -#include <cstdint> - -#include <boost/optional/optional.hpp> - -#include "ingen/AtomSink.hpp" -#include "ingen/Resource.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" - -namespace Raul { -class Path; -} - -namespace Ingen { - -class URI; -class Atom; -class Interface; -class Log; -class Properties; -class URIMap; -class URIs; - -/** An AtomSink that calls methods on an Interface. - * @ingroup IngenShared - */ -class INGEN_API AtomReader : public AtomSink -{ -public: - AtomReader(URIMap& map, - URIs& uris, - Log& log, - Interface& iface); - - static bool is_message(const URIs& uris, const LV2_Atom* msg); - - bool write(const LV2_Atom* msg, int32_t default_id=0) override; - -private: - void get_atom(const LV2_Atom* in, Atom& out); - - boost::optional<URI> atom_to_uri(const LV2_Atom* atom); - boost::optional<Raul::Path> atom_to_path(const LV2_Atom* atom); - Resource::Graph atom_to_context(const LV2_Atom* atom); - - void get_props(const LV2_Atom_Object* obj, - Ingen::Properties& props); - - URIMap& _map; - URIs& _uris; - Log& _log; - Interface& _iface; -}; - -} // namespace Ingen - -#endif // INGEN_ATOMREADER_HPP diff --git a/ingen/AtomSink.hpp b/ingen/AtomSink.hpp deleted file mode 100644 index 0cfa027a..00000000 --- a/ingen/AtomSink.hpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ATOMSINK_HPP -#define INGEN_ATOMSINK_HPP - -#include <cstdint> - -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" - -namespace Ingen { - -/** A sink for LV2 Atoms. - * @ingroup IngenShared - */ -class INGEN_API AtomSink { -public: - virtual ~AtomSink() = default; - - /** Write an Atom to the sink. - * - * @param msg The atom to write. - * @param default_id The default response ID to use if no - * patch:sequenceNumber property is present on the message. - * - * @return True on success. - */ - virtual bool write(const LV2_Atom* msg, int32_t default_id=0) = 0; -}; - -} // namespace Ingen - -#endif // INGEN_ATOMSINK_HPP diff --git a/ingen/AtomWriter.hpp b/ingen/AtomWriter.hpp deleted file mode 100644 index 5e765c75..00000000 --- a/ingen/AtomWriter.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ATOMWRITER_HPP -#define INGEN_ATOMWRITER_HPP - -#include <cstdint> - -#include "ingen/AtomForgeSink.hpp" -#include "ingen/Interface.hpp" -#include "ingen/Message.hpp" -#include "ingen/Properties.hpp" -#include "ingen/Resource.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" - -namespace Raul { class Path; } - -namespace Ingen { - -class AtomSink; -class URIMap; -class URIs; - -/** An Interface that writes LV2 atoms to an AtomSink. */ -class INGEN_API AtomWriter : public Interface -{ -public: - using result_type = void; ///< For boost::apply_visitor - - AtomWriter(URIMap& map, URIs& uris, AtomSink& sink); - - URI uri() const override { return URI("ingen:/clients/atom_writer"); } - - void message(const Message& message) override; - - void operator()(const BundleBegin&); - void operator()(const BundleEnd&); - void operator()(const Connect&); - void operator()(const Copy&); - void operator()(const Del&); - void operator()(const Delta&); - void operator()(const Disconnect&); - void operator()(const DisconnectAll&); - void operator()(const Error&); - void operator()(const Get&); - void operator()(const Move&); - void operator()(const Put&); - void operator()(const Redo&); - void operator()(const Response&); - void operator()(const SetProperty&); - void operator()(const Undo&); - -private: - void forge_uri(const URI& uri); - void forge_properties(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 finish_msg(); - - URIMap& _map; - URIs& _uris; - AtomSink& _sink; - AtomForgeSink _out; - LV2_Atom_Forge _forge; -}; - -} // namespace Ingen - -#endif // INGEN_ATOMWRITER_HPP diff --git a/ingen/ClashAvoider.hpp b/ingen/ClashAvoider.hpp deleted file mode 100644 index 069c8fef..00000000 --- a/ingen/ClashAvoider.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLASHAVOIDER_HPP -#define INGEN_CLASHAVOIDER_HPP - -#include <map> - -#include "ingen/ingen.h" -#include "raul/Path.hpp" - -namespace Ingen { - -class Store; -class URI; - -/** Maps paths so they do not clash with an existing object in a store. - * - * @ingroup ingen - */ -class INGEN_API ClashAvoider -{ -public: - explicit ClashAvoider(const Store& store); - - const URI map_uri(const URI& in); - const Raul::Path map_path(const Raul::Path& in); - - bool exists(const Raul::Path& path) const; - -private: - typedef std::map<Raul::Path, unsigned> Offsets; - typedef std::map<Raul::Path, Raul::Path> SymbolMap; - - const Store& _store; - Offsets _offsets; - SymbolMap _symbol_map; -}; - -} // namespace Ingen - -#endif // INGEN_CLASHAVOIDER_HPP diff --git a/ingen/Clock.hpp b/ingen/Clock.hpp deleted file mode 100644 index 69d5eb17..00000000 --- a/ingen/Clock.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2016-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINE_CLOCK_HPP -#define INGEN_ENGINE_CLOCK_HPP - -#include <cstdint> - -#ifdef __MACH__ -# include <mach/mach.h> -# include <mach/mach_time.h> -#else -# include <time.h> -# include <sys/time.h> -#endif - -namespace Ingen { - -class Clock { -public: -#ifdef __MACH__ - - Clock() { mach_timebase_info(&_timebase); } - - inline uint64_t now_microseconds() const { - const uint64_t now = mach_absolute_time(); - return now * _timebase.numer / _timebase.denom / 1e3; - } - -private: - mach_timebase_info_data_t _timebase; - -#else - - inline uint64_t now_microseconds() const { - struct timespec time; -# if defined(CLOCK_MONOTONIC_RAW) - clock_gettime(CLOCK_MONOTONIC_RAW, &time); -# else - clock_gettime(CLOCK_MONOTONIC, &time); -# endif - return (uint64_t)time.tv_sec * 1e6 + (uint64_t)time.tv_nsec / 1e3; - } - -#endif -}; - -} // namespace Ingen - -#endif // INGEN_ENGINE_CLOCK_HPP diff --git a/ingen/ColorContext.hpp b/ingen/ColorContext.hpp deleted file mode 100644 index 81e0e062..00000000 --- a/ingen/ColorContext.hpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_COLORCONTEXT_HPP -#define INGEN_COLORCONTEXT_HPP - -#include <cstdio> - -namespace Ingen { - -class ColorContext { -public: - enum class Color { RED = 31, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE }; - - ColorContext(FILE* stream, Color color); - ~ColorContext(); - -private: - FILE* _stream; -}; - -} // namespace Ingen - -#endif // INGEN_COLORCONTEXT_HPP diff --git a/ingen/Configuration.hpp b/ingen/Configuration.hpp deleted file mode 100644 index 6759b4b0..00000000 --- a/ingen/Configuration.hpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CONFIGURATION_HPP -#define INGEN_CONFIGURATION_HPP - -#include <cstdlib> -#include <list> -#include <map> -#include <ostream> -#include <string> - -#include "ingen/Atom.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" -#include "raul/Exception.hpp" - -namespace Ingen { - -class FilePath; -class Forge; -class URIMap; - -/** Ingen configuration (command line options and/or configuration file). - * @ingroup IngenShared - */ -class INGEN_API Configuration { -public: - explicit Configuration(Forge& forge); - - /** The scope of a configuration option. - * - * This controls when and where an option will be saved or restored. - */ - enum Scope { - GLOBAL = 1, ///< Applies to any Ingen instance - SESSION = 1<<1, ///< Applies to this Ingen instance only - GUI = 1<<2 ///< Persistent GUI settings saved at exit - }; - - /** Add a configuration option. - * - * @param key URI local name, in camelCase - * @param name Long option name (without leading "--") - * @param letter Short option name (without leading "-") - * @param desc Description - * @param scope Scope of option - * @param type Type - * @param value Default value - */ - Configuration& add(const std::string& key, - const std::string& name, - char letter, - const std::string& desc, - Scope scope, - const LV2_URID type, - const Atom& value); - - void print_usage(const std::string& program, std::ostream& os); - - struct OptionError : public Raul::Exception { - explicit OptionError(const std::string& m) : Exception(m) {} - }; - - struct FileError : public Raul::Exception { - explicit FileError(const std::string& m) : Exception(m) {} - }; - - /** Parse a command line. - * - * @throw OptionError - */ - void parse(int argc, char **argv); - - /** Load a specific file. */ - bool load(const FilePath& path); - - /** Save configuration to a file. - * - * @param uri_map URI map. - * - * @param app Application name. - * - * @param filename If absolute, the configuration will be saved to this - * path. Otherwise the configuration will be saved to the user - * configuration directory (e.g. ~/.config/ingen/filename). - * - * @param scopes Bitwise OR of Scope values. Only options which match the - * given scopes will be saved. - * - * @return The absolute path of the saved configuration file. - */ - FilePath save(URIMap& uri_map, - const std::string& app, - const FilePath& filename, - unsigned scopes); - - /** Load files from the standard configuration directories for the app. - * - * The system configuration file(s), e.g. /etc/xdg/appname/filename, - * will be loaded before the user's, e.g. ~/.config/appname/filename, - * so the user options will override the system options. - */ - std::list<FilePath> load_default(const std::string& app, - const FilePath& filename); - - const Atom& option(const std::string& long_name) const; - bool set(const std::string& long_name, const Atom& value); - -private: - struct Option { - std::string key; - std::string name; - char letter; - std::string desc; - Scope scope; - LV2_URID type; - Atom value; - }; - - struct OptionNameOrder { - inline bool operator()(const Option& a, const Option& b) { - return a.name < b.name; - } - }; - - typedef std::map<std::string, Option> Options; - typedef std::map<char, std::string> ShortNames; - typedef std::map<std::string, std::string> Keys; - - std::string variable_string(LV2_URID type) const; - - int set_value_from_string(Configuration::Option& option, - const std::string& value); - - Forge& _forge; - const std::string _shortdesc; - const std::string _desc; - Options _options; - Keys _keys; - ShortNames _short_names; - size_t _max_name_length; -}; - -} // namespace Ingen - -#endif // INGEN_CONFIGURATION_HPP diff --git a/ingen/DataAccess.hpp b/ingen/DataAccess.hpp deleted file mode 100644 index cabb5345..00000000 --- a/ingen/DataAccess.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINE_DATAACCESS_HPP -#define INGEN_ENGINE_DATAACCESS_HPP - -#include <cstdlib> -#include <utility> - -#include "ingen/LV2Features.hpp" -#include "ingen/Node.hpp" -#include "ingen/Store.hpp" -#include "ingen/World.hpp" -#include "ingen/types.hpp" -#include "lilv/lilv.h" - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" -#include "lv2/lv2plug.in/ns/ext/data-access/data-access.h" - -namespace Ingen { - -struct DataAccess : public Ingen::LV2Features::Feature -{ - static void delete_feature(LV2_Feature* feature) { - free(feature->data); - delete feature; - } - - const char* uri() const override { return "http://lv2plug.in/ns/ext/data-access"; } - - SPtr<LV2_Feature> feature(World* world, Node* node) override { - Node* store_node = world->store()->get(node->path()); - if (!store_node) { - return SPtr<LV2_Feature>(); - } - - LilvInstance* inst = store_node->instance(); - if (!inst) { - return SPtr<LV2_Feature>(); - } - - const LV2_Descriptor* desc = lilv_instance_get_descriptor(inst); - LV2_Extension_Data_Feature* data = (LV2_Extension_Data_Feature*) - malloc(sizeof(LV2_Extension_Data_Feature)); - - data->data_access = desc->extension_data; - - return SPtr<LV2_Feature>( - new LV2_Feature{ "http://lv2plug.in/ns/ext/data-access", data }); - } -}; - -} // namespace Ingen - -#endif // INGEN_ENGINE_DATAACCESS_HPP diff --git a/ingen/EngineBase.hpp b/ingen/EngineBase.hpp deleted file mode 100644 index 00436c66..00000000 --- a/ingen/EngineBase.hpp +++ /dev/null @@ -1,145 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINEBASE_HPP -#define INGEN_ENGINEBASE_HPP - -#include <chrono> -#include <cstddef> -#include <cstdint> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" - -namespace Ingen { - -class Interface; - -/** - The audio engine which executes the graph. - - @ingroup Ingen -*/ -class INGEN_API EngineBase -{ -public: - virtual ~EngineBase() = default; - - /** - Initialise the engine for local use (e.g. without a Jack driver). - @param sample_rate Audio sampling rate in Hz. - @param block_length Audio block length (i.e. buffer size) in frames. - @param seq_size Sequence buffer size in bytes. - */ - virtual void init(double sample_rate, - uint32_t block_length, - size_t seq_size) = 0; - - /** - Return true iff the engine and driver supports dynamic ports. - - This returns false in situations where top level ports can not be - created once the driver is running, which is the case for most - environments outside Jack. - */ - virtual bool supports_dynamic_ports() const = 0; - - /** - Activate the engine. - */ - virtual bool activate() = 0; - - /** - Deactivate the engine. - */ - virtual void deactivate() = 0; - - /** - Begin listening on network sockets. - */ - virtual void listen() = 0; - - /** - Return true iff events are waiting to be processed. - */ - virtual bool pending_events() const = 0; - - /** - Flush any pending events. - - This function is only safe to call in sequential contexts, and runs both - process thread and main iterations in lock-step. - - @param sleep_ms Interval in milliseconds to sleep between each block. - */ - virtual void flush_events(const std::chrono::milliseconds& sleep_ms) = 0; - - /** - Advance audio time by the given number of frames. - */ - virtual void advance(uint32_t nframes) = 0; - - /** - Locate to a given audio position. - */ - virtual void locate(uint32_t start, uint32_t sample_count) = 0; - - /** - Process audio for `sample_count` frames. - - If the return value is non-zero, events have been processed and are - awaiting to be finalised (including responding and announcing any changes - to clients) via a call to main_iteration(). - - @return The number of events processed. - */ - virtual unsigned run(uint32_t sample_count) = 0; - - /** - Indicate that a quit is desired. - - This function simply sets a flag which affects the return value of - main_iteration, it does not actually force the engine to stop running or - block. The code driving the engine is responsible for stopping and - cleaning up when main_iteration returns false. - */ - virtual void quit() = 0; - - /** - Run a single iteration of the main context. - - The main context post-processes events and performs housekeeping duties - like collecting garbage. This should be called regularly, e.g. a few - times per second. The return value indicates whether execution should - continue; i.e. if false is returned, a quit has been requested and the - caller should cease calling main_iteration() and stop the engine. - */ - virtual bool main_iteration() = 0; - - /** - Register a client to receive updates about engine changes. - */ - virtual void register_client(SPtr<Interface> client) = 0; - - /** - Unregister a client. - */ - virtual bool unregister_client(SPtr<Interface> client) = 0; -}; - -} // namespace Ingen - -#endif // INGEN_ENGINEBASE_HPP diff --git a/ingen/FilePath.hpp b/ingen/FilePath.hpp deleted file mode 100644 index 6bdd6044..00000000 --- a/ingen/FilePath.hpp +++ /dev/null @@ -1,123 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2018 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_FILE_PATH_HPP -#define INGEN_FILE_PATH_HPP - -#include <iosfwd> -#include <type_traits> -#include <utility> - -#include <boost/utility/string_view.hpp> - -#if defined(_WIN32) && !defined(__CYGWIN__) -#define USE_WINDOWS_FILE_PATHS 1 -#endif - -namespace Ingen { - -/** A path to a file. - * - * This is a minimal subset of the std::filesystem::path interface in C++17. - * Support for Windows paths is only partial and there is no support for - * character encoding conversion at all. - */ -class FilePath -{ -public: -#ifdef USE_WINDOWS_FILE_PATHS - typedef wchar_t value_type; - static constexpr value_type preferred_separator = L'\\'; -#else - typedef char value_type; - static constexpr value_type preferred_separator = '/'; -#endif - - typedef std::basic_string<value_type> string_type; - - FilePath() = default; - FilePath(const FilePath&) = default; - FilePath(FilePath&&) = default; - - FilePath(string_type&& str) : _str(std::move(str)) {} - FilePath(const string_type& str) : _str(str) {} - FilePath(const value_type* str) : _str(str) {} - FilePath(const boost::basic_string_view<value_type>& sv) - : _str(sv.data(), sv.length()) - {} - - ~FilePath() = default; - - FilePath& operator=(const FilePath& path) = default; - FilePath& operator=(FilePath&& path) noexcept; - FilePath& operator=(string_type&& str); - - FilePath& operator/=(const FilePath& path); - - FilePath& operator+=(const FilePath& path); - FilePath& operator+=(const string_type& str); - FilePath& operator+=(const value_type* str); - FilePath& operator+=(value_type chr); - FilePath& operator+=(boost::basic_string_view<value_type> sv); - - void clear() noexcept { _str.clear(); } - - const string_type& native() const noexcept { return _str; } - const string_type& string() const noexcept { return _str; } - const value_type* c_str() const noexcept { return _str.c_str(); } - - operator string_type() const { return _str; } - - FilePath root_name() const; - FilePath root_directory() const; - FilePath root_path() const; - FilePath relative_path() const; - FilePath parent_path() const; - FilePath filename() const; - FilePath stem() const; - FilePath extension() const; - - bool empty() const noexcept { return _str.empty(); } - - bool is_absolute() const; - bool is_relative() const { return !is_absolute(); } - -private: - std::size_t find_first_sep() const; - std::size_t find_last_sep() const; - - string_type _str; -}; - -bool operator==(const FilePath& lhs, const FilePath& rhs) noexcept; -bool operator!=(const FilePath& lhs, const FilePath& rhs) noexcept; -bool operator<(const FilePath& lhs, const FilePath& rhs) noexcept; -bool operator<=(const FilePath& lhs, const FilePath& rhs) noexcept; -bool operator>(const FilePath& lhs, const FilePath& rhs) noexcept; -bool operator>=(const FilePath& lhs, const FilePath& rhs) noexcept; - -FilePath operator/(const FilePath& lhs, const FilePath& rhs); - -template <typename Char, typename Traits> -std::basic_ostream<Char, Traits>& -operator<<(std::basic_ostream<Char, Traits>& os, const FilePath& path) -{ - return os << path.string(); -} - -} // namespace Ingen - -#endif // INGEN_FILE_PATH_HPP diff --git a/ingen/Forge.hpp b/ingen/Forge.hpp deleted file mode 100644 index 32822f89..00000000 --- a/ingen/Forge.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_FORGE_HPP -#define INGEN_FORGE_HPP - -#include <cstdint> -#include <cstring> -#include <string> - -#include "ingen/Atom.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/forge.h" - -namespace Ingen { - -class URIMap; -class URI; - -/** Forge for Atoms. - * @ingroup IngenShared - */ -class INGEN_API Forge : public LV2_Atom_Forge { -public: - explicit Forge(URIMap& map); - - std::string str(const Atom& atom, bool quoted); - - bool is_uri(const Atom& atom) const { - return atom.type() == URI || atom.type() == URID; - } - - Atom make() { return Atom(); } - Atom make(int32_t v) { return Atom(sizeof(v), Int, &v); } - Atom make(float v) { return Atom(sizeof(v), Float, &v); } - Atom make(bool v) { - const int32_t iv = v ? 1 : 0; - return Atom(sizeof(int32_t), Bool, &iv); - } - - Atom make_urid(int32_t v) { return Atom(sizeof(int32_t), URID, &v); } - - Atom make_urid(const Ingen::URI& u); - - Atom alloc(uint32_t size, uint32_t type, const void* val) { - return Atom(size, type, val); - } - - Atom alloc(const char* v) { - const size_t len = strlen(v); - return Atom(len + 1, String, v); - } - - Atom alloc(const std::string& v) { - return Atom(v.length() + 1, String, v.c_str()); - } - - Atom alloc_uri(const char* v) { - const size_t len = strlen(v); - return Atom(len + 1, URI, v); - } - - Atom alloc_uri(const std::string& v) { - return Atom(v.length() + 1, URI, v.c_str()); - } - -private: - URIMap& _map; -}; - -} // namespace Ingen - -#endif // INGEN_FORGE_HPP diff --git a/ingen/InstanceAccess.hpp b/ingen/InstanceAccess.hpp deleted file mode 100644 index a93edc66..00000000 --- a/ingen/InstanceAccess.hpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINE_INSTANCEACCESS_HPP -#define INGEN_ENGINE_INSTANCEACCESS_HPP - -#include <utility> - -#include "ingen/LV2Features.hpp" -#include "ingen/Node.hpp" -#include "ingen/Store.hpp" -#include "ingen/World.hpp" -#include "ingen/types.hpp" -#include "lilv/lilv.h" - -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -namespace Ingen { - -struct InstanceAccess : public Ingen::LV2Features::Feature -{ - const char* uri() const override { return "http://lv2plug.in/ns/ext/instance-access"; } - - SPtr<LV2_Feature> feature(World* world, Node* node) override { - Node* store_node = world->store()->get(node->path()); - if (!store_node) { - return SPtr<LV2_Feature>(); - } - - LilvInstance* instance = store_node->instance(); - if (!instance) { - return SPtr<LV2_Feature>(); - } - - return SPtr<LV2_Feature>( - new LV2_Feature{ "http://lv2plug.in/ns/ext/instance-access", - lilv_instance_get_handle(instance) }); - } -}; - -} // namespace Ingen - -#endif // INGEN_ENGINE_INSTANCEACCESS_HPP diff --git a/ingen/Interface.hpp b/ingen/Interface.hpp deleted file mode 100644 index a6654afe..00000000 --- a/ingen/Interface.hpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -/** - @defgroup Ingen Core Interfaces -*/ - -#ifndef INGEN_INTERFACE_HPP -#define INGEN_INTERFACE_HPP - -#include <cstdint> -#include <string> - -#include "ingen/Message.hpp" -#include "ingen/Properties.hpp" -#include "ingen/Resource.hpp" -#include "ingen/Status.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" - -namespace Raul { -class Path; -} - -namespace Ingen { - -class Atom; -class URI; - -/** Abstract interface for Ingen servers and clients. - * - * @ingroup Ingen - */ -class INGEN_API Interface -{ -public: - using result_type = void; - - Interface() : _seq(0) {} - - virtual ~Interface() = default; - - virtual URI uri() const = 0; - - virtual SPtr<Interface> respondee() const { return SPtr<Interface>(); } - - virtual void set_respondee(SPtr<Interface> respondee) {} - - virtual void message(const Message& msg) = 0; - - /** @name Convenience API - * @{ - */ - - inline void operator()(const Message& msg) { message(msg); } - - inline void set_response_id(int32_t id) { _seq = id; } - - inline void bundle_begin() { message(BundleBegin{_seq++}); } - inline void bundle_end() { message(BundleEnd{_seq++}); } - - inline void put(const URI& uri, - const Properties& properties, - Resource::Graph ctx = Resource::Graph::DEFAULT) - { - message(Put{_seq++, uri, properties, ctx}); - } - - inline void delta(const URI& uri, - const Properties& remove, - const Properties& add, - Resource::Graph ctx = Resource::Graph::DEFAULT) - { - message(Delta{_seq++, uri, remove, add, ctx}); - } - - inline void copy(const URI& old_uri, const URI& new_uri) - { - message(Copy{_seq++, old_uri, new_uri}); - } - - inline void move(const Raul::Path& old_path, const Raul::Path& new_path) - { - message(Move{_seq++, old_path, new_path}); - } - - inline void del(const URI& uri) { message(Del{_seq++, uri}); } - - inline void connect(const Raul::Path& tail, const Raul::Path& head) - { - message(Connect{_seq++, tail, head}); - } - - inline void disconnect(const Raul::Path& tail, const Raul::Path& head) - { - message(Disconnect{_seq++, tail, head}); - } - - inline void disconnect_all(const Raul::Path& graph, const Raul::Path& path) - { - message(DisconnectAll{_seq++, graph, path}); - } - - inline void set_property(const URI& subject, - const URI& predicate, - const Atom& value, - Resource::Graph ctx = Resource::Graph::DEFAULT) - { - message(SetProperty{_seq++, subject, predicate, value, ctx}); - } - - inline void undo() { message(Undo{_seq++}); } - - inline void redo() { message(Redo{_seq++}); } - - inline void get(const URI& uri) { message(Get{_seq++, uri}); } - - inline void response(int32_t id, Status status, const std::string& subject) - { - message(Response{id, status, subject}); - } - - inline void error(const std::string& error_message) - { - message(Error{_seq++, error_message}); - } - - /** @} */ - -private: - int32_t _seq; -}; - -} // namespace Ingen - -#endif // INGEN_INTERFACE_HPP diff --git a/ingen/LV2Features.hpp b/ingen/LV2Features.hpp deleted file mode 100644 index 9995ff47..00000000 --- a/ingen/LV2Features.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_LV2FEATURES_HPP -#define INGEN_LV2FEATURES_HPP - -#include <string> -#include <utility> -#include <vector> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" -#include "raul/Noncopyable.hpp" - -namespace Ingen { - -class Node; -class World; - -/** Features for use by LV2 plugins. - * @ingroup IngenShared - */ -class INGEN_API LV2Features { -public: - LV2Features(); - - class Feature { - public: - virtual ~Feature() = default; - - virtual const char* uri() const = 0; - - virtual SPtr<LV2_Feature> feature(World* world, - Node* block) = 0; - -protected: - static void free_feature(LV2_Feature* feature); - }; - - class EmptyFeature : public Feature { - public: - explicit EmptyFeature(const char* uri) : _uri(uri) {} - - const char* uri() const override { return _uri; } - - SPtr<LV2_Feature> feature(World* world, Node* block) override { - return SPtr<LV2_Feature>(); - } - - const char* _uri; - }; - - class FeatureArray : public Raul::Noncopyable { - public: - typedef std::vector< SPtr<LV2_Feature> > FeatureVector; - - explicit FeatureArray(FeatureVector& features); - - ~FeatureArray(); - - LV2_Feature** array() { return _array; } - - private: - FeatureVector _features; - LV2_Feature** _array; - }; - - void add_feature(SPtr<Feature> feature); - bool is_supported(const std::string& uri) const; - - SPtr<FeatureArray> lv2_features(World* world, - Node* node) const; - -private: - typedef std::vector< SPtr<Feature> > Features; - Features _features; -}; - -} // namespace Ingen - -#endif // INGEN_LV2FEATURES_HPP diff --git a/ingen/Library.hpp b/ingen/Library.hpp deleted file mode 100644 index 71257900..00000000 --- a/ingen/Library.hpp +++ /dev/null @@ -1,48 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2018 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_LIBRARY_HPP -#define INGEN_LIBRARY_HPP - -#include "ingen/FilePath.hpp" -#include "ingen/ingen.h" - -namespace Ingen { - -/** A dynamically loaded library (module, plugin). */ -class INGEN_API Library { -public: - Library(const FilePath& path); - ~Library(); - - Library(const Library&) = delete; - Library& operator=(const Library&) = delete; - - using VoidFuncPtr = void (*)(void); - - VoidFuncPtr get_function(const char* const name); - - static const char* get_last_error(); - - operator bool() const { return _lib; } - -private: - void* _lib; -}; - -} // namespace Ingen - -#endif // INGEN_LIBRARY_HPP diff --git a/ingen/Log.hpp b/ingen/Log.hpp deleted file mode 100644 index 54369551..00000000 --- a/ingen/Log.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_LOG_HPP -#define INGEN_LOG_HPP - -#include <cstdarg> -#include <cstdio> -#include <functional> -#include <string> - -#include <boost/format.hpp> - -#include "ingen/LV2Features.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/log/log.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -namespace Ingen { - -typedef boost::basic_format<char> fmt; - -class Node; -class URIs; -class World; - -class INGEN_API Log { -public: - typedef std::function<int(LV2_URID, const char*, va_list)> Sink; - - Log(LV2_Log_Log* log, URIs& uris); - - struct Feature : public LV2Features::Feature { - const char* uri() const override { return LV2_LOG__log; } - - SPtr<LV2_Feature> feature(World* world, Node* block) override; - - struct Handle { - LV2_Log_Log lv2_log; - Log* log; - Node* node; - }; - }; - - void rt_error(const char* msg); - - void error(const std::string& msg); - void info(const std::string& msg); - void warn(const std::string& msg); - void trace(const std::string& msg); - - inline void error(const fmt& fmt) { error(fmt.str()); } - inline void info(const fmt& fmt) { info(fmt.str()); } - inline void warn(const fmt& fmt) { warn(fmt.str()); } - - int vtprintf(LV2_URID type, const char* fmt, va_list args); - - void set_flush(bool f) { _flush = f; } - void set_trace(bool f) { _trace = f; } - void set_sink(Sink s) { _sink = s; } - -private: - void print(FILE* stream, const std::string& msg); - - LV2_Log_Log* _log; - URIs& _uris; - Sink _sink; - bool _flush; - bool _trace; -}; - -} // namespace Ingen - -#endif // INGEN_LOG_HPP diff --git a/ingen/Message.hpp b/ingen/Message.hpp deleted file mode 100644 index 515a2e1f..00000000 --- a/ingen/Message.hpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_MESSAGE_HPP -#define INGEN_MESSAGE_HPP - -#include <cstdint> -#include <string> - -#include <boost/variant/variant.hpp> - -#include "ingen/Atom.hpp" -#include "ingen/Properties.hpp" -#include "ingen/Resource.hpp" -#include "ingen/Status.hpp" -#include "raul/Path.hpp" - -namespace Ingen { - -struct BundleBegin -{ - int32_t seq; -}; - -struct BundleEnd -{ - int32_t seq; -}; - -struct Connect -{ - int32_t seq; - Raul::Path tail; - Raul::Path head; -}; - -struct Copy -{ - int32_t seq; - URI old_uri; - URI new_uri; -}; - -struct Del -{ - int32_t seq; - URI uri; -}; - -struct Delta -{ - int32_t seq; - URI uri; - Properties remove; - Properties add; - Resource::Graph ctx; -}; - -struct Disconnect -{ - int32_t seq; - Raul::Path tail; - Raul::Path head; -}; - -struct DisconnectAll -{ - int32_t seq; - Raul::Path graph; - Raul::Path path; -}; - -struct Error -{ - int32_t seq; - std::string message; -}; - -struct Get -{ - int32_t seq; - URI subject; -}; - -struct Move -{ - int32_t seq; - Raul::Path old_path; - Raul::Path new_path; -}; - -struct Put -{ - int32_t seq; - URI uri; - Properties properties; - Resource::Graph ctx; -}; - -struct Redo -{ - int32_t seq; -}; - -struct Response -{ - int32_t id; - Status status; - std::string subject; -}; - -struct SetProperty -{ - int32_t seq; - URI subject; - URI predicate; - Atom value; - Resource::Graph ctx; -}; - -struct Undo -{ - int32_t seq; -}; - -using Message = boost::variant<BundleBegin, - BundleEnd, - Connect, - Copy, - Del, - Delta, - Disconnect, - DisconnectAll, - Error, - Get, - Move, - Put, - Redo, - Response, - SetProperty, - Undo>; - -} // namespace Ingen - -#endif // INGEN_MESSAGE_HPP diff --git a/ingen/Module.hpp b/ingen/Module.hpp deleted file mode 100644 index df47b70b..00000000 --- a/ingen/Module.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_MODULE_HPP -#define INGEN_MODULE_HPP - -#include <memory> - -#include "ingen/FilePath.hpp" -#include "ingen/Library.hpp" -#include "ingen/ingen.h" - -namespace Ingen { - -class World; - -/** A dynamically loaded Ingen module. - * - * All components of Ingen reside in one of these. - * @ingroup IngenShared - */ -class INGEN_API Module { -public: - Module() : library(nullptr) {} - virtual ~Module() = default; - - Module(const Module&) = delete; - Module& operator=(const Module&) = delete; - - virtual void load(Ingen::World* world) = 0; - virtual void run(Ingen::World* world) {} - - /** Library implementing this module. - * - * This is managed by the World and not this class, since closing the library - * in this destructor could possibly reference code from the library - * afterwards and cause a segfault on exit. - */ - std::unique_ptr<Library> library; -}; - -} // namespace Ingen - -extern "C" { - -/** Prototype for the ingen_module_load() entry point in an ingen module. */ -INGEN_API Ingen::Module* ingen_module_load(); - -} - -#endif // INGEN_MODULE_HPP diff --git a/ingen/Node.hpp b/ingen/Node.hpp deleted file mode 100644 index ca78aa3d..00000000 --- a/ingen/Node.hpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_NODE_HPP -#define INGEN_NODE_HPP - -#include <cstdint> -#include <map> -#include <string> -#include <utility> - -#include "ingen/Resource.hpp" -#include "ingen/ingen.h" -#include "ingen/paths.hpp" -#include "ingen/types.hpp" -#include "lilv/lilv.h" - -namespace Raul { -class Path; -class Symbol; -} - -namespace Ingen { - -class Arc; -class FilePath; -class Store; -class URIs; - -/** A node in the audio graph. - * - * The key property of nodes is that all nodes have a path and a symbol, as - * well as a URI. - * - * To avoid ugly inheritance issues and the need for excessive use of - * dynamic_cast, this class contains some members which are only applicable to - * certain types of node. There is a type tag which can be used to determine - * the type of any Node. - * - * @ingroup Ingen - */ -class INGEN_API Node : public Resource -{ -public: - enum class GraphType { - GRAPH, - BLOCK, - PORT - }; - - typedef std::pair<const Node*, const Node*> ArcsKey; - typedef std::map< ArcsKey, SPtr<Arc> > Arcs; - - // Graphs only - Arcs& arcs() { return _arcs; } - const Arcs& arcs() const { return _arcs; } - - // Blocks and graphs only - virtual uint32_t num_ports() const { return 0; } - virtual Node* port(uint32_t index) const { return nullptr; } - virtual const Resource* plugin() const { return nullptr; } - - // Plugin blocks only - virtual LilvInstance* instance() { return nullptr; } - virtual bool save_state(const FilePath& dir) const { return false; } - - // All objects - virtual GraphType graph_type() const = 0; - virtual const Raul::Path& path() const = 0; - virtual const Raul::Symbol& symbol() const = 0; - virtual Node* graph_parent() const = 0; - - URI base_uri() const { - if (uri().string()[uri().string().size() - 1] == '/') { - return uri(); - } - return URI(uri().string() + '/'); - } - -protected: - friend class Store; - virtual void set_path(const Raul::Path& p) = 0; - - Node(const URIs& uris, const Raul::Path& path) - : Resource(uris, path_to_uri(path)) - {} - - Arcs _arcs; ///< Graphs only -}; - -} // namespace Ingen - -#endif // INGEN_NODE_HPP diff --git a/ingen/Parser.hpp b/ingen/Parser.hpp deleted file mode 100644 index 5a361cd3..00000000 --- a/ingen/Parser.hpp +++ /dev/null @@ -1,99 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_PARSER_HPP -#define INGEN_PARSER_HPP - -#include <set> -#include <string> -#include <utility> - -#include <boost/optional/optional.hpp> - -#include "ingen/FilePath.hpp" -#include "ingen/Properties.hpp" -#include "ingen/URI.hpp" -#include "ingen/ingen.h" -#include "raul/Path.hpp" -#include "raul/Symbol.hpp" - -namespace Sord { class World; } - -namespace Ingen { - -class Interface; -class World; - -/** - Parser for reading graphs from Turtle files or strings. - - @ingroup Ingen -*/ -class INGEN_API Parser { -public: - explicit Parser() = default; - - virtual ~Parser() = default; - - /** Record of a resource listed in a bundle manifest. */ - struct ResourceRecord { - inline ResourceRecord(URI u, FilePath f) - : uri(std::move(u)), filename(std::move(f)) - {} - - inline bool operator<(const ResourceRecord& r) const { - return uri < r.uri; - } - - URI uri; ///< URI of resource (e.g. a Graph) - FilePath filename; ///< Path of describing file (seeAlso) - }; - - /** Find all resources of a given type listed in a manifest file. */ - virtual std::set<ResourceRecord> find_resources(Sord::World& world, - const URI& manifest_uri, - const URI& type_uri); - - /** Parse a graph from RDF into a Interface (engine or client). - * - * If `path` is a file path, then the graph is loaded from that - * file. If it is a directory, then the manifest.ttl from that directory - * is used instead. In either case, any rdfs:seeAlso files are loaded and - * the graph parsed from the resulting combined model. - * - * @return whether or not load was successful. - */ - virtual bool parse_file( - World* world, - Interface* target, - const FilePath& path, - boost::optional<Raul::Path> parent = boost::optional<Raul::Path>(), - boost::optional<Raul::Symbol> symbol = boost::optional<Raul::Symbol>(), - boost::optional<Properties> data = boost::optional<Properties>()); - - virtual boost::optional<URI> parse_string( - World* world, - Interface* target, - const std::string& str, - const URI& base_uri, - boost::optional<Raul::Path> parent = boost::optional<Raul::Path>(), - boost::optional<Raul::Symbol> symbol = boost::optional<Raul::Symbol>(), - boost::optional<Properties> data = boost::optional<Properties>()); -}; - -} // namespace Ingen - -#endif // INGEN_PARSER_HPP diff --git a/ingen/Properties.hpp b/ingen/Properties.hpp deleted file mode 100644 index e148c542..00000000 --- a/ingen/Properties.hpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_PROPERTIES_HPP -#define INGEN_PROPERTIES_HPP - -#include <initializer_list> -#include <map> -#include <utility> - -#include "ingen/Atom.hpp" -#include "ingen/URIs.hpp" - -namespace Ingen { - -/** A property value (an Atom with a context). */ -class Property : public Atom { -public: - enum class Graph { - DEFAULT, ///< Default context for "universal" properties - EXTERNAL, ///< Externally visible graph properties - INTERNAL ///< Internally visible graph properties - }; - - Property(const Atom& atom, Graph ctx=Graph::DEFAULT) - : Atom(atom) - , _ctx(ctx) - {} - - Property(const URIs::Quark& quark, Graph ctx=Graph::DEFAULT) - : Atom(quark.urid) - , _ctx(ctx) - {} - - Graph context() const { return _ctx; } - void set_context(Graph ctx) { _ctx = ctx; } - -private: - Graph _ctx; -}; - -class Properties : public std::multimap<URI, Property> { -public: - using Graph = Property::Graph; - - Properties() = default; - Properties(const Properties& copy) = default; - - Properties(std::initializer_list<value_type> l) - : std::multimap<URI, Property>(l) - {} - - void put(const URI& key, - const Atom& value, - Graph ctx = Graph::DEFAULT) { - emplace(key, Property(value, ctx)); - } - - void put(const URI& key, - const URIs::Quark& value, - Graph ctx = Graph::DEFAULT) { - emplace(key, Property(value, ctx)); - } - - bool contains(const URI& key, const Atom& value) { - for (const_iterator i = find(key); i != end() && i->first == key; ++i) { - if (i->second == value) { - return true; - } - } - return false; - } -}; - -} // namespace Ingen - -#endif // INGEN_PROPERTIES_HPP diff --git a/ingen/QueuedInterface.hpp b/ingen/QueuedInterface.hpp deleted file mode 100644 index bf424edd..00000000 --- a/ingen/QueuedInterface.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2018 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINE_QUEUEDINTERFACE_HPP -#define INGEN_ENGINE_QUEUEDINTERFACE_HPP - -#include <mutex> -#include <vector> - -#include "ingen/Interface.hpp" -#include "ingen/Message.hpp" - -namespace Ingen { - -/** Stores all messages and emits them to a sink on demand. - * - * This can be used to make an interface thread-safe. - */ -class QueuedInterface : public Interface -{ -public: - explicit QueuedInterface(SPtr<Interface> sink) : _sink(std::move(sink)) {} - - URI uri() const override { return URI("ingen:/QueuedInterface"); } - - void message(const Message& message) override { - std::lock_guard<std::mutex> lock(_mutex); - _messages.emplace_back(message); - } - - void emit() { - std::vector<Message> messages; - { - std::lock_guard<std::mutex> lock(_mutex); - _messages.swap(messages); - } - - for (const auto& i : messages) { - _sink->message(i); - } - } - - const SPtr<Interface>& sink() const { return _sink; } - -private: - std::mutex _mutex; - SPtr<Interface> _sink; - std::vector<Message> _messages; -}; - -} // namespace Ingen - -#endif // INGEN_ENGINE_QUEUEDINTERFACE_HPP diff --git a/ingen/Resource.hpp b/ingen/Resource.hpp deleted file mode 100644 index 9fc854c7..00000000 --- a/ingen/Resource.hpp +++ /dev/null @@ -1,205 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_RESOURCE_HPP -#define INGEN_RESOURCE_HPP - -#include <cassert> -#include <string> - -#include "ingen/Properties.hpp" -#include "ingen/URI.hpp" -#include "ingen/URIs.hpp" -#include "ingen/ingen.h" -#include "raul/Deletable.hpp" - -namespace Ingen { - -class Atom; - -/** A resource with a URI described by properties. - * - * This is the base class for most things in Ingen, including graphs, blocks, - * ports, and the engine itself. - * - * @ingroup Ingen - */ -class INGEN_API Resource : public Raul::Deletable -{ -public: - using Graph = Property::Graph; - - Resource(const URIs& uris, const URI& uri) - : _uris(uris) - , _uri(uri) - {} - - Resource& operator=(const Resource& rhs) { - assert(&rhs._uris == &_uris); - if (&rhs != this) { - _uri = rhs._uri; - _properties = rhs._properties; - } - return *this; - } - - static URI graph_to_uri(Graph g) { - switch (g) { - case Graph::EXTERNAL: return URI(INGEN_NS "externalContext"); - case Graph::INTERNAL: return URI(INGEN_NS "internalContext"); - default: return URI(INGEN_NS "defaultContext"); - } - } - - static Graph uri_to_graph(const URI& uri) { - if (uri == INGEN_NS "externalContext") { - return Graph::EXTERNAL; - } else if (uri == INGEN_NS "internalContext") { - return Graph::INTERNAL; - } - return Graph::DEFAULT; - } - - /** Get a single property value. - * - * This is only useful for properties with a single value. If the - * requested property has several values, the first will be returned. - */ - virtual const Atom& get_property(const URI& uri) const; - - /** Set (replace) a property value. - * - * This will first erase any properties with the given `uri`, so after - * this call exactly one property with predicate `uri` will be set. - */ - virtual const Atom& set_property(const URI& uri, - const Atom& value, - Graph ctx = Graph::DEFAULT); - - /** Set (replace) a property value. - * - * This will first erase any properties with the given `uri`, so after - * this call exactly one property with predicate `uri` will be set. - */ - virtual const Atom& set_property(const URI& uri, - const URIs::Quark& value, - Graph ctx = Graph::DEFAULT); - - /** Add a property value. - * - * This will not remove any existing values, so if properties with - * predicate `uri` and values other than `value` exist, this will result - * in multiple values for the property. - * - * @return True iff a new property was added. - */ - virtual bool add_property(const URI& uri, - const Atom& value, - Graph ctx = Graph::DEFAULT); - - /** Remove a property. - * - * If `value` is patch:wildcard then any property with `uri` for a - * predicate will be removed. - */ - virtual void remove_property(const URI& uri, - const Atom& value); - - /** Remove a property. - * - * If `value` is patch:wildcard then any property with `uri` for a - * predicate will be removed. - */ - virtual void remove_property(const URI& uri, - const URIs::Quark& value); - - /** Return true iff a property is set with a specific value. */ - virtual bool has_property(const URI& uri, - const Atom& value) const; - - /** Return true iff a property is set with a specific value. */ - virtual bool has_property(const URI& uri, - const URIs::Quark& value) const; - - /** Set (replace) several properties at once. - * - * This will erase all properties with keys in `p`, though multiple values - * for one property may exist in `p` will all be set (unlike simply - * calling set_property in a loop which would only set one value). - */ - void set_properties(const Properties& props); - - /** Add several properties at once. */ - void add_properties(const Properties& props); - - /** Remove several properties at once. - * - * This removes all matching properties (both key and value), or all - * properties with a matching key if the value in `p` is patch:wildcard. - */ - void remove_properties(const Properties& props); - - /** Hook called whenever a property is added. - * - * This can be used by derived classes to implement special behaviour for - * particular properties (e.g. ingen:value for ports). - */ - virtual void on_property(const URI& uri, const Atom& value) {} - - /** Hook called whenever a property value is removed. - * - * If all values for a key are removed, then value will be the wildcard. - * - * This can be used by derived classes to implement special behaviour for - * particular properties (e.g. ingen:value for ports). - */ - virtual void on_property_removed(const URI& uri, const Atom& value) {} - - /** Get the ingen type from a set of Properties. - * - * If some coherent ingen type is found, true is returned and the appropriate - * output parameter set to true. Otherwise false is returned. - */ - static bool type(const URIs& uris, - const Properties& properties, - bool& graph, - bool& block, - bool& port, - bool& is_output); - - virtual void set_uri(const URI& uri) { _uri = uri; } - - /** Get all the properties with a given context. */ - Properties properties(Resource::Graph ctx) const; - - const URIs& uris() const { return _uris; } - const URI& uri() const { return _uri; } - const Properties& properties() const { return _properties; } - Properties& properties() { return _properties; } - -protected: - const Atom& set_property(const URI& uri, const Atom& value) const; - - const URIs& _uris; - -private: - URI _uri; - mutable Properties _properties; -}; - -} // namespace Ingen - -#endif // INGEN_RESOURCE_HPP diff --git a/ingen/Serialiser.hpp b/ingen/Serialiser.hpp deleted file mode 100644 index fcfb40a7..00000000 --- a/ingen/Serialiser.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_SERIALISER_HPP -#define INGEN_SERIALISER_HPP - -#include <stdexcept> -#include <string> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "sord/sordmm.hpp" - -namespace Raul { class Path; } - -namespace Ingen { - -class Arc; -class Node; -class URI; -class World; - -/** - Serialiser for writing graphs to Turtle files or strings. - - @ingroup Ingen -*/ -class INGEN_API Serialiser -{ -public: - explicit Serialiser(World& world); - virtual ~Serialiser(); - - /** Write a graph and all its contents as a complete bundle. */ - virtual void write_bundle(SPtr<const Node> graph, - const URI& uri); - - /** Begin a serialization to a string. - * - * This must be called before any serializing methods. - * - * The results of the serialization will be returned by the finish() method after - * the desired objects have been serialised. - * - * All serialized paths will have the root path chopped from their prefix - * (therefore all serialized paths must be descendants of the root) - */ - virtual void start_to_string(const Raul::Path& root, - const URI& base_uri); - - /** Begin a serialization to a file. - * - * This must be called before any serializing methods. - * - * All serialized paths will have the root path chopped from their prefix - * (therefore all serialized paths must be descendants of the root) - */ - virtual void start_to_file(const Raul::Path& root, - const std::string& filename); - - /** Serialize an object (graph, block, or port). - * - * @throw std::logic_error - */ - virtual void serialise(SPtr<const Node> object); - - /** Serialize an arc. - * - * @throw std::logic_error - */ - virtual void serialise_arc(const Sord::Node& parent, - SPtr<const Arc> arc); - - /** Finish serialization. - * - * If this is a file serialization, this must be called to finish and close - * the output file, and the empty string is returned. - * - * If this is a string serialization, the serialized result is returned. - */ - virtual std::string finish(); - -private: - struct Impl; - Impl* me; -}; - -} // namespace Ingen - -#endif // INGEN_SERIALISER_HPP diff --git a/ingen/SocketReader.hpp b/ingen/SocketReader.hpp deleted file mode 100644 index 37ec8567..00000000 --- a/ingen/SocketReader.hpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_SOCKET_READER_HPP -#define INGEN_SOCKET_READER_HPP - -#include <thread> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "serd/serd.h" -#include "sord/sord.h" - -namespace Raul { class Socket; } - -namespace Ingen { - -class Interface; -class World; - -/** Calls Interface methods based on Turtle messages received via socket. */ -class INGEN_API SocketReader -{ -public: - SocketReader(World& world, - Interface& iface, - SPtr<Raul::Socket> sock); - - virtual ~SocketReader(); - -protected: - virtual void on_hangup() {} - -private: - void run(); - - static SerdStatus set_base_uri(SocketReader* iface, - const SerdNode* uri_node); - - static SerdStatus set_prefix(SocketReader* iface, - const SerdNode* name, - const SerdNode* uri_node); - - static SerdStatus write_statement(SocketReader* iface, - SerdStatementFlags flags, - const SerdNode* graph, - const SerdNode* subject, - const SerdNode* predicate, - const SerdNode* object, - const SerdNode* object_datatype, - const SerdNode* object_lang); - - World& _world; - Interface& _iface; - SerdEnv* _env; - SordInserter* _inserter; - SordNode* _msg_node; - SPtr<Raul::Socket> _socket; - bool _exit_flag; - std::thread _thread; -}; - -} // namespace Ingen - -#endif // INGEN_SOCKET_READER_HPP diff --git a/ingen/SocketWriter.hpp b/ingen/SocketWriter.hpp deleted file mode 100644 index 1dcc077b..00000000 --- a/ingen/SocketWriter.hpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2012-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_SOCKET_WRITER_HPP -#define INGEN_SOCKET_WRITER_HPP - -#include <cstddef> -#include <cstdint> - -#include "ingen/TurtleWriter.hpp" -#include "ingen/ingen.h" - -namespace Raul { -class Socket; -} - -namespace Ingen { - -class URI; -class URIMap; -class URIs; - -/** An Interface that writes Turtle messages to a socket. - */ -class INGEN_API SocketWriter : public TurtleWriter -{ -public: - SocketWriter(URIMap& map, - URIs& uris, - const URI& uri, - SPtr<Raul::Socket> sock); - - size_t text_sink(const void* buf, size_t len) override; - - /** Override of bundle_end to terminate bundles in the stream. */ - void bundle_end(); - -protected: - SPtr<Raul::Socket> _socket; -}; - -} // namespace Ingen - -#endif // INGEN_SOCKET_WRITER_HPP diff --git a/ingen/Status.hpp b/ingen/Status.hpp deleted file mode 100644 index c1002a17..00000000 --- a/ingen/Status.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_STATUS_HPP -#define INGEN_STATUS_HPP - -namespace Ingen { - -enum class Status { - SUCCESS, - FAILURE, - - BAD_INDEX, - BAD_OBJECT_TYPE, - BAD_REQUEST, - BAD_URI, - BAD_VALUE_TYPE, - BAD_VALUE, - CLIENT_NOT_FOUND, - CREATION_FAILED, - DIRECTION_MISMATCH, - EXISTS, - INTERNAL_ERROR, - INVALID_PARENT, - INVALID_POLY, - NOT_DELETABLE, - NOT_FOUND, - NOT_MOVABLE, - NOT_PREPARED, - NO_SPACE, - PARENT_DIFFERS, - PARENT_NOT_FOUND, - PROTOTYPE_NOT_FOUND, - PORT_NOT_FOUND, - TYPE_MISMATCH, - UNKNOWN_TYPE, - COMPILATION_FAILED -}; - -static inline const char* -ingen_status_string(Status st) -{ - switch (st) { - case Status::SUCCESS: return "Success"; - case Status::FAILURE: return "Failure"; - - case Status::BAD_INDEX: return "Invalid index"; - case Status::BAD_OBJECT_TYPE: return "Invalid object type"; - case Status::BAD_REQUEST: return "Invalid request"; - case Status::BAD_URI: return "Invalid URI"; - case Status::BAD_VALUE_TYPE: return "Invalid value type"; - case Status::BAD_VALUE: return "Invalid value"; - case Status::CLIENT_NOT_FOUND: return "Client not found"; - case Status::CREATION_FAILED: return "Creation failed"; - case Status::DIRECTION_MISMATCH: return "Direction mismatch"; - case Status::EXISTS: return "Object exists"; - case Status::INTERNAL_ERROR: return "Internal error"; - case Status::INVALID_PARENT: return "Invalid parent"; - case Status::INVALID_POLY: return "Invalid polyphony"; - case Status::NOT_DELETABLE: return "Object not deletable"; - case Status::NOT_FOUND: return "Object not found"; - case Status::NOT_MOVABLE: return "Object not movable"; - case Status::NOT_PREPARED: return "Not prepared"; - case Status::NO_SPACE: return "Insufficient space"; - case Status::PARENT_DIFFERS: return "Parent differs"; - case Status::PARENT_NOT_FOUND: return "Parent not found"; - case Status::PROTOTYPE_NOT_FOUND: return "Prototype not found"; - case Status::PORT_NOT_FOUND: return "Port not found"; - case Status::TYPE_MISMATCH: return "Type mismatch"; - case Status::UNKNOWN_TYPE: return "Unknown type"; - case Status::COMPILATION_FAILED: return "Graph compilation failed"; - } - - return "Unknown error"; -} - -} // namespace Ingen - -#endif // INGEN_STATUS_HPP diff --git a/ingen/Store.hpp b/ingen/Store.hpp deleted file mode 100644 index 52c9012b..00000000 --- a/ingen/Store.hpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_STORE_HPP -#define INGEN_STORE_HPP - -#include <cstddef> -#include <map> -#include <mutex> -#include <utility> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "raul/Deletable.hpp" -#include "raul/Noncopyable.hpp" -#include "raul/Path.hpp" - -namespace Raul { class Symbol; } - -namespace Ingen { - -class Node; - -/** Store of objects in the graph hierarchy. - * @ingroup IngenShared - */ -class INGEN_API Store : public Raul::Noncopyable - , public Raul::Deletable - , public std::map< const Raul::Path, SPtr<Node> > { -public: - void add(Node* o); - - Node* get(const Raul::Path& path) { - const iterator i = find(path); - return (i == end()) ? nullptr : i->second.get(); - } - - typedef std::pair<const_iterator, const_iterator> const_range; - - typedef std::map< Raul::Path, SPtr<Node> > Objects; - - iterator find_descendants_end(Store::iterator parent); - const_iterator find_descendants_end(Store::const_iterator parent) const; - - const_range children_range(SPtr<const Node> o) const; - - /** Remove the object at `top` and all its children from the store. - * - * @param top Iterator to first (topmost parent) object to remove. - * - * @param removed Filled with all the removed objects. Note this may be - * many objects since any children will be removed as well. - */ - void remove(iterator top, Objects& removed); - - /** Rename (move) the object at `top` to `new_path`. - * - * Note this invalidates `i`. - */ - void rename(iterator top, const Raul::Path& new_path); - - unsigned child_name_offset(const Raul::Path& parent, - const Raul::Symbol& symbol, - bool allow_zero=true) const; - - typedef std::recursive_mutex Mutex; - - Mutex& mutex() { return _mutex; } - -private: - Mutex _mutex; -}; - -} // namespace Ingen - -#endif // INGEN_STORE_HPP diff --git a/ingen/StreamWriter.hpp b/ingen/StreamWriter.hpp deleted file mode 100644 index 66a03216..00000000 --- a/ingen/StreamWriter.hpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2012-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_STREAMWRITER_HPP -#define INGEN_STREAMWRITER_HPP - -#include <cstdio> - -#include "ingen/ingen.h" -#include "ingen/ColorContext.hpp" -#include "ingen/TurtleWriter.hpp" - -namespace Ingen { - -class URI; -class URIMap; -class URIs; - -/** An Interface that writes Turtle messages to a stream. - */ -class INGEN_API StreamWriter : public TurtleWriter -{ -public: - StreamWriter(URIMap& map, - URIs& uris, - const URI& uri, - FILE* stream, - ColorContext::Color color); - - size_t text_sink(const void* buf, size_t len) override; - -protected: - FILE* _stream; - ColorContext::Color _color; -}; - -} // namespace Ingen - -#endif // INGEN_STREAMWRITER_HPP diff --git a/ingen/Tee.hpp b/ingen/Tee.hpp deleted file mode 100644 index 2a6f00df..00000000 --- a/ingen/Tee.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_ENGINE_TEE_HPP -#define INGEN_ENGINE_TEE_HPP - -#include <cstddef> -#include <mutex> -#include <set> -#include <utility> - -#include "ingen/Interface.hpp" -#include "ingen/Message.hpp" -#include "ingen/types.hpp" - -namespace Ingen { - -/** Interface that forwards all calls to several sinks. */ -class Tee : public Interface -{ -public: - typedef std::set< SPtr<Interface> > Sinks; - - explicit Tee(Sinks sinks) : _sinks(std::move(sinks)) {} - - SPtr<Interface> respondee() const override { - return (*_sinks.begin())->respondee(); - } - - void set_respondee(SPtr<Interface> respondee) override { - (*_sinks.begin())->set_respondee(respondee); - } - - void message(const Message& message) override { - std::lock_guard<std::mutex> lock(_sinks_mutex); - for (const auto& s : _sinks) { - s->message(message); - } - } - - URI uri() const override { return URI("ingen:/tee"); } - -private: - std::mutex _sinks_mutex; - Sinks _sinks; -}; - -} // namespace Ingen - -#endif // INGEN_ENGINE_TEE_HPP diff --git a/ingen/TurtleWriter.hpp b/ingen/TurtleWriter.hpp deleted file mode 100644 index 8cf7ceb8..00000000 --- a/ingen/TurtleWriter.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2012-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_TURTLE_WRITER_HPP -#define INGEN_TURTLE_WRITER_HPP - -#include <cstddef> -#include <cstdint> - -#include "ingen/AtomSink.hpp" -#include "ingen/AtomWriter.hpp" -#include "ingen/ingen.h" -#include "lv2/lv2plug.in/ns/ext/atom/atom.h" -#include "serd/serd.h" -#include "sratom/sratom.h" - -namespace Ingen { - -class URIMap; -class URIs; - -/** An Interface that writes Turtle messages to a sink method. - * - * Derived classes must implement text_sink() to do something with the - * serialized messages. - */ -class INGEN_API TurtleWriter : public AtomWriter, public AtomSink -{ -public: - TurtleWriter(URIMap& map, URIs& uris, const URI& uri); - - ~TurtleWriter() override; - - /** AtomSink method which receives calls serialized to LV2 atoms. */ - bool write(const LV2_Atom* msg, int32_t default_id=0) override; - - /** Pure virtual text sink which receives calls serialized to Turtle. */ - virtual size_t text_sink(const void* buf, size_t len) = 0; - - URI uri() const override { return _uri; } - -protected: - URIMap& _map; - Sratom* _sratom; - SerdNode _base; - SerdURI _base_uri; - SerdEnv* _env; - SerdWriter* _writer; - URI _uri; - bool _wrote_prefixes; -}; - -} // namespace Ingen - -#endif // INGEN_TURTLE_WRITER_HPP diff --git a/ingen/URI.hpp b/ingen/URI.hpp deleted file mode 100644 index 3c6d38d1..00000000 --- a/ingen/URI.hpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2018 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_URI_HPP -#define INGEN_URI_HPP - -#include <iosfwd> -#include <string> - -#include <boost/utility/string_view.hpp> - -#include "ingen/FilePath.hpp" -#include "ingen/ingen.h" -#include "serd/serd.h" -#include "sord/sordmm.hpp" - -namespace Ingen { - -class INGEN_API URI -{ -public: - using Chunk = boost::string_view; - - URI(); - explicit URI(const std::string& str); - explicit URI(const char* str); - URI(const std::string& str, const URI& base); - URI(const Sord::Node& node); - URI(SerdNode node); - explicit URI(const FilePath& path); - - URI(const URI& uri); - URI& operator=(const URI& uri); - - URI(URI&& uri); - URI& operator=(URI&& uri); - - ~URI(); - - URI make_relative(const URI& base) const; - - bool empty() const { return !_node.buf; } - - std::string string() const { return std::string(c_str(), _node.n_bytes); } - size_t length() const { return _node.n_bytes; } - const char* c_str() const { return (const char*)_node.buf; } - - FilePath file_path() const { - return scheme() == "file" ? FilePath(path()) : FilePath(); - } - - operator std::string() const { return string(); } - - const char* begin() const { return (const char*)_node.buf; } - const char* end() const { return (const char*)_node.buf + _node.n_bytes; } - - Chunk scheme() const { return make_chunk(_uri.scheme); } - Chunk authority() const { return make_chunk(_uri.authority); } - Chunk path() const { return make_chunk(_uri.path); } - Chunk query() const { return make_chunk(_uri.query); } - Chunk fragment() const { return make_chunk(_uri.fragment); } - - static bool is_valid(const char* str) { - return serd_uri_string_has_scheme((const uint8_t*)str); - } - - static bool is_valid(const std::string& str) - { - return is_valid(str.c_str()); - } - -private: - URI(SerdNode node, SerdURI uri); - - static Chunk make_chunk(const SerdChunk& chunk) { - return Chunk((const char*)chunk.buf, chunk.len); - } - - SerdNode _node; - SerdURI _uri; -}; - -inline bool operator==(const URI& lhs, const URI& rhs) -{ - return lhs.string() == rhs.string(); -} - -inline bool operator==(const URI& lhs, const std::string& rhs) -{ - return lhs.string() == rhs; -} - -inline bool operator==(const URI& lhs, const char* rhs) -{ - return lhs.string() == rhs; -} - -inline bool operator==(const URI& lhs, const Sord::Node& rhs) -{ - return rhs.type() == Sord::Node::URI && lhs.string() == rhs.to_string(); -} - -inline bool operator==(const Sord::Node& lhs, const URI& rhs) -{ - return rhs == lhs; -} - -inline bool operator!=(const URI& lhs, const URI& rhs) -{ - return lhs.string() != rhs.string(); -} - -inline bool operator!=(const URI& lhs, const std::string& rhs) -{ - return lhs.string() != rhs; -} - -inline bool operator!=(const URI& lhs, const char* rhs) -{ - return lhs.string() != rhs; -} - -inline bool operator!=(const URI& lhs, const Sord::Node& rhs) -{ - return !(lhs == rhs); -} - -inline bool operator!=(const Sord::Node& lhs, const URI& rhs) -{ - return !(lhs == rhs); -} - -inline bool operator<(const URI& lhs, const URI& rhs) -{ - return lhs.string() < rhs.string(); -} - -template <typename Char, typename Traits> -inline std::basic_ostream<Char, Traits>& -operator<<(std::basic_ostream<Char, Traits>& os, const URI& uri) -{ - return os << uri.string(); -} - -} // namespace Ingen - -#endif // INGEN_URI_HPP diff --git a/ingen/URIMap.hpp b/ingen/URIMap.hpp deleted file mode 100644 index 90c5f0ac..00000000 --- a/ingen/URIMap.hpp +++ /dev/null @@ -1,100 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_URIMAP_HPP -#define INGEN_URIMAP_HPP - -#include <cstdint> -#include <mutex> -#include <string> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "ingen/LV2Features.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" -#include "raul/Noncopyable.hpp" - -namespace Ingen { - -class Log; -class Node; -class World; - -/** URI to integer map and implementation of LV2 URID extension. - * @ingroup IngenShared - */ -class INGEN_API URIMap : public Raul::Noncopyable { -public: - URIMap(Log& log, LV2_URID_Map* map, LV2_URID_Unmap* unmap); - - uint32_t map_uri(const char* uri); - uint32_t map_uri(const std::string& uri) { return map_uri(uri.c_str()); } - const char* unmap_uri(uint32_t urid) const; - - class Feature : public LV2Features::Feature { - public: - Feature(const char* URI, void* data) { - _feature.URI = URI; - _feature.data = data; - } - - const char* uri() const override { return _feature.URI; } - - SPtr<LV2_Feature> feature(World*, Node*) override { - return SPtr<LV2_Feature>(&_feature, NullDeleter<LV2_Feature>); - } - - private: - LV2_Feature _feature; - }; - - struct URIDMapFeature : public Feature { - URIDMapFeature(URIMap* map, LV2_URID_Map* impl, Log& log); - LV2_URID map(const char* uri); - static LV2_URID default_map(LV2_URID_Map_Handle h, const char* c_uri); - LV2_URID_Map urid_map; - Log& log; - }; - - struct URIDUnmapFeature : public Feature { - URIDUnmapFeature(URIMap* map, LV2_URID_Unmap* impl); - const char* unmap(const LV2_URID urid); - static const char* default_unmap(LV2_URID_Map_Handle h, LV2_URID urid); - LV2_URID_Unmap urid_unmap; - }; - - SPtr<URIDMapFeature> urid_map_feature() { return _urid_map_feature; } - SPtr<URIDUnmapFeature> urid_unmap_feature() { return _urid_unmap_feature; } - -private: - friend struct URIDMapFeature; - friend struct URIDUnMapFeature; - - SPtr<URIDMapFeature> _urid_map_feature; - SPtr<URIDUnmapFeature> _urid_unmap_feature; - - std::mutex _mutex; - std::unordered_map<std::string, LV2_URID> _map; - std::vector<std::string> _unmap; -}; - -} // namespace Ingen - -#endif // INGEN_URIMAP_HPP diff --git a/ingen/URIs.hpp b/ingen/URIs.hpp deleted file mode 100644 index 71c14d14..00000000 --- a/ingen/URIs.hpp +++ /dev/null @@ -1,234 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_URIS_HPP -#define INGEN_URIS_HPP - -#include "ingen/Atom.hpp" -#include "ingen/URI.hpp" -#include "ingen/ingen.h" -#include "lilv/lilv.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" -#include "raul/Noncopyable.hpp" - -namespace Ingen { - -class Forge; -class URIMap; - -/** Frequently used interned URIs. - * - * This class initially maps all the special URIs used throughout the code - * using the URIMap so they can be used quickly with the performance of - * integers, but still be dynamic. - * - * @ingroup ingen - */ -class INGEN_API URIs : public Raul::Noncopyable { -public: - URIs(Ingen::Forge& forge, URIMap* map, LilvWorld* lworld); - - struct Quark : public URI { - Quark(Ingen::Forge& forge, - URIMap* map, - LilvWorld* lworld, - const char* str); - - Quark(const Quark& copy); - - ~Quark(); - - operator LV2_URID() const { return urid.get<LV2_URID>(); } - explicit operator Atom() const { return urid; } - operator const LilvNode*() const { return lnode; } - - Atom urid; - Atom uri; - LilvNode* lnode; - }; - - Ingen::Forge& forge; - - const Quark atom_AtomPort; - const Quark atom_Bool; - const Quark atom_Chunk; - const Quark atom_Float; - const Quark atom_Int; - const Quark atom_Object; - const Quark atom_Path; - const Quark atom_Sequence; - const Quark atom_Sound; - const Quark atom_String; - const Quark atom_URI; - const Quark atom_URID; - const Quark atom_bufferType; - const Quark atom_eventTransfer; - const Quark atom_supports; - const Quark bufsz_maxBlockLength; - const Quark bufsz_minBlockLength; - const Quark bufsz_sequenceSize; - const Quark doap_name; - const Quark ingen_Arc; - const Quark ingen_Block; - const Quark ingen_BundleEnd; - const Quark ingen_BundleStart; - const Quark ingen_Graph; - const Quark ingen_GraphPrototype; - const Quark ingen_Internal; - const Quark ingen_Redo; - const Quark ingen_Undo; - const Quark ingen_activity; - const Quark ingen_arc; - const Quark ingen_block; - const Quark ingen_broadcast; - const Quark ingen_canvasX; - const Quark ingen_canvasY; - const Quark ingen_enabled; - const Quark ingen_externalContext; - const Quark ingen_file; - const Quark ingen_head; - const Quark ingen_incidentTo; - const Quark ingen_internalContext; - const Quark ingen_loadedBundle; - const Quark ingen_maxRunLoad; - const Quark ingen_meanRunLoad; - const Quark ingen_minRunLoad; - const Quark ingen_numThreads; - const Quark ingen_polyphonic; - const Quark ingen_polyphony; - const Quark ingen_prototype; - const Quark ingen_sprungLayout; - const Quark ingen_tail; - const Quark ingen_uiEmbedded; - const Quark ingen_value; - const Quark log_Error; - const Quark log_Note; - const Quark log_Trace; - const Quark log_Warning; - const Quark lv2_AudioPort; - const Quark lv2_CVPort; - const Quark lv2_ControlPort; - const Quark lv2_InputPort; - const Quark lv2_OutputPort; - const Quark lv2_Plugin; - const Quark lv2_appliesTo; - const Quark lv2_binary; - const Quark lv2_connectionOptional; - const Quark lv2_control; - const Quark lv2_default; - const Quark lv2_designation; - const Quark lv2_enumeration; - const Quark lv2_extensionData; - const Quark lv2_index; - const Quark lv2_integer; - const Quark lv2_maximum; - const Quark lv2_microVersion; - const Quark lv2_minimum; - const Quark lv2_minorVersion; - const Quark lv2_name; - const Quark lv2_port; - const Quark lv2_portProperty; - const Quark lv2_prototype; - const Quark lv2_sampleRate; - const Quark lv2_scalePoint; - const Quark lv2_symbol; - const Quark lv2_toggled; - const Quark midi_Bender; - const Quark midi_ChannelPressure; - const Quark midi_Controller; - const Quark midi_MidiEvent; - const Quark midi_NoteOn; - const Quark midi_binding; - const Quark midi_controllerNumber; - const Quark midi_noteNumber; - const Quark morph_AutoMorphPort; - const Quark morph_MorphPort; - const Quark morph_currentType; - const Quark morph_supportsType; - const Quark opt_interface; - const Quark param_sampleRate; - const Quark patch_Copy; - const Quark patch_Delete; - const Quark patch_Get; - const Quark patch_Message; - const Quark patch_Move; - const Quark patch_Patch; - const Quark patch_Put; - const Quark patch_Response; - const Quark patch_Set; - const Quark patch_add; - const Quark patch_body; - const Quark patch_context; - const Quark patch_destination; - const Quark patch_property; - const Quark patch_remove; - const Quark patch_sequenceNumber; - const Quark patch_subject; - const Quark patch_value; - const Quark patch_wildcard; - const Quark pprops_logarithmic; - const Quark pset_Preset; - const Quark pset_preset; - const Quark rdf_type; - const Quark rdfs_Class; - const Quark rdfs_label; - const Quark rdfs_seeAlso; - const Quark rsz_minimumSize; - const Quark state_loadDefaultState; - const Quark state_state; - const Quark time_Position; - const Quark time_bar; - const Quark time_barBeat; - const Quark time_beatUnit; - const Quark time_beatsPerBar; - const Quark time_beatsPerMinute; - const Quark time_frame; - const Quark time_speed; - const Quark work_schedule; -}; - -inline bool -operator==(const URIs::Quark& lhs, const Atom& rhs) -{ - if (rhs.type() == lhs.urid.type()) { - return rhs == lhs.urid; - } else if (rhs.type() == lhs.uri.type()) { - return rhs == lhs.uri; - } - return false; -} - -inline bool -operator==(const Atom& lhs, const URIs::Quark& rhs) -{ - return rhs == lhs; -} - -inline bool -operator!=(const Atom& lhs, const URIs::Quark& rhs) -{ - return !(lhs == rhs); -} - -inline bool -operator!=(const URIs::Quark& lhs, const Atom& rhs) -{ - return !(lhs == rhs); -} - -} // namespace Ingen - -#endif // INGEN_URIS_HPP diff --git a/ingen/World.hpp b/ingen/World.hpp deleted file mode 100644 index 13bd7001..00000000 --- a/ingen/World.hpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_WORLD_HPP -#define INGEN_WORLD_HPP - -#include <mutex> -#include <string> - -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lv2/lv2plug.in/ns/ext/log/log.h" -#include "lv2/lv2plug.in/ns/ext/urid/urid.h" -#include "raul/Noncopyable.hpp" - -typedef struct LilvWorldImpl LilvWorld; - -namespace Sord { class World; } - -namespace Ingen { - -class Configuration; -class EngineBase; -class Forge; -class Interface; -class LV2Features; -class Log; -class Parser; -class Serialiser; -class Store; -class URI; -class URIMap; -class URIs; - -/** The "world" all Ingen modules share. - * - * This is the root to which all components of Ingen are connected. It - * contains all necessary shared data (including the world for libraries like - * Sord and Lilv) and holds references to components. - * - * Some functionality in Ingen is implemented in dynamically loaded modules, - * which are loaded using this interface. When loaded, those modules add - * facilities to the World which can then be used throughout the code. - * - * The world is used in any process which uses the Ingen as a library, both - * client and server (e.g. the world may not actually contain an Engine, since - * it maybe running in another process or even on a different machine). - * - * @ingroup IngenShared - */ -class INGEN_API World : public Raul::Noncopyable { -public: - /** Construct a new Ingen world. - * @param map LV2 URID map implementation, or NULL to use internal. - * @param unmap LV2 URID unmap implementation, or NULL to use internal. - * @param log LV2 log implementation, or NULL to use internal. - */ - World(LV2_URID_Map* map, LV2_URID_Unmap* unmap, LV2_Log_Log* log); - - virtual ~World(); - - /** Load configuration from files and command line. - * @param argc Argument count (as in C main()) - * @param argv Argument vector (as in C main()) - */ - virtual void load_configuration(int& argc, char**& argv); - - /** Load an Ingen module by name (e.g. "server", "gui", etc.) - * @return True on success. - */ - virtual bool load_module(const char* name); - - /** Run a loaded module (modules that "run" only, e.g. gui). - * @return True on success. - */ - virtual bool run_module(const char* name); - - /** A function to create a new remote Interface. */ - typedef SPtr<Interface> (*InterfaceFactory)(World* world, - const URI& engine_uri, - SPtr<Interface> respondee); - - /** Register an InterfaceFactory (for module implementations). */ - virtual void add_interface_factory(const std::string& scheme, - InterfaceFactory factory); - - /** Return a new Interface to control a server. - * @param engine_uri The URI of the possibly remote server to control. - * @param respondee The Interface that will receive responses to commands - * and broadcasts, if applicable. - */ - virtual SPtr<Interface> new_interface(const URI& engine_uri, - SPtr<Interface> respondee); - - /** Run a script. */ - virtual bool run(const std::string& mime_type, - const std::string& filename); - - virtual void set_engine(SPtr<EngineBase> e); - virtual void set_interface(SPtr<Interface> i); - virtual void set_store(SPtr<Store> s); - - virtual SPtr<EngineBase> engine(); - virtual SPtr<Interface> interface(); - virtual SPtr<Parser> parser(); - virtual SPtr<Serialiser> serialiser(); - virtual SPtr<Store> store(); - - virtual int& argc(); - virtual char**& argv(); - virtual Configuration& conf(); - - /** Lock for rdf_world() or lilv_world(). */ - virtual std::mutex& rdf_mutex(); - - virtual Sord::World* rdf_world(); - virtual LilvWorld* lilv_world(); - - virtual LV2Features& lv2_features(); - virtual Ingen::Forge& forge(); - virtual URIMap& uri_map(); - virtual URIs& uris(); - - virtual void set_jack_uuid(const std::string& uuid); - virtual std::string jack_uuid(); - - virtual Log& log(); - -private: - class Impl; - - Impl* _impl; -}; - -} // namespace Ingen - -#endif // INGEN_WORLD_HPP diff --git a/ingen/client/ArcModel.hpp b/ingen/client/ArcModel.hpp deleted file mode 100644 index 8b129a00..00000000 --- a/ingen/client/ArcModel.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_ARCMODEL_HPP -#define INGEN_CLIENT_ARCMODEL_HPP - -#include <cassert> - -#include "ingen/types.hpp" -#include "raul/Path.hpp" - -#include "ingen/Arc.hpp" -#include "ingen/client/PortModel.hpp" -#include "ingen/ingen.h" - -namespace Ingen { -namespace Client { - -class ClientStore; - -/** Class to represent a port->port connections in the engine. - * - * @ingroup IngenClient - */ -class INGEN_API ArcModel : public Arc -{ -public: - SPtr<PortModel> tail() const { return _tail; } - SPtr<PortModel> head() const { return _head; } - - const Raul::Path& tail_path() const { return _tail->path(); } - const Raul::Path& head_path() const { return _head->path(); } - -private: - friend class ClientStore; - - ArcModel(SPtr<PortModel> tail, SPtr<PortModel> head) - : _tail(std::move(tail)) - , _head(std::move(head)) - { - assert(_tail); - assert(_head); - assert(_tail->parent()); - assert(_head->parent()); - assert(_tail->path() != _head->path()); - } - - const SPtr<PortModel> _tail; - const SPtr<PortModel> _head; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_ARCMODEL_HPP diff --git a/ingen/client/BlockModel.hpp b/ingen/client/BlockModel.hpp deleted file mode 100644 index 38e8987e..00000000 --- a/ingen/client/BlockModel.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_BLOCKMODEL_HPP -#define INGEN_CLIENT_BLOCKMODEL_HPP - -#include <cstdlib> -#include <string> -#include <vector> - -#include "ingen/Node.hpp" -#include "ingen/client/ObjectModel.hpp" -#include "ingen/client/PluginModel.hpp" -#include "ingen/client/PortModel.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" - -namespace Raul { class Path; } - -namespace Ingen { - -class URIs; - -namespace Client { - -class PluginModel; -class ClientStore; - -/** Block model class, used by the client to store engine's state. - * - * @ingroup IngenClient - */ -class INGEN_API BlockModel : public ObjectModel -{ -public: - BlockModel(const BlockModel& copy); - virtual ~BlockModel(); - - GraphType graph_type() const { return Node::GraphType::BLOCK; } - - typedef std::vector< SPtr<const PortModel> > Ports; - - SPtr<const PortModel> get_port(const Raul::Symbol& symbol) const; - SPtr<const PortModel> get_port(uint32_t index) const; - - Node* port(uint32_t index) const; - - const URI& plugin_uri() const { return _plugin_uri; } - const Resource* plugin() const { return _plugin.get(); } - Resource* plugin() { return _plugin.get(); } - SPtr<PluginModel> plugin_model() const { return _plugin; } - uint32_t num_ports() const { return _ports.size(); } - const Ports& ports() const { return _ports; } - - void default_port_value_range(SPtr<const PortModel> port, - float& min, - float& max, - uint32_t srate = 1) const; - - void port_value_range(SPtr<const PortModel> port, - float& min, - float& max, - uint32_t srate = 1) const; - - std::string label() const; - std::string port_label(SPtr<const PortModel> port) const; - - // Signals - INGEN_SIGNAL(new_port, void, SPtr<const PortModel>); - INGEN_SIGNAL(removed_port, void, SPtr<const PortModel>); - -protected: - friend class ClientStore; - - BlockModel(URIs& uris, - const URI& plugin_uri, - const Raul::Path& path); - BlockModel(URIs& uris, - SPtr<PluginModel> plugin, - const Raul::Path& path); - explicit BlockModel(const Raul::Path& path); - - void add_child(SPtr<ObjectModel> c); - bool remove_child(SPtr<ObjectModel> c); - void add_port(SPtr<PortModel> pm); - void remove_port(SPtr<PortModel> port); - void remove_port(const Raul::Path& port_path); - void set(SPtr<ObjectModel> model); - - virtual void clear(); - - Ports _ports; ///< Vector of ports - URI _plugin_uri; ///< Plugin URI (if PluginModel is unknown) - SPtr<PluginModel> _plugin; ///< The plugin this block is an instance of - -private: - mutable uint32_t _num_values; ///< Size of _min_values and _max_values - mutable float* _min_values; ///< Port min values (cached for LV2) - mutable float* _max_values; ///< Port max values (cached for LV2) -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_BLOCKMODEL_HPP diff --git a/ingen/client/ClientStore.hpp b/ingen/client/ClientStore.hpp deleted file mode 100644 index 797052ef..00000000 --- a/ingen/client/ClientStore.hpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_CLIENTSTORE_HPP -#define INGEN_CLIENT_CLIENTSTORE_HPP - -#include <cassert> -#include <list> -#include <string> - -#include "ingen/Interface.hpp" -#include "ingen/Store.hpp" -#include "ingen/client/signal.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "raul/Path.hpp" - -namespace Raul { class Atom; } - -namespace Ingen { - -class Log; -class Node; -class URIs; - -namespace Client { - -class BlockModel; -class GraphModel; -class ObjectModel; -class PluginModel; -class PortModel; -class SigClientInterface; - -/** Automatically manages models of objects in the engine. - * - * @ingroup IngenClient - */ -class INGEN_API ClientStore : public Store - , public Interface - , public INGEN_TRACKABLE { -public: - ClientStore( - URIs& uris, - Log& log, - SPtr<SigClientInterface> emitter = SPtr<SigClientInterface>()); - - URI uri() const override { return URI("ingen:/clients/store"); } - - SPtr<const ObjectModel> object(const Raul::Path& path) const; - SPtr<const PluginModel> plugin(const URI& uri) const; - SPtr<const Resource> resource(const URI& uri) const; - - void clear(); - - typedef std::map< const URI, SPtr<PluginModel> > Plugins; - SPtr<const Plugins> plugins() const { return _plugins; } - SPtr<Plugins> plugins() { return _plugins; } - void set_plugins(SPtr<Plugins> p) { _plugins = p; } - - URIs& uris() { return _uris; } - - void message(const Message& msg) override; - - void operator()(const BundleBegin&) {} - void operator()(const BundleEnd&) {} - void operator()(const Connect&); - void operator()(const Copy&); - void operator()(const Del&); - void operator()(const Delta&); - void operator()(const Disconnect&); - void operator()(const DisconnectAll&); - void operator()(const Error&) {} - void operator()(const Get&) {} - void operator()(const Move&); - void operator()(const Put&); - void operator()(const Redo&) {} - void operator()(const Response&) {} - void operator()(const SetProperty&); - void operator()(const Undo&) {} - - INGEN_SIGNAL(new_object, void, SPtr<ObjectModel>); - INGEN_SIGNAL(new_plugin, void, SPtr<PluginModel>); - INGEN_SIGNAL(plugin_deleted, void, URI); - -private: - SPtr<ObjectModel> _object(const Raul::Path& path); - SPtr<PluginModel> _plugin(const URI& uri); - SPtr<PluginModel> _plugin(const Atom& uri); - SPtr<Resource> _resource(const URI& uri); - - void add_object(SPtr<ObjectModel> object); - SPtr<ObjectModel> remove_object(const Raul::Path& path); - - void add_plugin(SPtr<PluginModel> pm); - - SPtr<GraphModel> connection_graph(const Raul::Path& tail_path, - const Raul::Path& head_path); - - // Slots for SigClientInterface signals - bool attempt_connection(const Raul::Path& tail_path, - const Raul::Path& head_path); - - URIs& _uris; - Log& _log; - SPtr<SigClientInterface> _emitter; - - SPtr<Plugins> _plugins; ///< Map, keyed by plugin URI -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_CLIENTSTORE_HPP diff --git a/ingen/client/GraphModel.hpp b/ingen/client/GraphModel.hpp deleted file mode 100644 index ef072d87..00000000 --- a/ingen/client/GraphModel.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_GRAPHMODEL_HPP -#define INGEN_CLIENT_GRAPHMODEL_HPP - -#include "ingen/client/BlockModel.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" - -namespace Ingen { -namespace Client { - -class ArcModel; -class ClientStore; - -/** Client's model of a graph. - * - * @ingroup IngenClient - */ -class INGEN_API GraphModel : public BlockModel -{ -public: - /* WARNING: Copy constructor creates a shallow copy WRT connections */ - - GraphType graph_type() const { return Node::GraphType::GRAPH; } - - SPtr<ArcModel> get_arc(const Ingen::Node* tail, - const Ingen::Node* head); - - bool enabled() const; - bool polyphonic() const; - uint32_t internal_poly() const; - - // Signals - INGEN_SIGNAL(new_block, void, SPtr<BlockModel>); - INGEN_SIGNAL(removed_block, void, SPtr<BlockModel>); - INGEN_SIGNAL(new_arc, void, SPtr<ArcModel>); - INGEN_SIGNAL(removed_arc, void, SPtr<ArcModel>); - -private: - friend class ClientStore; - - GraphModel(URIs& uris, const Raul::Path& graph_path) - : BlockModel(uris, uris.ingen_Graph, graph_path) - {} - - void clear(); - void add_child(SPtr<ObjectModel> c); - bool remove_child(SPtr<ObjectModel> o); - void remove_arcs_on(SPtr<PortModel> p); - - void add_arc(SPtr<ArcModel> arc); - void remove_arc(const Ingen::Node* tail, - const Ingen::Node* head); -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_GRAPHMODEL_HPP diff --git a/ingen/client/ObjectModel.hpp b/ingen/client/ObjectModel.hpp deleted file mode 100644 index a5a68f1e..00000000 --- a/ingen/client/ObjectModel.hpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -/** - @defgroup IngenClient Client-Side Models and Utilities -*/ - -#ifndef INGEN_CLIENT_OBJECTMODEL_HPP -#define INGEN_CLIENT_OBJECTMODEL_HPP - -#include <algorithm> -#include <cassert> -#include <cstdlib> - -#include "ingen/types.hpp" -#include "raul/Path.hpp" - -#include "ingen/Node.hpp" -#include "ingen/Resource.hpp" -#include "ingen/client/signal.hpp" -#include "ingen/ingen.h" - -namespace Ingen { - -class URIs; - -namespace Client { - -class ClientStore; - -/** Base class for all Node models (BlockModel, GraphModel, PortModel). - * - * There are no non-const public methods intentionally, models are not allowed - * to be manipulated directly by anything (but the Store) because of the - * asynchronous nature of engine control. To change something, use the - * controller (which the model probably shouldn't have a reference to but oh - * well, it reduces Collection Hell) and wait for the result (as a signal - * from this Model). - * - * @ingroup IngenClient - */ -class INGEN_API ObjectModel : public Node -{ -public: - bool is_a(const URIs::Quark& type) const; - - const Atom& get_property(const URI& key) const; - - void on_property(const URI& uri, const Atom& value); - void on_property_removed(const URI& uri, const Atom& value); - - const Raul::Path& path() const { return _path; } - const Raul::Symbol& symbol() const { return _symbol; } - SPtr<ObjectModel> parent() const { return _parent; } - bool polyphonic() const; - - Node* graph_parent() const { return _parent.get(); } - - // Signals - INGEN_SIGNAL(new_child, void, SPtr<ObjectModel>); - INGEN_SIGNAL(removed_child, void, SPtr<ObjectModel>); - INGEN_SIGNAL(property, void, const URI&, const Atom&); - INGEN_SIGNAL(property_removed, void, const URI&, const Atom&); - INGEN_SIGNAL(destroyed, void); - INGEN_SIGNAL(moved, void); - -protected: - friend class ClientStore; - - ObjectModel(URIs& uris, const Raul::Path& path); - ObjectModel(const ObjectModel& copy); - - virtual void set_path(const Raul::Path& p); - virtual void set_parent(SPtr<ObjectModel> p); - virtual void add_child(SPtr<ObjectModel> c) {} - virtual bool remove_child(SPtr<ObjectModel> c) { return true; } - - virtual void set(SPtr<ObjectModel> o); - - SPtr<ObjectModel> _parent; - -private: - Raul::Path _path; - Raul::Symbol _symbol; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_OBJECTMODEL_HPP diff --git a/ingen/client/PluginModel.hpp b/ingen/client/PluginModel.hpp deleted file mode 100644 index 61de0f1a..00000000 --- a/ingen/client/PluginModel.hpp +++ /dev/null @@ -1,128 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_PLUGINMODEL_HPP -#define INGEN_CLIENT_PLUGINMODEL_HPP - -#include <list> -#include <map> -#include <string> -#include <utility> - -#include "ingen/Forge.hpp" -#include "ingen/Resource.hpp" -#include "ingen/World.hpp" -#include "ingen/client/signal.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lilv/lilv.h" -#include "raul/Symbol.hpp" -#include "sord/sordmm.hpp" - -namespace Ingen { - -class URIs; - -namespace Client { - -class GraphModel; -class BlockModel; -class PluginUI; - -/** Model for a plugin available for loading. - * - * @ingroup IngenClient - */ -class INGEN_API PluginModel : public Ingen::Resource -{ -public: - PluginModel(URIs& uris, - const URI& uri, - const Atom& type, - const Ingen::Properties& properties); - - const Atom& type() const { return _type; } - - const URI type_uri() const - { - return URI(_type.is_valid() ? _uris.forge.str(_type, false) - : "http://www.w3.org/2002/07/owl#Nothing"); - } - - virtual const Atom& get_property(const URI& key) const; - - Raul::Symbol default_block_symbol() const; - std::string human_name() const; - std::string port_human_name(uint32_t i) const; - - typedef std::map<float, std::string> ScalePoints; - ScalePoints port_scale_points(uint32_t i) const; - - typedef std::map<URI, std::string> Presets; - const Presets& presets() const { return _presets; } - - static LilvWorld* lilv_world() { return _lilv_world; } - const LilvPlugin* lilv_plugin() const { return _lilv_plugin; } - - const LilvPort* lilv_port(uint32_t index) const; - - static void set_lilv_world(LilvWorld* world); - - bool has_ui() const; - - SPtr<PluginUI> ui(Ingen::World* world, - SPtr<const BlockModel> block) const; - - std::string documentation(bool html) const; - std::string port_documentation(uint32_t index, bool html) const; - - static void set_rdf_world(Sord::World& world) { - _rdf_world = &world; - } - - static Sord::World* rdf_world() { return _rdf_world; } - - // Signals - INGEN_SIGNAL(changed, void); - INGEN_SIGNAL(property, void, const URI&, const Atom&); - INGEN_SIGNAL(preset, void, const URI&, const std::string&); - - bool fetched() const { return _fetched; } - void set_fetched(bool f) { _fetched = f; } - -protected: - friend class ClientStore; - void set(SPtr<PluginModel> p); - - void add_preset(const URI& uri, const std::string& label); - -private: - std::string get_documentation(const LilvNode* subject, bool html) const; - - static Sord::World* _rdf_world; - static LilvWorld* _lilv_world; - static const LilvPlugins* _lilv_plugins; - - Atom _type; - const LilvPlugin* _lilv_plugin; - Presets _presets; - bool _fetched; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_PLUGINMODEL_HPP diff --git a/ingen/client/PluginUI.hpp b/ingen/client/PluginUI.hpp deleted file mode 100644 index a98df61d..00000000 --- a/ingen/client/PluginUI.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_PLUGINUI_HPP -#define INGEN_CLIENT_PLUGINUI_HPP - -#include <set> - -#include "ingen/LV2Features.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lilv/lilv.h" -#include "suil/suil.h" - -namespace Ingen { - -class Interface; -class World; - -namespace Client { - -class BlockModel; - -/** Custom user interface for a plugin. - * - * @ingroup IngenClient - */ -class INGEN_API PluginUI { -public: - ~PluginUI(); - - /** Create a UI for the given block and plugin. - * - * This does not actually instantiate the UI itself, so signals can be - * connected first. The caller should connect to signal_property_changed, - * then call instantiate(). - */ - static SPtr<PluginUI> create(Ingen::World* world, - SPtr<const BlockModel> block, - const LilvPlugin* plugin); - - /** Instantiate the UI. - * - * If true is returned, instantiation was successfull and the widget can be - * obtained with get_widget(). Otherwise, instantiation failed, so there is - * no widget and the UI can not be used. - */ - bool instantiate(); - bool instantiated () { return _instance != nullptr; } - - SuilWidget get_widget(); - - void port_event(uint32_t port_index, - uint32_t buffer_size, - uint32_t format, - const void* buffer); - - bool is_resizable() const; - - /** Signal emitted when the UI sets a property. - * - * The application must connect to this signal to communicate with the - * engine and/or update itself as necessary. - */ - INGEN_SIGNAL(property_changed, void, - const URI&, // Subject - const URI&, // Predicate - const Atom&, // Object - Resource::Graph); // Context - - Ingen::World* world() const { return _world; } - SPtr<const BlockModel> block() const { return _block; } - -private: - PluginUI(Ingen::World* world, - SPtr<const BlockModel> block, - LilvUIs* uis, - const LilvUI* ui, - const LilvNode* ui_type); - - Ingen::World* _world; - SPtr<const BlockModel> _block; - SuilInstance* _instance; - LilvUIs* _uis; - const LilvUI* _ui; - LilvNode* _ui_node; - LilvNode* _ui_type; - std::set<uint32_t> _subscribed_ports; - - static SuilHost* ui_host; - - SPtr<LV2Features::FeatureArray> _features; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_PLUGINUI_HPP diff --git a/ingen/client/PortModel.hpp b/ingen/client/PortModel.hpp deleted file mode 100644 index 9ad37378..00000000 --- a/ingen/client/PortModel.hpp +++ /dev/null @@ -1,97 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_PORTMODEL_HPP -#define INGEN_CLIENT_PORTMODEL_HPP - -#include <cstdlib> -#include <string> - -#include "ingen/client/ObjectModel.hpp" -#include "ingen/ingen.h" -#include "ingen/types.hpp" -#include "lv2/lv2plug.in/ns/ext/port-props/port-props.h" -#include "lv2/lv2plug.in/ns/lv2core/lv2.h" - -namespace Raul { class Path; } - -namespace Ingen { -namespace Client { - -/** Model of a port. - * - * @ingroup IngenClient - */ -class INGEN_API PortModel : public ObjectModel -{ -public: - enum class Direction { INPUT, OUTPUT }; - - GraphType graph_type() const { return Node::GraphType::PORT; } - - bool supports(const URIs::Quark& value_type) const; - - inline uint32_t index() const { return _index; } - inline const Atom& value() const { return get_property(_uris.ingen_value); } - inline bool is_input() const { return (_direction == Direction::INPUT); } - inline bool is_output() const { return (_direction == Direction::OUTPUT); } - - bool port_property(const URIs::Quark& uri) const; - - bool is_logarithmic() const { return port_property(_uris.pprops_logarithmic); } - bool is_enumeration() const { return port_property(_uris.lv2_enumeration); } - bool is_integer() const { return port_property(_uris.lv2_integer); } - bool is_toggle() const { return port_property(_uris.lv2_toggled); } - bool is_numeric() const { - return ObjectModel::is_a(_uris.lv2_ControlPort) - || ObjectModel::is_a(_uris.lv2_CVPort); - } - bool is_uri() const; - - inline bool operator==(const PortModel& pm) const { return (path() == pm.path()); } - - void on_property(const URI& uri, const Atom& value); - - // Signals - INGEN_SIGNAL(value_changed, void, const Atom&); - INGEN_SIGNAL(voice_changed, void, uint32_t, const Atom&); - INGEN_SIGNAL(activity, void, const Atom&); - -private: - friend class ClientStore; - - PortModel(URIs& uris, - const Raul::Path& path, - uint32_t index, - Direction dir) - : ObjectModel(uris, path) - , _index(index) - , _direction(dir) - {} - - void add_child(SPtr<ObjectModel> c) { throw; } - bool remove_child(SPtr<ObjectModel> c) { throw; } - - void set(SPtr<ObjectModel> model); - - uint32_t _index; - Direction _direction; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_PORTMODEL_HPP diff --git a/ingen/client/SigClientInterface.hpp b/ingen/client/SigClientInterface.hpp deleted file mode 100644 index 8ac8dca4..00000000 --- a/ingen/client/SigClientInterface.hpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2016 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_SIGCLIENTINTERFACE_HPP -#define INGEN_CLIENT_SIGCLIENTINTERFACE_HPP - -#include <cstdint> -#include <string> - -#include "raul/Path.hpp" - -#include "ingen/Interface.hpp" -#include "ingen/client/signal.hpp" -#include "ingen/ingen.h" - -namespace Ingen { -namespace Client { - -/** A LibSigC++ signal emitting interface for clients to use. - * - * This simply emits a signal for every event that comes from the engine. - * For a higher level model based view of the engine, use ClientStore. - * - * The signals here match the calls to ClientInterface exactly. See the - * documentation for ClientInterface for meanings of signal parameters. - * - * @ingroup IngenClient - */ -class INGEN_API SigClientInterface : public Ingen::Interface, - public INGEN_TRACKABLE -{ -public: - SigClientInterface() {} - - URI uri() const override { return URI("ingen:/clients/sig"); } - - INGEN_SIGNAL(message, void, Message) - - /** Fire pending signals. Only does anything on derived classes (that may queue) */ - virtual bool emit_signals() { return false; } - -protected: - void message(const Message& msg) override { - _signal_message(msg); - } -}; - -} // namespace Client -} // namespace Ingen - -#endif diff --git a/ingen/client/SocketClient.hpp b/ingen/client/SocketClient.hpp deleted file mode 100644 index 8236200b..00000000 --- a/ingen/client/SocketClient.hpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2012-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_SOCKET_CLIENT_HPP -#define INGEN_CLIENT_SOCKET_CLIENT_HPP - -#include "ingen/SocketReader.hpp" -#include "ingen/SocketWriter.hpp" -#include "ingen/ingen.h" -#include "raul/Socket.hpp" - -namespace Ingen { -namespace Client { - -/** The client side of an Ingen socket connection. */ -class INGEN_API SocketClient : public SocketWriter -{ -public: - SocketClient(World& world, - const URI& uri, - SPtr<Raul::Socket> sock, - SPtr<Interface> respondee) - : SocketWriter(world.uri_map(), world.uris(), uri, sock) - , _respondee(respondee) - , _reader(world, *respondee.get(), sock) - {} - - SPtr<Interface> respondee() const override { - return _respondee; - } - - void set_respondee(SPtr<Interface> respondee) override { - _respondee = respondee; - } - - static SPtr<Ingen::Interface> - new_socket_interface(Ingen::World* world, - const URI& uri, - SPtr<Ingen::Interface> respondee) - { - const Raul::Socket::Type type = (uri.scheme() == "unix" - ? Raul::Socket::Type::UNIX - : Raul::Socket::Type::TCP); - - SPtr<Raul::Socket> sock(new Raul::Socket(type)); - if (!sock->connect(uri)) { - world->log().error(fmt("Failed to connect <%1%> (%2%)\n") - % sock->uri() % strerror(errno)); - return SPtr<Interface>(); - } - return SPtr<Interface>(new SocketClient(*world, uri, sock, respondee)); - } - - static void register_factories(World* world) { - world->add_interface_factory("unix", &new_socket_interface); - world->add_interface_factory("tcp", &new_socket_interface); - } - -private: - SPtr<Interface> _respondee; - SocketReader _reader; -}; - -} // namespace Client -} // namespace Ingen - -#endif // INGEN_CLIENT_SOCKET_CLIENT_HPP diff --git a/ingen/client/signal.hpp b/ingen/client/signal.hpp deleted file mode 100644 index ba5b017b..00000000 --- a/ingen/client/signal.hpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_CLIENT_SIGNAL_HPP -#define INGEN_CLIENT_SIGNAL_HPP - -#include <sigc++/sigc++.h> - -#define INGEN_SIGNAL(name, ...) \ -protected: \ -sigc::signal<__VA_ARGS__> _signal_##name; \ -public: \ -sigc::signal<__VA_ARGS__> signal_##name() const { return _signal_##name; } \ -sigc::signal<__VA_ARGS__>& signal_##name() { return _signal_##name; } - -#define INGEN_TRACKABLE sigc::trackable - -#endif // INGEN_CLIENT_SIGNAL_HPP diff --git a/ingen/filesystem.hpp b/ingen/filesystem.hpp deleted file mode 100644 index 5c7d7568..00000000 --- a/ingen/filesystem.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_FILESYSTEM_HPP -#define INGEN_FILESYSTEM_HPP - -#define _BSD_SOURCE 1 -#define _DEFAULT_SOURCE 1 - -#include <cerrno> -#include <climits> -#include <cstdlib> -#include <memory> -#include <vector> - -#include <sys/stat.h> -#include <sys/types.h> - -#ifdef _WIN32 -# include <windows.h> -# include <io.h> -# define F_OK 0 -# define mkdir(path, flags) _mkdir(path) -#endif - -#include "ingen/FilePath.hpp" - -/* A minimal subset of the std::filesystem API from C++17. */ - -namespace Ingen { -namespace filesystem { - -inline bool exists(const FilePath& path) -{ - return !access(path.c_str(), F_OK); -} - -inline bool is_directory(const FilePath& path) -{ - struct stat info; - stat(path.c_str(), &info); - return S_ISDIR(info.st_mode); -} - -inline bool create_directories(const FilePath& path) -{ - std::vector<FilePath> paths; - for (FilePath p = path; p != path.root_directory(); p = p.parent_path()) { - paths.emplace_back(p); - } - - for (auto p = paths.rbegin(); p != paths.rend(); ++p) { - if (mkdir(p->c_str(), 0755) && errno != EEXIST) { - return false; - } - } - - return true; -} - -inline FilePath current_path() -{ - struct Freer { void operator()(char* const ptr) { free(ptr); } }; - - std::unique_ptr<char, Freer> cpath(realpath(".", NULL)); - const FilePath path(cpath.get()); - return path; -} - -} // namespace filesystem -} // namespace Ingen - -#endif // INGEN_FILESYSTEM_HPP diff --git a/ingen/ingen.h b/ingen/ingen.h deleted file mode 100644 index 05b9e7b2..00000000 --- a/ingen/ingen.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2014-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_H -#define INGEN_H - -#ifdef INGEN_SHARED -# ifdef _WIN32 -# define INGEN_LIB_IMPORT __declspec(dllimport) -# define INGEN_LIB_EXPORT __declspec(dllexport) -# else -# define INGEN_LIB_IMPORT __attribute__((visibility("default"))) -# define INGEN_LIB_EXPORT __attribute__((visibility("default"))) -# endif -# ifdef INGEN_INTERNAL -# define INGEN_API INGEN_LIB_EXPORT -# else -# define INGEN_API INGEN_LIB_IMPORT -# endif -#else -# define INGEN_API -#endif - -#define INGEN_NS "http://drobilla.net/ns/ingen#" - -#define INGEN__Arc INGEN_NS "Arc" -#define INGEN__Block INGEN_NS "Block" -#define INGEN__BundleEnd INGEN_NS "BundleEnd" -#define INGEN__BundleStart INGEN_NS "BundleStart" -#define INGEN__Graph INGEN_NS "Graph" -#define INGEN__GraphPrototype INGEN_NS "GraphPrototype" -#define INGEN__Internal INGEN_NS "Internal" -#define INGEN__Node INGEN_NS "Node" -#define INGEN__Plugin INGEN_NS "Plugin" -#define INGEN__Redo INGEN_NS "Redo" -#define INGEN__Undo INGEN_NS "Undo" -#define INGEN__activity INGEN_NS "activity" -#define INGEN__arc INGEN_NS "arc" -#define INGEN__block INGEN_NS "block" -#define INGEN__broadcast INGEN_NS "broadcast" -#define INGEN__canvasX INGEN_NS "canvasX" -#define INGEN__canvasY INGEN_NS "canvasY" -#define INGEN__enabled INGEN_NS "enabled" -#define INGEN__externalContext INGEN_NS "externalContext" -#define INGEN__file INGEN_NS "file" -#define INGEN__head INGEN_NS "head" -#define INGEN__incidentTo INGEN_NS "incidentTo" -#define INGEN__internalContext INGEN_NS "internalContext" -#define INGEN__loadedBundle INGEN_NS "loadedBundle" -#define INGEN__maxRunLoad INGEN_NS "maxRunLoad" -#define INGEN__meanRunLoad INGEN_NS "meanRunLoad" -#define INGEN__minRunLoad INGEN_NS "minRunLoad" -#define INGEN__numThreads INGEN_NS "numThreads" -#define INGEN__polyphonic INGEN_NS "polyphonic" -#define INGEN__polyphony INGEN_NS "polyphony" -#define INGEN__prototype INGEN_NS "prototype" -#define INGEN__sprungLayout INGEN_NS "sprungLayout" -#define INGEN__tail INGEN_NS "tail" -#define INGEN__uiEmbedded INGEN_NS "uiEmbedded" -#define INGEN__value INGEN_NS "value" - -#endif // INGEN_H diff --git a/ingen/paths.hpp b/ingen/paths.hpp deleted file mode 100644 index e75e71e0..00000000 --- a/ingen/paths.hpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2017 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_PATHS_HPP -#define INGEN_PATHS_HPP - -#include <cstddef> -#include <string> - -#include "ingen/URI.hpp" -#include "raul/Path.hpp" - -namespace Ingen { - -inline URI main_uri() { return URI("ingen:/main"); } - -inline bool uri_is_path(const URI& uri) -{ - const size_t root_len = main_uri().string().length(); - if (uri == main_uri()) { - return true; - } else { - return uri.string().substr(0, root_len + 1) == - main_uri().string() + "/"; - } -} - -inline Raul::Path uri_to_path(const URI& uri) -{ - return (uri == main_uri()) - ? Raul::Path("/") - : Raul::Path(uri.string().substr(main_uri().string().length())); -} - -inline URI path_to_uri(const Raul::Path& path) -{ - return URI(main_uri().string() + path.c_str()); -} - -} // namespace Ingen - -#endif // INGEN_PATHS_HPP diff --git a/ingen/runtime_paths.hpp b/ingen/runtime_paths.hpp deleted file mode 100644 index 1a8bc2c2..00000000 --- a/ingen/runtime_paths.hpp +++ /dev/null @@ -1,42 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_RUNTIME_PATHS_HPP -#define INGEN_RUNTIME_PATHS_HPP - -#include <string> -#include <vector> - -#include "ingen/ingen.h" -#include "ingen/FilePath.hpp" - -namespace Ingen { - -extern const char search_path_separator; - -INGEN_API void set_bundle_path(const char* path); -INGEN_API void set_bundle_path_from_code(void* function); - -INGEN_API FilePath bundle_file_path(const std::string& name); -INGEN_API FilePath data_file_path(const std::string& name); -INGEN_API FilePath ingen_module_path(const std::string& name, FilePath dir={}); - -INGEN_API FilePath user_config_dir(); -INGEN_API std::vector<FilePath> system_config_dirs(); - -} // namespace Ingen - -#endif // INGEN_RUNTIME_PATHS_HPP diff --git a/ingen/types.hpp b/ingen/types.hpp deleted file mode 100644 index 7cd1c386..00000000 --- a/ingen/types.hpp +++ /dev/null @@ -1,62 +0,0 @@ -/* - This file is part of Ingen. - Copyright 2007-2015 David Robillard <http://drobilla.net/> - - 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 <http://www.gnu.org/licenses/>. -*/ - -#ifndef INGEN_TYPES_HPP -#define INGEN_TYPES_HPP - -#include <cstdlib> -#include <memory> - -#include "raul/Maid.hpp" - -namespace Ingen { - -template <class T> -void NullDeleter(T* ptr) {} - -template <class T> -struct FreeDeleter { void operator()(T* const ptr) { free(ptr); } }; - -template <class T, class Deleter = std::default_delete<T>> -using UPtr = std::unique_ptr<T, Deleter>; - -template <class T> -using SPtr = std::shared_ptr<T>; - -template <class T> -using WPtr = std::weak_ptr<T>; - -template <class T> -using MPtr = Raul::managed_ptr<T>; - -template<class T, class U> -SPtr<T> static_ptr_cast(const SPtr<U>& r) { - return std::static_pointer_cast<T>(r); -} - -template<class T, class U> -SPtr<T> dynamic_ptr_cast(const SPtr<U>& r) { - return std::dynamic_pointer_cast<T>(r); -} - -template<class T, class U> -SPtr<T> const_ptr_cast(const SPtr<U>& r) { - return std::const_pointer_cast<T>(r); -} - -} // namespace Ingen - -#endif // INGEN_TYPES_HPP |