pin connection GUI for variable I/O plugins

This commit is contained in:
Robin Gareus 2016-04-27 23:32:40 +02:00
parent c30b47f0eb
commit b3e12d6566
2 changed files with 78 additions and 20 deletions

View file

@ -58,6 +58,10 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
, _tgl_sidechain (_("Side Chain"), ArdourButton::led_default_elements) , _tgl_sidechain (_("Side Chain"), ArdourButton::led_default_elements)
, _add_plugin (_("+")) , _add_plugin (_("+"))
, _del_plugin (_("-")) , _del_plugin (_("-"))
, _add_input_audio (_("+"))
, _del_input_audio (_("-"))
, _add_input_midi (_("+"))
, _del_input_midi (_("-"))
, _add_output_audio (_("+")) , _add_output_audio (_("+"))
, _del_output_audio (_("-")) , _del_output_audio (_("-"))
, _add_output_midi (_("+")) , _add_output_midi (_("+"))
@ -109,8 +113,15 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
_pm_size_group = SizeGroup::create (SIZE_GROUP_BOTH); _pm_size_group = SizeGroup::create (SIZE_GROUP_BOTH);
_add_plugin.set_tweaks (ArdourButton::Square); _add_plugin.set_tweaks (ArdourButton::Square);
_del_plugin.set_tweaks (ArdourButton::Square); _del_plugin.set_tweaks (ArdourButton::Square);
_pm_size_group->add_widget (_add_plugin); if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
_pm_size_group->add_widget (_del_plugin); _pm_size_group->add_widget (_add_input_audio);
_pm_size_group->add_widget (_del_input_audio);
_pm_size_group->add_widget (_add_input_midi);
_pm_size_group->add_widget (_del_input_midi);
} else {
_pm_size_group->add_widget (_add_plugin);
_pm_size_group->add_widget (_del_plugin);
}
_pm_size_group->add_widget (_add_output_audio); _pm_size_group->add_widget (_add_output_audio);
_pm_size_group->add_widget (_del_output_audio); _pm_size_group->add_widget (_del_output_audio);
_pm_size_group->add_widget (_add_output_midi); _pm_size_group->add_widget (_add_output_midi);
@ -130,14 +141,34 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
/* left side */ /* left side */
tl->pack_start (_set_config, false, false); tl->pack_start (_set_config, false, false);
box = manage (new HBox ()); if (_pi->plugin (0)->get_info()->reconfigurable_io ()) {
box->set_border_width (2); box = manage (new HBox ());
box->pack_start (_add_plugin, true, false); box->set_border_width (2);
box->pack_start (_del_plugin, true, false); box->pack_start (_add_input_audio, true, false);
f = manage (new Frame ()); box->pack_start (_del_input_audio, true, false);
f->set_label (_("Instances")); f = manage (new Frame ());
f->add (*box); f->set_label (_("Audio Input Pins"));
tl->pack_start (*f, false, false); f->add (*box);
tl->pack_start (*f, false, false);
box = manage (new HBox ());
box->set_border_width (2);
box->pack_start (_add_input_midi, true, false);
box->pack_start (_del_input_midi, true, false);
f = manage (new Frame ());
f->set_label (_("MIDI Input Pins"));
f->add (*box);
tl->pack_start (*f, false, false);
} else {
box = manage (new HBox ());
box->set_border_width (2);
box->pack_start (_add_plugin, true, false);
box->pack_start (_del_plugin, true, false);
f = manage (new Frame ());
f->set_label (_("Instances"));
f->add (*box);
tl->pack_start (*f, false, false);
}
box = manage (new HBox ()); box = manage (new HBox ());
box->set_border_width (2); box->set_border_width (2);
@ -210,10 +241,16 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
_add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_plugin_clicked), true)); _add_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_plugin_clicked), true));
_del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_plugin_clicked), false)); _del_plugin.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_plugin_clicked), false));
_add_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_inpin_clicked), true, DataType::AUDIO));
_del_input_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_inpin_clicked), false, DataType::AUDIO));
_add_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_inpin_clicked), true, DataType::MIDI));
_del_input_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_inpin_clicked), false, DataType::MIDI));
_add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::AUDIO)); _add_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::AUDIO));
_del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::AUDIO)); _del_output_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::AUDIO));
_add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::MIDI)); _add_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), true, DataType::MIDI));
_del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::MIDI)); _del_output_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_remove_port_clicked), false, DataType::MIDI));
_add_sc_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_sidechain_port), DataType::AUDIO)); _add_sc_audio.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_sidechain_port), DataType::AUDIO));
_add_sc_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_sidechain_port), DataType::MIDI)); _add_sc_midi.signal_clicked.connect (sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::add_sidechain_port), DataType::MIDI));
@ -287,30 +324,33 @@ PluginPinDialog::plugin_reconfigured ()
if (_pi->custom_cfg ()) { if (_pi->custom_cfg ()) {
_set_config.set_active (true); _set_config.set_active (true);
_add_plugin.set_sensitive (true); _add_plugin.set_sensitive (true);
_del_plugin.set_sensitive (_n_plugins > 1);
_add_output_audio.set_sensitive (true); _add_output_audio.set_sensitive (true);
_add_output_midi.set_sensitive (true); _add_output_midi.set_sensitive (true);
_del_plugin.set_sensitive (_n_plugins > 1);
_del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1); _del_output_audio.set_sensitive (_out.n_audio () > 0 && _out.n_total () > 1);
_del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1); _del_output_midi.set_sensitive (_out.n_midi () > 0 && _out.n_total () > 1);
_add_input_audio.set_sensitive (true);
_add_input_midi.set_sensitive (true);
_del_input_audio.set_sensitive (_sinks.n_audio () > 0 && _sinks.n_total () > 1);
_del_input_midi.set_sensitive (_sinks.n_midi () > 0 && _sinks.n_total () > 1);
_out_presets.set_sensitive (false); _out_presets.set_sensitive (false);
_out_presets.set_text (_("Manual")); _out_presets.set_text (_("Manual"));
} else { } else {
_set_config.set_active (false); _set_config.set_active (false);
_add_plugin.set_sensitive (false); _add_plugin.set_sensitive (false);
_del_plugin.set_sensitive (false);
_add_input_audio.set_sensitive (false);
_add_input_midi.set_sensitive (false);
_del_input_audio.set_sensitive (false);
_del_input_midi.set_sensitive (false);
_add_output_audio.set_sensitive (false); _add_output_audio.set_sensitive (false);
_add_output_midi.set_sensitive (false); _add_output_midi.set_sensitive (false);
_del_plugin.set_sensitive (false);
_del_output_audio.set_sensitive (false); _del_output_audio.set_sensitive (false);
_del_output_midi.set_sensitive (false); _del_output_midi.set_sensitive (false);
_out_presets.set_sensitive (true); _out_presets.set_sensitive (true);
refill_output_presets (); refill_output_presets ();
} }
if (_pi->plugin (0)->get_info()->type == ARDOUR::AudioUnit) {
_add_plugin.set_sensitive (false);
_del_plugin.set_sensitive (false);
}
if (!_pi->has_sidechain () && _sidechain_selector) { if (!_pi->has_sidechain () && _sidechain_selector) {
delete _sidechain_selector; delete _sidechain_selector;
_sidechain_selector = 0; _sidechain_selector = 0;
@ -1563,7 +1603,7 @@ PluginPinDialog::reset_configuration ()
if (_set_config.get_active ()) { if (_set_config.get_active ()) {
_route ()->reset_plugin_insert (_pi); _route ()->reset_plugin_insert (_pi);
} else { } else {
_route ()->customize_plugin_insert (_pi, _n_plugins, _out); _route ()->customize_plugin_insert (_pi, _n_plugins, _out, _sinks);
} }
} }
@ -1586,8 +1626,9 @@ PluginPinDialog::add_remove_plugin_clicked (bool add)
{ {
if (_session && _session->actively_recording ()) { return; } if (_session && _session->actively_recording ()) { return; }
ChanCount out = _out; ChanCount out = _out;
ChanCount sinks = _sinks;
assert (add || _n_plugins > 0); assert (add || _n_plugins > 0);
_route ()->customize_plugin_insert (_pi, _n_plugins + (add ? 1 : -1), out); _route ()->customize_plugin_insert (_pi, _n_plugins + (add ? 1 : -1), out, sinks);
} }
void void
@ -1595,9 +1636,21 @@ PluginPinDialog::add_remove_port_clicked (bool add, ARDOUR::DataType dt)
{ {
if (_session && _session->actively_recording ()) { return; } if (_session && _session->actively_recording ()) { return; }
ChanCount out = _out; ChanCount out = _out;
ChanCount sinks = _sinks;
assert (add || out.get (dt) > 0); assert (add || out.get (dt) > 0);
out.set (dt, out.get (dt) + (add ? 1 : -1)); out.set (dt, out.get (dt) + (add ? 1 : -1));
_route ()->customize_plugin_insert (_pi, _n_plugins, out); _route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
}
void
PluginPinDialog::add_remove_inpin_clicked (bool add, ARDOUR::DataType dt)
{
if (_session && _session->actively_recording ()) { return; }
ChanCount out = _out;
ChanCount sinks = _sinks;
assert (add || sinks.get (dt) > 0);
sinks.set (dt, sinks.get (dt) + (add ? 1 : -1));
_route ()->customize_plugin_insert (_pi, _n_plugins, out, sinks);
} }
void void

