#include "ardour/session.h"
#include "ardour/types.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
, _strict_io (false)
, _custom_cfg (false)
, _maps_from_state (false)
+ , _latency_changed (false)
, _bypass_port (UINT32_MAX)
{
/* the first is the master */
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 ());
}
}
}
}
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";
_sidechain = boost::shared_ptr<SideChain> (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;
}
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
return false;
}
}
- if (!needs_midi_input ()) {
+ if (!is_instrument ()) {
return false;
}
return true;
}
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 ();
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 {
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);
}
}
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));
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);
}
}
+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)
{
/** @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.. */
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&
}
}
-void
+bool
PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
{
/* Old numeric set_value(), coerce to appropriate datatype if possible.
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) {
_value = value;
- AutomationControl::actually_set_value (user_val, gcd);
+ return AutomationControl::actually_set_value (user_val, gcd);
}
XMLNode&
// 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();
PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
{
plugin->set_insert_id (this->id());
+ plugin->set_owner (_owner);
if (_plugins.empty()) {
/* first (and probably only) plugin instance - connect to relevant signals */
// 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<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
}