X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplugin_insert.cc;h=a8348c1df39b25d1b8888fee127e550b63d22e9d;hb=c104c9d4726f3ba1ecd352d13b88a57f2f964510;hp=0beb4c2fdb703b2b01e82fbe5562b8dcaf638dfd;hpb=0d050de94e3ae5a1a0dc36114df1995b042f3b80;p=ardour.git diff --git a/libs/ardour/plugin_insert.cc b/libs/ardour/plugin_insert.cc index 0beb4c2fdb..a8348c1df3 100644 --- a/libs/ardour/plugin_insert.cc +++ b/libs/ardour/plugin_insert.cc @@ -57,7 +57,7 @@ #include "ardour/session.h" #include "ardour/types.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -77,6 +77,7 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr plug) , _strict_io (false) , _custom_cfg (false) , _maps_from_state (false) + , _latency_changed (false) , _bypass_port (UINT32_MAX) { /* the first is the master */ @@ -85,8 +86,8 @@ PluginInsert::PluginInsert (Session& s, boost::shared_ptr plug) add_plugin (plug); create_automatable_parameters (); const ChanCount& sc (sidechain_input_pins ()); - if (sc.n_audio () > 0) { - add_sidechain (sc.n_audio ()); + if (sc.n_audio () > 0 || sc.n_midi () > 0) { + add_sidechain (sc.n_audio (), sc.n_midi ()); } } } @@ -190,14 +191,14 @@ PluginInsert::set_preset_out (const ChanCount& c) } bool -PluginInsert::add_sidechain (uint32_t n_audio) +PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi) { // caller must hold process lock if (_sidechain) { return false; } std::ostringstream n; - if (n_audio > 0) { + if (n_audio > 0 || n_midi > 0) { n << "Sidechain " << Session::next_name_id (); } else { n << "TO BE RESET FROM XML"; @@ -206,7 +207,10 @@ PluginInsert::add_sidechain (uint32_t n_audio) _sidechain = boost::shared_ptr (sc); _sidechain->activate (); for (uint32_t n = 0; n < n_audio; ++n) { - _sidechain->input()->add_port ("", owner()); // add a port, don't connect. + _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect. + } + for (uint32_t n = 0; n < n_midi; ++n) { + _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect. } PluginConfigChanged (); /* EMIT SIGNAL */ return true; @@ -390,13 +394,13 @@ PluginInsert::plugin_latency () const { } bool -PluginInsert::needs_midi_input() const +PluginInsert::is_instrument() const { PluginInfoPtr pip = _plugins[0]->get_info(); - if (pip->needs_midi_input ()) { + if (pip->is_instrument ()) { return true; } - return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0; + return pip->n_inputs.n_midi () != 0 && pip->n_outputs.n_audio () > 0 && pip->n_inputs.n_audio () == 0; } bool @@ -422,7 +426,7 @@ PluginInsert::has_output_presets (ChanCount in, ChanCount out) return false; } } - if (!needs_midi_input ()) { + if (!is_instrument ()) { return false; } return true; @@ -552,6 +556,13 @@ PluginInsert::activate () } Processor::activate (); + /* when setting state e.g ProcessorBox::paste_processor_state () + * the plugin is not yet owned by a route. + * but no matter. Route::add_processors() will call activate () again + */ + if (!owner ()) { + return; + } if (_plugin_signal_latency != signal_latency ()) { _plugin_signal_latency = signal_latency (); latency_changed (); @@ -1080,7 +1091,8 @@ PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame if (_session.transport_rolling() || _session.bounce_processing()) { automation_run (bufs, start_frame, end_frame, speed, nframes); } else { - connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, false); + Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK); + connect_and_run (bufs, start_frame, end_frame, speed, nframes, 0, lm.locked()); } } else { @@ -1346,7 +1358,7 @@ PluginInsert::no_sc_input_map () const for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) { uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first); for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) { - if (i->second < ins) { + if (i->first < ins) { rv.set (tm->first, i->first + pc * ins, i->second); } } @@ -1982,7 +1994,7 @@ PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, Chan m.strict_io = true; /* special case MIDI instruments */ - if (needs_midi_input ()) { + if (is_instrument ()) { // output = midi-bypass + at most master-out channels. ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out max_out.set (DataType::MIDI, out.get(DataType::MIDI)); @@ -2158,7 +2170,7 @@ PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, Cha uint32_t f = 0; bool can_replicate = true; - for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) { + for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) { // ignore side-chains uint32_t nin = ns_inputs.get (*t); @@ -2605,6 +2617,15 @@ PluginInsert::update_id (PBD::ID id) } } +void +PluginInsert::set_owner (SessionObject* o) +{ + Processor::set_owner (o); + for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) { + (*i)->set_owner (o); + } +} + void PluginInsert::set_state_dir (const std::string& d) { @@ -2746,7 +2767,7 @@ PluginInsert::PluginControl::PluginControl (PluginInsert* p, /** @param val `user' value */ -void +bool PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override) { /* FIXME: probably should be taking out some lock here.. */ @@ -2760,13 +2781,13 @@ PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controlla iasp->set_parameter (_list->parameter().id(), user_val); } - AutomationControl::actually_set_value (user_val, group_override); + return AutomationControl::actually_set_value (user_val, group_override); } void PluginInsert::PluginControl::catch_up_with_external_value (double user_val) { - AutomationControl::actually_set_value (user_val, Controllable::NoGroup); + (void) AutomationControl::actually_set_value (user_val, Controllable::NoGroup); } XMLNode& @@ -2813,7 +2834,7 @@ PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert* } } -void +bool PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd) { /* Old numeric set_value(), coerce to appropriate datatype if possible. @@ -2822,7 +2843,7 @@ PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Contro const Variant value(_desc.datatype, user_val); if (value.type() == Variant::NOTHING) { error << "set_value(double) called for non-numeric property" << endmsg; - return; + return false; } for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) { @@ -2831,7 +2852,7 @@ PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Contro _value = value; - AutomationControl::actually_set_value (user_val, gcd); + return AutomationControl::actually_set_value (user_val, gcd); } XMLNode& @@ -2862,7 +2883,14 @@ PluginInsert::get_impulse_analysis_plugin() // during init() -- most notably block_size.. // not great. ret = plugin_factory(_plugins[0]); - ret->configure_io (internal_input_streams (), internal_output_streams ()); + ChanCount out (internal_output_streams ()); + if (ret->get_info ()->reconfigurable_io ()) { + // populate get_info ()->n_inputs and ->n_outputs + ChanCount useins; + ret->can_support_io_configuration (internal_input_streams (), out, &useins); + assert (out == internal_output_streams ()); + } + ret->configure_io (internal_input_streams (), out); _impulseAnalysisPlugin = ret; } else { ret = _impulseAnalysisPlugin.lock(); @@ -2888,6 +2916,7 @@ void PluginInsert::add_plugin (boost::shared_ptr plugin) { plugin->set_insert_id (this->id()); + plugin->set_owner (_owner); if (_plugins.empty()) { /* first (and probably only) plugin instance - connect to relevant signals */ @@ -2960,6 +2989,7 @@ PluginInsert::latency_changed () // this is called in RT context, LatencyChanged is emitted after run() _latency_changed = true; // XXX This also needs a proper API not an owner() hack. + assert (owner ()); static_cast(owner ())->processor_latency_changed (); /* EMIT SIGNAL */ }