From 5242aeb871d173c80e0ecde567831c7afcbf0fac Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 15 Apr 2016 18:15:05 +0200 Subject: Output Port Presets. --- gtk2_ardour/plugin_pin_dialog.cc | 87 +++++++++++++++++++++++++++++++++++++++- gtk2_ardour/plugin_pin_dialog.h | 5 +++ 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 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 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 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) { @@ -359,6 +368,55 @@ PluginPinDialog::refill_sidechain_table () _sidechain_tbl->show_all (); } +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 p, uint32_t r, bool can_remove) { @@ -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 (); @@ -1328,6 +1403,14 @@ PluginPinDialog::reset_mapping () _pi->reset_map (); } +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) { 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 &); -- cgit v1.2.3