summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-04-15 18:15:05 +0200
committerRobin Gareus <robin@gareus.org>2016-04-15 18:15:05 +0200
commit5242aeb871d173c80e0ecde567831c7afcbf0fac (patch)
treea5cf54220363be5ffd6d0e5cc5ef3144000b4ff6
parent424cacfbc83516d9e935bd93135e58b34dcfc002 (diff)
Output Port Presets.
-rw-r--r--gtk2_ardour/plugin_pin_dialog.cc87
-rw-r--r--gtk2_ardour/plugin_pin_dialog.h5
2 files changed, 90 insertions, 2 deletions
diff --git a/gtk2_ardour/plugin_pin_dialog.cc b/gtk2_ardour/plugin_pin_dialog.cc
index 8bfab6b338..422cd802bb 100644
--- a/gtk2_ardour/plugin_pin_dialog.cc
+++ b/gtk2_ardour/plugin_pin_dialog.cc
@@ -50,7 +50,7 @@ using namespace Gtkmm2ext;
PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
: ArdourWindow (string_compose (_("Pin Configuration: %1"), pi->name ()))
- , _set_config (_("Configure"), ArdourButton::led_default_elements)
+ , _set_config (_("Manual Config"), ArdourButton::led_default_elements)
, _tgl_sidechain (_("Side Chain"), ArdourButton::led_default_elements)
, _add_plugin (_("+"))
, _del_plugin (_("-"))
@@ -125,7 +125,6 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
/* left side */
tl->pack_start (_set_config, false, false);
- tl->pack_start (*manage (new Label ("")), true, true); // invisible separator
box = manage (new HBox ());
box->set_border_width (2);
@@ -154,6 +153,11 @@ PluginPinDialog::PluginPinDialog (boost::shared_ptr<ARDOUR::PluginInsert> pi)
f->add (*box);
tl->pack_start (*f, false, false);
+ tl->pack_start (*manage (new Label ("")), true, true); // invisible separator
+ tl->pack_start (*manage (new HSeparator ()), false, false, 4);
+ _out_presets.disable_scrolling ();
+ ARDOUR_UI_UTILS::set_tooltip (_out_presets, _("Output Presets"));
+ tl->pack_start (_out_presets, false, false);
/* right side */
_sidechain_tbl = manage (new Gtk::Table ());
@@ -232,6 +236,7 @@ PluginPinDialog::plugin_reconfigured ()
_sinks = _pi->natural_input_streams ();
_sources = _pi->natural_output_streams ();
+
_tgl_sidechain.set_active (_pi->has_sidechain ());
_add_sc_audio.set_sensitive (_pi->has_sidechain ());
_add_sc_midi.set_sensitive (_pi->has_sidechain ());
@@ -244,6 +249,8 @@ PluginPinDialog::plugin_reconfigured ()
_del_plugin.set_sensitive (_n_plugins > 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);
+ _out_presets.set_sensitive (false);
+ _out_presets.set_text (_("Manual"));
} else {
_set_config.set_active (false);
_add_plugin.set_sensitive (false);
@@ -252,6 +259,8 @@ PluginPinDialog::plugin_reconfigured ()
_del_plugin.set_sensitive (false);
_del_output_audio.set_sensitive (false);
_del_output_midi.set_sensitive (false);
+ _out_presets.set_sensitive (true);
+ refill_output_presets ();
}
if (!_pi->has_sidechain () && _sidechain_selector) {
@@ -360,6 +369,55 @@ PluginPinDialog::refill_sidechain_table ()
}
void
+PluginPinDialog::refill_output_presets ()
+{
+ using namespace Menu_Helpers;
+ _out_presets.clear_items();
+
+ _out_presets.AddMenuElem (MenuElem(_("Automatic"), sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::select_output_preset), 0)));
+
+ PluginOutputConfiguration ppc (_pi->plugin (0)->possible_output ());
+ const uint32_t n_audio = _pi->preset_out ().n_audio ();
+ if (n_audio == 0) {
+ _out_presets.set_text(_("Automatic"));
+ }
+
+ if (ppc.find (0) != ppc.end ()) {
+ // anyting goes
+ ppc.clear ();
+ if (n_audio != 0) {
+ ppc.insert (n_audio);
+ }
+ ppc.insert (1);
+ ppc.insert (2);
+ ppc.insert (8);
+ ppc.insert (16);
+ ppc.insert (24);
+ ppc.insert (32);
+ }
+
+ for (PluginOutputConfiguration::const_iterator i = ppc.begin () ; i != ppc.end (); ++i) {
+ assert (*i > 0);
+ std::string tmp;
+ switch (*i) {
+ case 1:
+ tmp = _("Mono");
+ break;
+ case 2:
+ tmp = _("Stereo");
+ break;
+ default:
+ tmp = string_compose (P_("%1 Channel", "%1 Channels", *i), *i);
+ break;
+ }
+ _out_presets.AddMenuElem (MenuElem(tmp, sigc::bind (sigc::mem_fun (*this, &PluginPinDialog::select_output_preset), *i)));
+ if (n_audio == *i) {
+ _out_presets.set_text(tmp);
+ }
+ }
+}
+
+void
PluginPinDialog::add_port_to_table (boost::shared_ptr<Port> p, uint32_t r, bool can_remove)
{
std::string lbl;
@@ -777,6 +835,16 @@ PluginPinDialog::darea_expose_event (GdkEventExpose* ev)
cairo_set_source_rgba (cr, 1., 1., 1., 1.);
pango_cairo_show_layout (cr, layout->gobj ());
+ if (_pi->signal_latency () > 0) {
+ // TODO: this needs a better location also format to msec (and cache)
+ layout->set_width ((_innerwidth - 2 * _pin_box_size) * PANGO_SCALE);
+ layout->set_text (string_compose (_("Latency %1 spl"), _pi->signal_latency ()));
+ layout->get_pixel_size (text_width, text_height);
+ cairo_move_to (cr, _margin_x + _pin_box_size * .5, _margin_y + 2);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+ }
+
if (_pi->strict_io () && !Profile->get_mixbus ()) {
layout->set_text (_("Strict I/O"));
layout->get_pixel_size (text_width, text_height);
@@ -803,6 +871,13 @@ PluginPinDialog::darea_expose_event (GdkEventExpose* ev)
rounded_rectangle (cr, x0 - _bxw2, yc - _bxh2, 2 * _bxw2, 2 * _bxh2, 7);
cairo_fill (cr);
+ layout->set_width (1.9 * _bxw2 * PANGO_SCALE);
+ layout->set_text (string_compose (_("Plugin #%1"), i + 1));
+ layout->get_pixel_size (text_width, text_height);
+ cairo_move_to (cr, x0 - text_width * .5, yc - text_height * .5);
+ cairo_set_source_rgba (cr, 1., 1., 1., 1.);
+ pango_cairo_show_layout (cr, layout->gobj ());
+
const ChanMapping::Mappings in_map = _pi->input_map (i).mappings ();
const ChanMapping::Mappings out_map = _pi->output_map (i).mappings ();
@@ -1329,6 +1404,14 @@ PluginPinDialog::reset_mapping ()
}
void
+PluginPinDialog::select_output_preset (uint32_t n_audio)
+{
+ if (_session && _session->actively_recording()) { return; }
+ ChanCount out (DataType::AUDIO, n_audio);
+ _route ()->plugin_preset_output (_pi, out);
+}
+
+void
PluginPinDialog::add_remove_plugin_clicked (bool add)
{
if (_session && _session->actively_recording()) { return; }
diff --git a/gtk2_ardour/plugin_pin_dialog.h b/gtk2_ardour/plugin_pin_dialog.h
index c8fd460cb0..d2fa327b70 100644
--- a/gtk2_ardour/plugin_pin_dialog.h
+++ b/gtk2_ardour/plugin_pin_dialog.h
@@ -28,6 +28,7 @@
#include "ardour/route.h"
#include "ardour_button.h"
+#include "ardour_dropdown.h"
#include "ardour_window.h"
#include "io_selector.h"
@@ -91,6 +92,8 @@ private:
ArdourButton _add_sc_audio;
ArdourButton _add_sc_midi;
+ ArdourDropdown _out_presets;
+
Gtk::Menu reset_menu;
Gtk::Menu input_menu;
Gtk::Table* _sidechain_tbl;
@@ -99,6 +102,7 @@ private:
void plugin_reconfigured ();
void update_element_pos ();
void refill_sidechain_table ();
+ void refill_output_presets ();
void darea_size_request (Gtk::Requisition*);
void darea_size_allocate (Gtk::Allocation&);
@@ -127,6 +131,7 @@ private:
void add_remove_plugin_clicked (bool);
void add_remove_port_clicked (bool, ARDOUR::DataType);
void add_sidechain_port (ARDOUR::DataType);
+ void select_output_preset (uint32_t n_audio);
void handle_input_action (const CtrlElem &, const CtrlElem &);
void handle_output_action (const CtrlElem &, const CtrlElem &);
void handle_thru_action (const CtrlElem &, const CtrlElem &);