diff options
Diffstat (limited to 'src/PatchageCanvas.cpp')
-rw-r--r-- | src/PatchageCanvas.cpp | 100 |
1 files changed, 42 insertions, 58 deletions
diff --git a/src/PatchageCanvas.cpp b/src/PatchageCanvas.cpp index 3c63503..0b5103f 100644 --- a/src/PatchageCanvas.cpp +++ b/src/PatchageCanvas.cpp @@ -17,6 +17,7 @@ #include "patchage-config.h" +#include "raul/log.hpp" #include "raul/SharedPtr.hpp" #if defined(HAVE_JACK_DBUS) @@ -33,6 +34,8 @@ #include "PatchageModule.hpp" #include "PatchagePort.hpp" +using std::string; + PatchageCanvas::PatchageCanvas(Patchage* app, int width, int height) : FlowCanvas::Canvas(width, height) , _app(app) @@ -43,82 +46,55 @@ PatchageCanvas::PatchageCanvas(Patchage* app, int width, int height) boost::shared_ptr<PatchageModule> PatchageCanvas::find_module(const string& name, ModuleType type) { - for (ItemList::iterator m = _items.begin(); m != _items.end(); ++m) { - boost::shared_ptr<PatchageModule> pm = boost::dynamic_pointer_cast<PatchageModule>(*m); - if (pm && pm->name() == name && (pm->type() == type || pm->type() == InputOutput)) { - return pm; + const ModuleIndex::const_iterator i = _module_index.find(name); + if (i == _module_index.end()) + return boost::shared_ptr<PatchageModule>(); + + boost::shared_ptr<PatchageModule> io_module; + for (ModuleIndex::const_iterator j = i; j != _module_index.end() && j->first == name; ++j) { + if (j->second->type() == type) { + return j->second; + } else if (j->second->type() == InputOutput) { + io_module = j->second; } } - return boost::shared_ptr<PatchageModule>(); + // Return InputOutput module for Input or Output (or NULL if not found at all) + return io_module; } boost::shared_ptr<PatchagePort> PatchageCanvas::find_port(const PortID& id) { - string module_name; - string port_name; - -#if defined(USE_LIBJACK) - jack_port_t* jack_port = NULL; -#endif + PortIndex::iterator i = _port_index.find(id); + if (i != _port_index.end()) + return i->second; - SharedPtr<PatchageModule> module; boost::shared_ptr<PatchagePort> pp; - // TODO: filthy. keep a port map and make this O(log(n)) - switch (id.type) { -#if defined(USE_LIBJACK) && !defined(HAVE_JACK_DBUS) - case PortID::JACK_ID: - jack_port = jack_port_by_id(_app->jack_driver()->client(), id.id.jack_id); - if (!jack_port) - return boost::shared_ptr<PatchagePort>(); +#ifdef USE_LIBJACK + assert(id.type == PortID::JACK_ID); // Alsa ports are always indexed - _app->jack_driver()->port_names(id, module_name, port_name); + jack_port_t* jack_port = jack_port_by_id(_app->jack_driver()->client(), id.id.jack_id); + if (!jack_port) + return boost::shared_ptr<PatchagePort>(); - module = find_module(module_name, - (jack_port_flags(jack_port) & JackPortIsInput) ? Input : Output); + string module_name; + string port_name; + _app->jack_driver()->port_names(id, module_name, port_name); - if (module) - return PtrCast<PatchagePort>(module->get_port(port_name)); - else - return boost::shared_ptr<PatchagePort>(); + SharedPtr<PatchageModule> module = find_module(module_name, + (jack_port_flags(jack_port) & JackPortIsInput) ? Input : Output); - break; -#endif + if (module) + pp = PtrCast<PatchagePort>(module->get_port(port_name)); -#ifdef HAVE_ALSA - case PortID::ALSA_ADDR: - for (ItemList::iterator m = _items.begin(); m != _items.end(); ++m) { - SharedPtr<PatchageModule> module = PtrCast<PatchageModule>(*m); - if (!module) - continue; - - for (PortVector::const_iterator p = module->ports().begin(); p != module->ports().end(); ++p) { - pp = boost::dynamic_pointer_cast<PatchagePort>(*p); - if (!pp) - continue; - - if (pp->type() == ALSA_MIDI) { - if (pp->alsa_addr() - && pp->alsa_addr()->client == id.id.alsa_addr.client - && pp->alsa_addr()->port == id.id.alsa_addr.port) { - if ((module->type() == InputOutput) - || (id.id.is_input && (module->type() == Input)) - || (!id.id.is_input && (module->type() == Output))) { - return pp; - } - } - } - } - } -#endif // HAVE_ALSA - default: - break; - } + if (pp) + index_port(id, pp); +#endif // USE_LIBJACK - return boost::shared_ptr<PatchagePort>(); + return pp; } @@ -186,3 +162,11 @@ PatchageCanvas::status_message(const string& msg) { _app->status_msg(string("[Canvas] ").append(msg)); } + +void +PatchageCanvas::destroy() +{ + _port_index.clear(); + _module_index.clear(); + FlowCanvas::Canvas::destroy(); +} |