summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-01-14 10:56:17 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-01-14 10:56:17 -0500
commitcf806123ca5faaef483f898daba3f7bd38ec62eb (patch)
treef11f2f9ff64ea3b3682c81b8dd893ba0e9476445 /gtk2_ardour
parentcfc9a1f22ea38d4dd6c619d6cec25fe29b1c2f48 (diff)
parentd9296b71237d9d3058b0796eda25258fadd45ad9 (diff)
merge (with conflict fixes) with master (even against rgareus' recommendation)
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/ardour.menus.in1
-rw-r--r--gtk2_ardour/mixer_strip.cc29
-rw-r--r--gtk2_ardour/panner2d.cc20
-rw-r--r--gtk2_ardour/panner_ui.cc9
-rw-r--r--gtk2_ardour/panner_ui.h4
-rw-r--r--gtk2_ardour/processor_box.cc47
-rw-r--r--gtk2_ardour/processor_box.h2
-rw-r--r--gtk2_ardour/rc_option_editor.cc12
-rw-r--r--gtk2_ardour/send_ui.cc12
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 ();
}
}