diff options
Diffstat (limited to 'src/client/PluginUI.cpp')
-rw-r--r-- | src/client/PluginUI.cpp | 119 |
1 files changed, 64 insertions, 55 deletions
diff --git a/src/client/PluginUI.cpp b/src/client/PluginUI.cpp index a997d716..c4aa748f 100644 --- a/src/client/PluginUI.cpp +++ b/src/client/PluginUI.cpp @@ -14,33 +14,44 @@ along with Ingen. If not, see <http://www.gnu.org/licenses/>. */ -#include "ingen/client/PluginUI.hpp" - -#include "ingen/Interface.hpp" -#include "ingen/Log.hpp" -#include "ingen/URIs.hpp" -#include "ingen/client/BlockModel.hpp" -#include "ingen/client/PortModel.hpp" -#include "lv2/atom/atom.h" -#include "lv2/ui/ui.h" +#include <ingen/client/PluginUI.hpp> + +#include <ingen/Atom.hpp> +#include <ingen/Forge.hpp> +#include <ingen/LV2Features.hpp> +#include <ingen/Log.hpp> +#include <ingen/Resource.hpp> +#include <ingen/URI.hpp> +#include <ingen/URIs.hpp> +#include <ingen/World.hpp> +#include <ingen/client/BlockModel.hpp> +#include <ingen/client/PortModel.hpp> +#include <lilv/lilv.h> +#include <lv2/atom/atom.h> +#include <lv2/core/lv2.h> +#include <lv2/ui/ui.h> +#include <raul/Symbol.hpp> +#include <suil/suil.h> + +#include <sigc++/signal.h> #include <cstring> +#include <memory> #include <string> #include <utility> -namespace ingen { -namespace client { +namespace ingen::client { SuilHost* PluginUI::ui_host = nullptr; -static SPtr<const PortModel> +static std::shared_ptr<const PortModel> get_port(PluginUI* ui, uint32_t port_index) { if (port_index >= ui->block()->ports().size()) { ui->world().log().error("%1% UI tried to access invalid port %2%\n", ui->block()->plugin()->uri().c_str(), port_index); - return SPtr<const PortModel>(); + return nullptr; } return ui->block()->ports()[port_index]; } @@ -52,9 +63,9 @@ lv2_ui_write(SuilController controller, uint32_t format, const void* buffer) { - PluginUI* const ui = (PluginUI*)controller; - const URIs& uris = ui->world().uris(); - SPtr<const PortModel> port = get_port(ui, port_index); + auto* const ui = static_cast<PluginUI*>(controller); + const URIs& uris = ui->world().uris(); + auto port = get_port(ui, port_index); if (!port) { return; } @@ -67,10 +78,10 @@ lv2_ui_write(SuilController controller, ui->block()->plugin()->uri().c_str()); return; } - const float value = *(const float*)buffer; + const float value = *static_cast<const float*>(buffer); if (port->value().type() == uris.atom_Float && value == port->value().get<float>()) { - return; // Ignore feedback + return; // Ignore feedback } ui->signal_property_changed()( @@ -79,10 +90,11 @@ lv2_ui_write(SuilController controller, ui->world().forge().make(value), Resource::Graph::DEFAULT); - } else if (format == uris.atom_eventTransfer.urid.get<LV2_URID>()) { - const LV2_Atom* atom = (const LV2_Atom*)buffer; - Atom val = ui->world().forge().alloc( - atom->size, atom->type, LV2_ATOM_BODY_CONST(atom)); + } else if (format == uris.atom_eventTransfer.urid()) { + const auto* atom = static_cast<const LV2_Atom*>(buffer); + const Atom val = + Forge::alloc(atom->size, atom->type, LV2_ATOM_BODY_CONST(atom)); + ui->signal_property_changed()(port->uri(), uris.ingen_activity, val, @@ -97,7 +109,7 @@ lv2_ui_write(SuilController controller, static uint32_t lv2_ui_port_index(SuilController controller, const char* port_symbol) { - PluginUI* const ui = (PluginUI*)controller; + auto* const ui = static_cast<PluginUI*>(controller); const BlockModel::Ports& ports = ui->block()->ports(); for (uint32_t i = 0; i < ports.size(); ++i) { @@ -114,8 +126,8 @@ lv2_ui_subscribe(SuilController controller, uint32_t protocol, const LV2_Feature* const* features) { - PluginUI* const ui = (PluginUI*)controller; - SPtr<const PortModel> port = get_port(ui, port_index); + auto* const ui = static_cast<PluginUI*>(controller); + const std::shared_ptr<const PortModel> port = get_port(ui, port_index); if (!port) { return 1; } @@ -135,8 +147,8 @@ lv2_ui_unsubscribe(SuilController controller, uint32_t protocol, const LV2_Feature* const* features) { - PluginUI* const ui = (PluginUI*)controller; - SPtr<const PortModel> port = get_port(ui, port_index); + auto* const ui = static_cast<PluginUI*>(controller); + auto port = get_port(ui, port_index); if (!port) { return 1; } @@ -150,24 +162,22 @@ lv2_ui_unsubscribe(SuilController controller, return 0; } -PluginUI::PluginUI(ingen::World& world, - SPtr<const BlockModel> block, - LilvUIs* uis, - const LilvUI* ui, - const LilvNode* ui_type) - : _world(world) - , _block(std::move(block)) - , _instance(nullptr) - , _uis(uis) - , _ui(ui) - , _ui_node(lilv_node_duplicate(lilv_ui_get_uri(ui))) - , _ui_type(lilv_node_duplicate(ui_type)) -{ -} +PluginUI::PluginUI(ingen::World& world, + std::shared_ptr<const BlockModel> block, + LilvUIs* uis, + const LilvUI* ui, + const LilvNode* ui_type) + : _world(world) + , _block(std::move(block)) + , _uis(uis) + , _ui(ui) + , _ui_node(lilv_node_duplicate(lilv_ui_get_uri(ui))) + , _ui_type(lilv_node_duplicate(ui_type)) +{} PluginUI::~PluginUI() { - for (uint32_t i : _subscribed_ports) { + for (const uint32_t i : _subscribed_ports) { lv2_ui_unsubscribe(this, i, 0, nullptr); } suil_instance_free(_instance); @@ -177,10 +187,10 @@ PluginUI::~PluginUI() lilv_world_unload_resource(_world.lilv_world(), lilv_ui_get_uri(_ui)); } -SPtr<PluginUI> -PluginUI::create(ingen::World& world, - SPtr<const BlockModel> block, - const LilvPlugin* plugin) +std::shared_ptr<PluginUI> +PluginUI::create(ingen::World& world, + const std::shared_ptr<const BlockModel>& block, + const LilvPlugin* plugin) { if (!PluginUI::ui_host) { PluginUI::ui_host = suil_host_new(lv2_ui_write, @@ -196,7 +206,7 @@ PluginUI::create(ingen::World& world, LilvUIs* uis = lilv_plugin_get_uis(plugin); const LilvUI* ui = nullptr; const LilvNode* ui_type = nullptr; - LILV_FOREACH(uis, u, uis) { + LILV_FOREACH (uis, u, uis) { const LilvUI* this_ui = lilv_uis_get(uis, u); if (lilv_ui_is_supported(this_ui, suil_ui_supported, @@ -210,11 +220,11 @@ PluginUI::create(ingen::World& world, if (!ui) { lilv_node_free(gtk_ui); - return SPtr<PluginUI>(); + return nullptr; } // Create the PluginUI, but don't instantiate yet - SPtr<PluginUI> ret(new PluginUI(world, block, uis, ui, ui_type)); + std::shared_ptr<PluginUI> ret(new PluginUI(world, block, uis, ui, ui_type)); ret->_features = world.lv2_features().lv2_features( world, const_cast<BlockModel*>(block.get())); @@ -238,7 +248,7 @@ PluginUI::instantiate() LilvNode* ui_plugin = lilv_new_uri(lworld, LV2_UI__plugin); LilvNodes* notes = lilv_world_find_nodes( lworld, lilv_ui_get_uri(_ui), ui_portNotification, nullptr); - LILV_FOREACH(nodes, n, notes) { + LILV_FOREACH (nodes, n, notes) { const LilvNode* note = lilv_nodes_get(notes, n); const LilvNode* sym = lilv_world_get(lworld, note, uris.lv2_symbol, nullptr); const LilvNode* plug = lilv_world_get(lworld, note, ui_plugin, nullptr); @@ -253,7 +263,7 @@ PluginUI::instantiate() plugin_uri, lilv_node_as_string(_ui_node)); } else if (!strcmp(lilv_node_as_uri(plug), plugin_uri.c_str())) { // Notification is valid and for this plugin - uint32_t index = lv2_ui_port_index(this, lilv_node_as_string(sym)); + const uint32_t index = lv2_ui_port_index(this, lilv_node_as_string(sym)); if (index != LV2UI_INVALID_PORT_INDEX) { lv2_ui_subscribe(this, index, 0, nullptr); _subscribed_ports.insert(index); @@ -287,7 +297,7 @@ PluginUI::instantiate() if (!_instance) { _world.log().error("Failed to instantiate LV2 UI\n"); // Cancel any subscriptions - for (uint32_t i : _subscribed_ports) { + for (const uint32_t i : _subscribed_ports) { lv2_ui_unsubscribe(this, i, 0, nullptr); } return false; @@ -299,7 +309,7 @@ PluginUI::instantiate() SuilWidget PluginUI::get_widget() { - return (SuilWidget*)suil_instance_get_widget(_instance); + return suil_instance_get_widget(_instance); } void @@ -337,5 +347,4 @@ PluginUI::is_resizable() const return !fs_matches && !nrs_matches; } -} // namespace client -} // namespace ingen +} // namespace ingen::client |