diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-01-14 10:56:17 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-01-14 10:56:17 -0500 |
commit | cf806123ca5faaef483f898daba3f7bd38ec62eb (patch) | |
tree | f11f2f9ff64ea3b3682c81b8dd893ba0e9476445 /gtk2_ardour | |
parent | cfc9a1f22ea38d4dd6c619d6cec25fe29b1c2f48 (diff) | |
parent | d9296b71237d9d3058b0796eda25258fadd45ad9 (diff) |
merge (with conflict fixes) with master (even against rgareus' recommendation)
Diffstat (limited to 'gtk2_ardour')
-rw-r--r-- | gtk2_ardour/ardour.menus.in | 1 | ||||
-rw-r--r-- | gtk2_ardour/mixer_strip.cc | 29 | ||||
-rw-r--r-- | gtk2_ardour/panner2d.cc | 20 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.cc | 9 | ||||
-rw-r--r-- | gtk2_ardour/panner_ui.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.cc | 47 | ||||
-rw-r--r-- | gtk2_ardour/processor_box.h | 2 | ||||
-rw-r--r-- | gtk2_ardour/rc_option_editor.cc | 12 | ||||
-rw-r--r-- | gtk2_ardour/send_ui.cc | 12 |
9 files changed, 96 insertions, 40 deletions
diff --git a/gtk2_ardour/ardour.menus.in b/gtk2_ardour/ardour.menus.in index a354df603d..b6328963bb 100644 --- a/gtk2_ardour/ardour.menus.in +++ b/gtk2_ardour/ardour.menus.in @@ -551,6 +551,7 @@ <menuitem action='newaux'/> <separator/> <menuitem action='controls'/> + <menuitem action='send_options'/> <separator/> <menuitem action='clear'/> <menuitem action='clear_pre'/> diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 28c4e07452..80548ea20b 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -1041,29 +1041,13 @@ MixerStrip::update_panner_choices () ENSURE_GUI_THREAD (*this, &MixerStrip::update_panner_choices) if (!_route->panner_shell()) { return; } - int in = _route->output()->n_ports().n_audio(); - int out = in; - + uint32_t in = _route->output()->n_ports().n_audio(); + uint32_t out = in; if (_route->panner()) { in = _route->panner()->in().n_audio(); } - if (out < 2 || in == 0) { - panners.set_available_panners(_route, std::map<std::string,std::string>()); - return; - } - - std::map<std::string,std::string> panner_list; - std::list<PannerInfo*> panner_info = PannerManager::instance().panner_info; - /* get available panners for current configuration. */ - for (list<PannerInfo*>::iterator p = panner_info.begin(); p != panner_info.end(); ++p) { - PanPluginDescriptor* d = &(*p)->descriptor; - if (d->in != -1 && d->in != in) continue; - if (d->out != -1 && d->out != out) continue; - if (d->in == -1 && d->out == -1 && out <= 2) continue; - panner_list.insert(std::pair<std::string,std::string>(d->panner_uri,d->name)); - } - panners.set_available_panners(_route, panner_list); + panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); } /* @@ -1891,10 +1875,13 @@ MixerStrip::show_send (boost::shared_ptr<Send> send) gain_meter().set_controls (_route, send->meter(), send->amp()); gain_meter().setup_meters (); + uint32_t const in = _current_delivery->pans_required(); + uint32_t const out = _current_delivery->pan_outs(); + panner_ui().set_panner (_current_delivery->panner_shell(), _current_delivery->panner()); - panner_ui().set_available_panners(boost::shared_ptr<ARDOUR::Route>(), std::map<std::string,std::string>()); + panner_ui().set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); panner_ui().setup_pan (); - panners.show_all (); + panner_ui().show_all (); input_button.set_sensitive (false); group_button.set_sensitive (false); diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc index c3b87ba5e4..51c0112397 100644 --- a/gtk2_ardour/panner2d.cc +++ b/gtk2_ardour/panner2d.cc @@ -401,7 +401,7 @@ Panner2d::on_expose_event (GdkEventExpose *event) { CartesianVector c; cairo_t* cr; - bool small_size = (height <= large_size_threshold); + bool small = (height <= large_size_threshold); const double diameter = radius*2.0; cr = gdk_cairo_create (get_window()->gobj()); @@ -426,14 +426,14 @@ Panner2d::on_expose_event (GdkEventExpose *event) /* horizontal line of "crosshairs" */ cairo_set_source_rgba (cr, 0.282, 0.517, 0.662, 1.0); - cairo_move_to (cr, 0.0, rint(radius) - .5); - cairo_line_to (cr, diameter, rint(radius) - .5); + cairo_move_to (cr, 0.0, rint(radius) + .5); + cairo_line_to (cr, diameter, rint(radius) + .5); cairo_stroke (cr); /* vertical line of "crosshairs" */ - cairo_move_to (cr, rint(radius) - .5, 0); - cairo_line_to (cr, rint(radius) - .5, diameter); + cairo_move_to (cr, rint(radius) + .5, 0); + cairo_line_to (cr, rint(radius) + .5, diameter); cairo_stroke (cr); /* the circle on which signals live */ @@ -484,7 +484,7 @@ Panner2d::on_expose_event (GdkEventExpose *event) cairo_select_font_face (cr, "sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); - if (small_size) { + if (small) { arc_radius = 4.0; } else { cairo_set_font_size (cr, 10); @@ -526,12 +526,12 @@ Panner2d::on_expose_event (GdkEventExpose *event) cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, 0.8); cairo_stroke (cr); - if (!small_size && !signal->text.empty()) { + if (!small && !signal->text.empty()) { cairo_set_source_rgba (cr, 0.517, 0.772, 0.882, .9); /* the +/- adjustments are a hack to try to center the text in the circle * TODO use pango get_pixel_size() -- see mono_panner.cc */ - if (small_size) { + if (small) { cairo_move_to (cr, c.x - 1, c.y + 1); } else { cairo_move_to (cr, c.x - 4, c.y + 4); @@ -565,7 +565,7 @@ Panner2d::on_expose_event (GdkEventExpose *event) cairo_move_to (cr, c.x, c.y); cairo_save (cr); cairo_rotate (cr, -(speaker->position.azi/360.0) * (2.0 * M_PI)); - if (small_size) { + if (small) { cairo_scale (cr, 0.8, 0.8); } else { cairo_scale (cr, 1.2, 1.2); @@ -583,7 +583,7 @@ Panner2d::on_expose_event (GdkEventExpose *event) cairo_fill (cr); cairo_restore (cr); - if (!small_size) { + if (!small) { cairo_set_font_size (cr, 16); /* move the text in just a bit */ diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index af297a8507..0c57fab244 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -388,7 +388,7 @@ PannerUI::build_pan_menu () items.push_back (MenuElem (_("Edit..."), sigc::mem_fun (*this, &PannerUI::pan_edit))); } - if (_route && _panner_list.size() > 1 && !_panshell->bypassed()) { + if (_panner_list.size() > 1 && !_panshell->bypassed()) { RadioMenuItem::Group group; items.push_back (SeparatorElem()); @@ -444,9 +444,7 @@ PannerUI::pan_reset () void PannerUI::pan_set_custom_type (std::string uri) { if (_suspend_menu_callbacks) return; - if (_route) { - _route->set_custom_panner_uri(uri); - } + _panshell->select_panner_by_uri(uri); } void @@ -644,8 +642,7 @@ PannerUI::position_adjusted () } void -PannerUI::set_available_panners(boost::shared_ptr<ARDOUR::Route> r, std::map<std::string,std::string> p) +PannerUI::set_available_panners(std::map<std::string,std::string> p) { - _route = r; _panner_list = p; } diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h index dca24451d1..9b349d664f 100644 --- a/gtk2_ardour/panner_ui.h +++ b/gtk2_ardour/panner_ui.h @@ -73,7 +73,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void set_width (Width); void setup_pan (); - void set_available_panners(boost::shared_ptr<ARDOUR::Route>, std::map<std::string,std::string>); + void set_available_panners(std::map<std::string,std::string>); void effective_pan_display (); @@ -85,6 +85,7 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr private: friend class MixerStrip; + friend class SendUI; boost::shared_ptr<ARDOUR::PannerShell> _panshell; boost::shared_ptr<ARDOUR::Panner> _panner; @@ -161,7 +162,6 @@ class PannerUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr void start_touch (boost::weak_ptr<ARDOUR::AutomationControl>); void stop_touch (boost::weak_ptr<ARDOUR::AutomationControl>); - boost::shared_ptr<ARDOUR::Route> _route; std::map<std::string,std::string> _panner_list; bool _suspend_menu_callbacks; }; diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 1e2289d790..05a373e9d8 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -45,6 +45,7 @@ #include "ardour/audioengine.h" #include "ardour/internal_return.h" #include "ardour/internal_send.h" +#include "ardour/panner_shell.h" #include "ardour/plugin_insert.h" #include "ardour/pannable.h" #include "ardour/port_insert.h" @@ -456,6 +457,34 @@ ProcessorEntry::toggle_control_visibility (Control* c) _parent->update_gui_object_state (this); } +Menu * +ProcessorEntry::build_send_options_menu () +{ + using namespace Menu_Helpers; + Menu* menu = manage (new Menu); + MenuList& items = menu->items (); + + boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (_processor); + if (send) { + + items.push_back (CheckMenuElem (_("Link panner controls"))); + CheckMenuItem* c = dynamic_cast<CheckMenuItem*> (&items.back ()); + c->set_active (send->panner_shell()->is_linked_to_route()); + c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_panner_link)); + + } + return menu; +} + +void +ProcessorEntry::toggle_panner_link () +{ + boost::shared_ptr<Send> send = boost::dynamic_pointer_cast<Send> (_processor); + if (send) { + send->panner_shell()->set_linked_to_route(!send->panner_shell()->is_linked_to_route()); + } +} + ProcessorEntry::Control::Control (boost::shared_ptr<AutomationControl> c, string const & n) : _control (c) , _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1) @@ -1092,6 +1121,20 @@ ProcessorBox::show_processor_menu (int arg) } } + Gtk::MenuItem* send_menu_item = dynamic_cast<Gtk::MenuItem*>(ActionManager::get_widget("/ProcessorMenu/send_options")); + if (send_menu_item) { + if (single_selection) { + Menu* m = single_selection->build_send_options_menu (); + if (m && !m->items().empty()) { + send_menu_item->set_submenu (*m); + send_menu_item->set_sensitive (true); + } else { + gtk_menu_item_set_submenu (send_menu_item->gobj(), 0); + send_menu_item->set_sensitive (false); + } + } + } + /* Sensitise actions as approprioate */ cut_action->set_sensitive (can_cut()); @@ -2071,7 +2114,8 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr boost::shared_ptr<Pannable> sendpan(new Pannable (*_session)); XMLNode n (**niter); - Send* s = new Send (*_session, sendpan, _route->mute_master()); + + Send* s = new Send (*_session, _route->pannable(), _route->mute_master()); IOProcessor::prepare_for_reset (n, s->name()); @@ -2404,6 +2448,7 @@ ProcessorBox::register_actions () ActionManager::register_action (popup_act_grp, X_("newaux"), _("New Aux Send ...")); ActionManager::register_action (popup_act_grp, X_("controls"), _("Controls")); + ActionManager::register_action (popup_act_grp, X_("send_options"), _("Send Options")); ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear (all)"), sigc::ptr_fun (ProcessorBox::rb_clear)); diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index a66a6c4a56..021e557d36 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -138,6 +138,7 @@ public: void set_control_state (XMLNode const *); std::string state_id () const; Gtk::Menu* build_controls_menu (); + Gtk::Menu* build_send_options_menu (); protected: ArdourButton _button; @@ -205,6 +206,7 @@ private: std::list<Control*> _controls; void toggle_control_visibility (Control *); + void toggle_panner_link (); class PortIcon : public Gtk::DrawingArea { public: diff --git a/gtk2_ardour/rc_option_editor.cc b/gtk2_ardour/rc_option_editor.cc index 7c5d9a7763..1286fd8cc9 100644 --- a/gtk2_ardour/rc_option_editor.cc +++ b/gtk2_ardour/rc_option_editor.cc @@ -1637,6 +1637,8 @@ RCOptionEditor::RCOptionEditor () /* SOLO AND MUTE */ + add_option (_("Solo / mute"), new OptionEditorHeading (_("Solo"))); + add_option (_("Solo / mute"), new FaderOption ( "solo-mute-gain", @@ -1750,6 +1752,16 @@ RCOptionEditor::RCOptionEditor () sigc::mem_fun (*_rc_config, &RCConfiguration::set_mute_affects_main_outs) )); + add_option (_("Solo / mute"), new OptionEditorHeading (_("Send Routing"))); + + add_option (_("Solo / mute"), + new BoolOption ( + "link-send-and-route-panner", + _("Link panners of Aux and External Sends with main panner by default"), + sigc::mem_fun (*_rc_config, &RCConfiguration::get_link_send_and_route_panner), + sigc::mem_fun (*_rc_config, &RCConfiguration::set_link_send_and_route_panner) + )); + add_option (_("MIDI"), new BoolOption ( "send-midi-clock", diff --git a/gtk2_ardour/send_ui.cc b/gtk2_ardour/send_ui.cc index 019307fd16..7e3b0e775a 100644 --- a/gtk2_ardour/send_ui.cc +++ b/gtk2_ardour/send_ui.cc @@ -20,6 +20,7 @@ #include <gtkmm2ext/doi.h> #include "ardour/io.h" +#include "ardour/panner_manager.h" #include "ardour/send.h" #include "ardour/rc_configuration.h" @@ -70,7 +71,11 @@ SendUI::SendUI (Gtk::Window* parent, boost::shared_ptr<Send> s, Session* session _send->output()->changed.connect (connections, invalidator (*this), boost::bind (&SendUI::outs_changed, this, _1, _2), gui_context()); + uint32_t const in = _send->pans_required(); + uint32_t const out = _send->pan_outs(); + _panners.set_width (Wide); + _panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); _panners.setup_pan (); _gpm.setup_meters (); @@ -97,7 +102,14 @@ SendUI::outs_changed (IOChange change, void* /*ignored*/) { ENSURE_GUI_THREAD (*this, &SendUI::outs_changed, change, ignored) if (change.type & IOChange::ConfigurationChanged) { + uint32_t const in = _send->pans_required(); + uint32_t const out = _send->pan_outs(); + if (_panners._panner == 0) { + _panners.set_panner (_send->panner_shell(), _send->panner()); + } + _panners.set_available_panners(PannerManager::instance().PannerManager::get_available_panners(in, out)); _panners.setup_pan (); + _panners.show_all (); _gpm.setup_meters (); } } |