From 0a4dfb16428463d10d12a821afaed866a701550d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 3 Jul 2007 04:42:41 +0000 Subject: Fix crash on MIDI controller receiving. Fixed various plugin loading related bugs. Fix strange liblo bug.. maybe.. Little bit of preliminary LV2 GUI stuff. git-svn-id: http://svn.drobilla.net/lad/ingen@561 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/PluginModel.cpp | 29 +++++++++++++++++ src/libs/client/PluginModel.h | 2 ++ src/libs/engine/MidiControlNode.cpp | 4 +-- src/libs/engine/NodeFactory.cpp | 50 ++++++++++++++--------------- src/libs/engine/OSCEngineReceiver.cpp | 6 ++++ src/libs/engine/QueuedEngineInterface.cpp | 2 +- src/libs/engine/QueuedEventSource.cpp | 3 +- src/libs/engine/events/LoadPluginsEvent.cpp | 15 ++++----- src/libs/engine/events/LoadPluginsEvent.h | 8 ++--- src/libs/gui/NodeModule.cpp | 8 +++++ 10 files changed, 86 insertions(+), 41 deletions(-) diff --git a/src/libs/client/PluginModel.cpp b/src/libs/client/PluginModel.cpp index 24b45179..c8d44837 100644 --- a/src/libs/client/PluginModel.cpp +++ b/src/libs/client/PluginModel.cpp @@ -48,6 +48,35 @@ PluginModel::default_node_name(SharedPtr parent) return name; } +#ifdef HAVE_SLV2 +void* +PluginModel::gui() +{ + assert(_type == LV2); + + SLV2Values gui = slv2_plugin_get_guis(_slv2_plugin); + if (slv2_values_size(gui) > 0) { + printf("\tGUI:\n"); + for (unsigned i=0; i < slv2_values_size(gui); ++i) { + printf("\t\t%s\n", slv2_value_as_uri(slv2_values_get_at(gui, i))); + + SLV2Value binary = slv2_plugin_get_gui_library_uri(_slv2_plugin, slv2_values_get_at(gui, i)); + + printf("\t\t\tType: %s\n", slv2_gui_type_get_uri(slv2_value_as_gui_type( + slv2_values_get_at(gui, i)))); + + if (binary) + printf("\t\t\tBinary: %s\n", slv2_value_as_uri(binary)); + + slv2_value_free(binary); + } + } + slv2_values_free(gui); + + return NULL; +} + +#endif } // namespace Client } // namespace Ingen diff --git a/src/libs/client/PluginModel.h b/src/libs/client/PluginModel.h index 16ad8c48..b7de3101 100644 --- a/src/libs/client/PluginModel.h +++ b/src/libs/client/PluginModel.h @@ -106,6 +106,8 @@ public: slv2_world_load_all(_slv2_world); _slv2_plugins = slv2_world_get_all_plugins(_slv2_world); } + + void* gui(); #endif private: diff --git a/src/libs/engine/MidiControlNode.cpp b/src/libs/engine/MidiControlNode.cpp index abe930c8..a90416e2 100644 --- a/src/libs/engine/MidiControlNode.cpp +++ b/src/libs/engine/MidiControlNode.cpp @@ -76,10 +76,10 @@ MidiControlNode::process(SampleCount nframes, FrameTime start, FrameTime end) while (midi_in->get_event(×tamp, &size, &buffer) < nframes) { - const FrameTime time = start + (FrameTime)timestamp; + //const FrameTime time = start + (FrameTime)timestamp; if (size >= 3 && (buffer[0] & 0xF0) == MIDI_CMD_CONTROL) - control(buffer[1], buffer[2], time); + control(buffer[1], buffer[2], (SampleCount)timestamp); } NodeBase::post_process(nframes, start, end); diff --git a/src/libs/engine/NodeFactory.cpp b/src/libs/engine/NodeFactory.cpp index 04d349e3..28afb67a 100644 --- a/src/libs/engine/NodeFactory.cpp +++ b/src/libs/engine/NodeFactory.cpp @@ -32,6 +32,7 @@ #ifdef HAVE_SLV2 #include "LV2Node.h" #include +#include // old slv2 compat #endif #ifdef HAVE_LADSPA #include "LADSPANode.h" @@ -271,43 +272,42 @@ NodeFactory::load_lv2_plugins() { SLV2Plugins plugins = slv2_world_get_all_plugins(_world); - //cerr << "[NodeFactory] Found " << slv2_plugins_get_length(plugins) << " LV2 plugins." << endl; - + cerr << "[NodeFactory] Found " << slv2_plugins_size(plugins) << " LV2 plugins:" << endl; + for (unsigned i=0; i < slv2_plugins_size(plugins); ++i) { - + SLV2Plugin lv2_plug = slv2_plugins_get_at(plugins, i); - - - //om_plug->library(plugin_library); - + const char* uri = (const char*)slv2_plugin_get_uri(lv2_plug); - //cerr << "LV2 plugin: " << uri << endl; + assert(uri); + cerr << "\t" << uri << endl; + + Plugin* plug = NULL; bool found = false; for (list::const_iterator i = _plugins.begin(); i != _plugins.end(); ++i) { if (!strcmp((*i)->uri().c_str(), uri)) { - cerr << "Warning: Duplicate LV2 plugin (" << uri << ").\nUsing " - << (*i)->lib_path() << " version." << endl; + plug = (*i); found = true; break; } } - if (!found) { - //printf("[NodeFactory] Found LV2 plugin %s\n", uri); - Plugin* om_plug = new Plugin(Plugin::LV2, uri); - om_plug->slv2_plugin(lv2_plug); - // FIXME FIXME FIXME temporary hack - om_plug->module(NULL); - om_plug->lib_path("FIXME/Some/path"); - om_plug->plug_label("FIXMElabel"); - char* name = slv2_plugin_get_name(lv2_plug); - om_plug->name(name); - free(name); - om_plug->type(Plugin::LV2); - _plugins.push_back(om_plug); - } + + if (!found) + plug = new Plugin(Plugin::LV2, uri); + + plug->slv2_plugin(lv2_plug); + plug->module(NULL); // FIXME? + plug->lib_path(slv2_uri_to_path(slv2_plugin_get_library_uri(lv2_plug))); + char* name = slv2_plugin_get_name(lv2_plug); + assert(name); + plug->name(name); + free(name); + + if (!found) + _plugins.push_back(plug); } - + slv2_plugins_free(_world, plugins); } diff --git a/src/libs/engine/OSCEngineReceiver.cpp b/src/libs/engine/OSCEngineReceiver.cpp index 260721d4..8b0ef103 100644 --- a/src/libs/engine/OSCEngineReceiver.cpp +++ b/src/libs/engine/OSCEngineReceiver.cpp @@ -129,6 +129,7 @@ OSCEngineReceiver::OSCEngineReceiver(Engine& engine, size_t queue_size, uint16_t OSCEngineReceiver::~OSCEngineReceiver() { deactivate(); + stop(); if (_server != NULL) { lo_server_free(_server); @@ -163,6 +164,11 @@ OSCEngineReceiver::_run() * they all get executed in the same cycle */ while (true) { + if ( ! _server) { + cout << "[OSCEngineReceiver] Server is NULL, exiting" << endl; + break; + } + assert( ! unprepared_events()); // Wait on a message and enqueue it diff --git a/src/libs/engine/QueuedEngineInterface.cpp b/src/libs/engine/QueuedEngineInterface.cpp index 8ee3851b..4641f108 100644 --- a/src/libs/engine/QueuedEngineInterface.cpp +++ b/src/libs/engine/QueuedEngineInterface.cpp @@ -92,7 +92,7 @@ QueuedEngineInterface::unregister_client(ClientKey key) void QueuedEngineInterface::load_plugins() { - push_queued(new LoadPluginsEvent(_engine, _responder, now())); + push_queued(new LoadPluginsEvent(_engine, _responder, now(), this)); } diff --git a/src/libs/engine/QueuedEventSource.cpp b/src/libs/engine/QueuedEventSource.cpp index 885e475f..19bd5880 100644 --- a/src/libs/engine/QueuedEventSource.cpp +++ b/src/libs/engine/QueuedEventSource.cpp @@ -164,7 +164,8 @@ QueuedEventSource::_whipped() { QueuedEvent* const ev = _events[_prepared_back]; - assert(ev); + if (!ev) + return; assert(!ev->is_prepared()); ev->pre_process(); diff --git a/src/libs/engine/events/LoadPluginsEvent.cpp b/src/libs/engine/events/LoadPluginsEvent.cpp index a126e3b2..b06d1817 100644 --- a/src/libs/engine/events/LoadPluginsEvent.cpp +++ b/src/libs/engine/events/LoadPluginsEvent.cpp @@ -20,6 +20,7 @@ #include "Engine.h" #include "NodeFactory.h" #include "ClientBroadcaster.h" +#include "QueuedEventSource.h" #include using std::cerr; @@ -27,9 +28,10 @@ using std::cerr; namespace Ingen { -LoadPluginsEvent::LoadPluginsEvent(Engine& engine, SharedPtr responder, SampleCount timestamp) -: QueuedEvent(engine, responder, timestamp) +LoadPluginsEvent::LoadPluginsEvent(Engine& engine, SharedPtr responder, SampleCount timestamp, QueuedEventSource* source) +: QueuedEvent(engine, responder, timestamp, true, source) { + /* Not sure why this has to be blocking, but it fixes some nasty bugs.. */ } void @@ -37,18 +39,15 @@ LoadPluginsEvent::pre_process() { _engine.node_factory()->load_plugins(); - // FIXME: send the changes (added and removed plugins) instead of the entire list each time - - // Take a copy to send in the post processing thread (to avoid problems - // because std::list isn't thread safe) - _plugins = _engine.node_factory()->plugins(); - QueuedEvent::pre_process(); } void LoadPluginsEvent::post_process() { + if (_source) + _source->unblock(); + _responder->respond_ok(); } diff --git a/src/libs/engine/events/LoadPluginsEvent.h b/src/libs/engine/events/LoadPluginsEvent.h index b6de5e5c..e56de796 100644 --- a/src/libs/engine/events/LoadPluginsEvent.h +++ b/src/libs/engine/events/LoadPluginsEvent.h @@ -33,13 +33,13 @@ class Plugin; class LoadPluginsEvent : public QueuedEvent { public: - LoadPluginsEvent(Engine& engine, SharedPtr responder, SampleCount timestamp); + LoadPluginsEvent(Engine& engine, + SharedPtr responder, + SampleCount timestamp, + QueuedEventSource* source); void pre_process(); void post_process(); - -private: - std::list _plugins; }; diff --git a/src/libs/gui/NodeModule.cpp b/src/libs/gui/NodeModule.cpp index 188e3a42..61c937a8 100644 --- a/src/libs/gui/NodeModule.cpp +++ b/src/libs/gui/NodeModule.cpp @@ -110,6 +110,14 @@ NodeModule::remove_port(SharedPtr port) void NodeModule::show_control_window() { + if (_node->plugin()->type() == PluginModel::LV2) { + GtkWidget* gui = (GtkWidget*)_node->plugin()->gui(); + if (gui) { + cerr << "GUI!\n"; + } else { + cerr << "No gui :(\n"; + } + } App::instance().window_factory()->present_controls(_node); } -- cgit v1.2.1