X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin.cc;h=3b471014eb503199216d69200fb4f7d405c224c7;hb=1bd4c5b3a212460eed1773f6b049d18c89625565;hp=e9665908a3c632e998f2689f3c55b1b2cb2bc40a;hpb=9ab70fb55284537228577d575f15aa03949bd678;p=ardour.git diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc index e9665908a3..3b471014eb 100644 --- a/libs/ardour/plugin.cc +++ b/libs/ardour/plugin.cc @@ -35,12 +35,12 @@ #include #include -#include - #include #include #include #include +#include +#include #include @@ -48,6 +48,7 @@ #include using namespace ARDOUR; +using namespace PBD; Plugin::Plugin (AudioEngine& e, Session& s) : _engine (e), _session (s) @@ -60,64 +61,61 @@ Plugin::Plugin (const Plugin& other) } void -Plugin::setup_midi_controls () +Plugin::setup_controls () { - uint32_t port_cnt; - - port_cnt = parameter_count(); + uint32_t port_cnt = parameter_count(); - /* set up a vector of null pointers for the MIDI controls. + /* set up a vector of null pointers for the controls. we'll fill this in on an as-needed basis. */ for (uint32_t i = 0; i < port_cnt; ++i) { - midi_controls.push_back (0); + controls.push_back (0); } } Plugin::~Plugin () { - for (vector::iterator i = midi_controls.begin(); i != midi_controls.end(); ++i) { + for (vector::iterator i = controls.begin(); i != controls.end(); ++i) { if (*i) { delete *i; } } } -MIDI::Controllable * -Plugin::get_nth_midi_control (uint32_t n) +Controllable * +Plugin::get_nth_control (uint32_t n) { if (n >= parameter_count()) { return 0; } - if (midi_controls[n] == 0) { + if (controls[n] == 0) { Plugin::ParameterDescriptor desc; get_parameter_descriptor (n, desc); - - midi_controls[n] = new MIDIPortControl (*this, n, _session.midi_port(), desc.lower, desc.upper, desc.toggled, desc.logarithmic); + + controls[n] = new PortControllable (describe_parameter (n), *this, n, + desc.lower, desc.upper, desc.toggled, desc.logarithmic); } - return midi_controls[n]; + return controls[n]; } -Plugin::MIDIPortControl::MIDIPortControl (Plugin& p, uint32_t port_id, MIDI::Port *port, - float low, float up, bool t, bool loga) - : MIDI::Controllable (port, 0), plugin (p), absolute_port (port_id) +Plugin::PortControllable::PortControllable (string name, Plugin& p, uint32_t port_id, + float low, float up, bool t, bool loga) + : Controllable (name), plugin (p), absolute_port (port_id) { toggled = t; logarithmic = loga; lower = low; upper = up; range = upper - lower; - last_written = 0; /* XXX need a good out-of-bound-value */ - setting = false; } void -Plugin::MIDIPortControl::set_value (float value) +Plugin::PortControllable::set_value (float value) { if (toggled) { if (value > 0.5) { @@ -126,145 +124,40 @@ Plugin::MIDIPortControl::set_value (float value) value = 0.0; } } else { - value = lower + (range * value); - - if (logarithmic) { - value = exp(value); - } - } - setting = true; - plugin.set_parameter (absolute_port, value); - setting = false; -} - -void -Plugin::MIDIPortControl::send_feedback (float value) -{ - - if (!setting && get_midi_feedback()) { - MIDI::byte val; - MIDI::channel_t ch = 0; - MIDI::eventType ev = MIDI::none; - MIDI::byte additional = 0; - MIDI::EventTwoBytes data; - - if (toggled) { - val = (MIDI::byte) (value * 127.0f); + if (!logarithmic) { + value = lower + (range * value); } else { - if (logarithmic) { - value = log(value); + float _lower = 0.0f; + if (lower > 0.0f) { + _lower = log(lower); } - val = (MIDI::byte) (((value - lower) / range) * 127.0f); - } - - if (get_control_info (ch, ev, additional)) { - data.controller_number = additional; - data.value = val; - last_written = val; - - plugin.session().send_midi_message (get_port(), ev, ch, data); + value = exp(_lower + log(range) * value); } } - -} - -MIDI::byte* -Plugin::MIDIPortControl::write_feedback (MIDI::byte* buf, int32_t& bufsize, float value, bool force) -{ - if (get_midi_feedback() && bufsize > 2) { - MIDI::channel_t ch = 0; - MIDI::eventType ev = MIDI::none; - MIDI::byte additional = 0; - - if (get_control_info (ch, ev, additional)) { - - MIDI::byte val; - - if (toggled) { - - val = (MIDI::byte) (value * 127.0f); - } else { - - if (logarithmic) { - value = log(value); - } - - val = (MIDI::byte) (((value - lower) / range) * 127.0f); - } - - if (val != last_written || force) { - *buf++ = MIDI::controller & ch; - *buf++ = additional; /* controller number */ - *buf++ = val; - last_written = val; - bufsize -= 3; - } - } - } - - return buf; + plugin.set_parameter (absolute_port, value); } - -void -Plugin::reset_midi_control (MIDI::Port* port, bool on) +float +Plugin::PortControllable::get_value (void) const { - MIDI::channel_t chn; - MIDI::eventType ev; - MIDI::byte extra; - - for (vector::iterator i = midi_controls.begin(); i != midi_controls.end(); ++i) { - if (*i == 0) - continue; - (*i)->get_control_info (chn, ev, extra); - if (!on) { - chn = -1; - } - (*i)->midi_rebind (port, chn); - } -} + float val = plugin.get_parameter (absolute_port); -void -Plugin::send_all_midi_feedback () -{ - if (_session.get_midi_feedback()) { - float val = 0.0; - uint32_t n = 0; + if (toggled) { - for (vector::iterator i = midi_controls.begin(); i != midi_controls.end(); ++i, ++n) { - if (*i == 0) { - continue; - } - - val = (*i)->plugin.get_parameter (n); - (*i)->send_feedback (val); - } + return val; - } -} - -MIDI::byte* -Plugin::write_midi_feedback (MIDI::byte* buf, int32_t& bufsize) -{ - if (_session.get_midi_feedback()) { - float val = 0.0; - uint32_t n = 0; + } else { - for (vector::iterator i = midi_controls.begin(); i != midi_controls.end(); ++i, ++n) { - if (*i == 0) { - continue; - } - - val = (*i)->plugin.get_parameter (n); - buf = (*i)->write_feedback (buf, bufsize, val); + if (logarithmic) { + val = log(val); } + + return ((val - lower) / range); } - - return buf; -} +} vector Plugin::get_presets() @@ -333,13 +226,13 @@ Plugin::save_preset (string name, string domain) free(lrdf_add_preset(source.c_str(), name.c_str(), unique_id(), &defaults)); string path = string_compose("%1/.%2", envvar, domain); - if (mkdir(path.c_str(), 0775) && errno != EEXIST) { + if (g_mkdir_with_parents (path.c_str(), 0775)) { warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg; return false; } path += "/rdf"; - if (mkdir(path.c_str(), 0775) && errno != EEXIST) { + if (g_mkdir_with_parents (path.c_str(), 0775)) { warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg; return false; } @@ -351,3 +244,44 @@ Plugin::save_preset (string name, string domain) return true; } + +PluginPtr +ARDOUR::find_plugin(Session& session, string name, long unique_id, PluginType type) +{ + PluginManager *mgr = PluginManager::the_manager(); + PluginInfoList plugs; + + switch (type) { + case ARDOUR::LADSPA: + plugs = mgr->ladspa_plugin_info(); + break; + +#ifdef VST_SUPPORT + case ARDOUR::VST: + plugs = mgr->vst_plugin_info(); + unique_id = 0; // VST plugins don't have a unique id. + break; +#endif + +#ifdef HAVE_AUDIOUNITS + case ARDOUR::AudioUnit: + plugs = AUPluginInfo::discover (); + unique_id = 0; // Neither do AU. + break; +#endif + + default: + return PluginPtr ((Plugin *) 0); + } + + PluginInfoList::iterator i; + for (i = plugs.begin(); i != plugs.end(); ++i) { + if ((name == "" || (*i)->name == name) && + (unique_id == 0 || (*i)->unique_id == unique_id)) { + return (*i)->load (session); + } + } + + return PluginPtr ((Plugin*) 0); +} +