View file

@ -96,6 +96,10 @@ private:
ArdourButton _tgl_sidechain; ArdourButton _tgl_sidechain;
ArdourButton _add_plugin; ArdourButton _add_plugin;
ArdourButton _del_plugin; ArdourButton _del_plugin;
ArdourButton _add_input_audio;
ArdourButton _del_input_audio;
ArdourButton _add_input_midi;
ArdourButton _del_input_midi;
ArdourButton _add_output_audio; ArdourButton _add_output_audio;
ArdourButton _del_output_audio; ArdourButton _del_output_audio;
ArdourButton _add_output_midi; ArdourButton _add_output_midi;
@ -143,6 +147,7 @@ private:
void connect_sidechain (); void connect_sidechain ();
void add_remove_plugin_clicked (bool); void add_remove_plugin_clicked (bool);
void add_remove_port_clicked (bool, ARDOUR::DataType); void add_remove_port_clicked (bool, ARDOUR::DataType);
void add_remove_inpin_clicked (bool, ARDOUR::DataType);
void add_sidechain_port (ARDOUR::DataType); void add_sidechain_port (ARDOUR::DataType);
void select_output_preset (uint32_t n_audio); void select_output_preset (uint32_t n_audio);
void handle_input_action (const CtrlElem &, const CtrlElem &); void handle_input_action (const CtrlElem &, const CtrlElem &);