/* This file is part of Ingen. Copyright 2016 David Robillard Ingen is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version. Ingen is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for details. You should have received a copy of the GNU Affero General Public License along with Ingen. If not, see . */ #ifndef INGEN_ENGINE_PARAMETER_HPP #define INGEN_ENGINE_PARAMETER_HPP #include "ingen/World.hpp" namespace Ingen { namespace Server { class BlockImpl; /** A parameter (message-based control) on a Block. * * \ingroup engine */ class Parameter : public NodeImpl { public: static Atom node_to_atom(Forge& forge, const LilvNode* node) { if (lilv_node_is_float(node)) { return forge.make(lilv_node_as_float(node)); } else if (lilv_node_is_uri(node)) { return forge.make_urid(Raul::URI(lilv_node_as_uri(node))); } return Atom(); } Parameter(Ingen::World* world, const Ingen::URIs& uris, NodeImpl* parent, const Raul::URI& uri, const Raul::Symbol& symbol, const Atom& value) : NodeImpl(uris, parent, symbol) , _value(value) { set_property(uris.rdf_type, uris.ingen_Parameter); set_property(uris.lv2_symbol, uris.forge.alloc(symbol)); LilvWorld* lworld = world->lilv_world(); LilvNode* prop = lilv_new_uri(lworld, uri.c_str()); LilvNode* range = lilv_world_get(lworld, prop, uris.rdfs_range, NULL); set_property(uris.rdfs_range, node_to_atom(world->forge(), range)); LilvNode* min = lilv_world_get(lworld, prop, uris.lv2_minimum, NULL); LilvNode* max = lilv_world_get(lworld, prop, uris.lv2_maximum, NULL); LilvNode* def = lilv_world_get(lworld, prop, uris.lv2_default, NULL); set_property(uris.ingen_value, node_to_atom(world->forge(), def)); set_property(uris.lv2_minimum, node_to_atom(world->forge(), min)); set_property(uris.lv2_maximum, node_to_atom(world->forge(), max)); } virtual GraphType graph_type() const { return GraphType::PARAMETER; } /** A parameter's parent is always a block. */ BlockImpl* parent_block() const { return (BlockImpl*)_parent; } // n/a virtual bool prepare_poly(BufferFactory&, uint32_t) { return false; } virtual bool apply_poly(RunContext&, Raul::Maid&, uint32_t) { return false; } protected: Atom _value; }; } // namespace Server } // namespace Ingen #endif // INGEN_ENGINE_PARAMETER_HPP