summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/panner_ui.cc13
-rw-r--r--gtk2_ardour/panner_ui.h3
-rw-r--r--libs/ardour/ardour/panner.h2
-rw-r--r--libs/ardour/panner.cc73
4 files changed, 87 insertions, 4 deletions
diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc
index b06519d840..ed482e3726 100644
--- a/gtk2_ardour/panner_ui.cc
+++ b/gtk2_ardour/panner_ui.cc
@@ -478,9 +478,9 @@ PannerUI::build_pan_menu (uint32_t which)
bypass_menu_item->set_active (_io->panner().bypassed());
bypass_menu_item->signal_toggled().connect (mem_fun(*this, &PannerUI::pan_bypass_toggle));
- items.push_back (MenuElem (_("Reset"), mem_fun(*this, &PannerUI::pan_reset)));
+ items.push_back (MenuElem (_("Reset"), bind (mem_fun(*this, &PannerUI::pan_reset), which)));
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Reset all")));
+ items.push_back (MenuElem (_("Reset all"), mem_fun (*this, &PannerUI::pan_reset_all)));
}
void
@@ -499,8 +499,15 @@ PannerUI::pan_bypass_toggle ()
}
void
-PannerUI::pan_reset ()
+PannerUI::pan_reset (uint32_t which)
{
+ _io->panner().reset_streampanner (which);
+}
+
+void
+PannerUI::pan_reset_all ()
+{
+ _io->panner().reset_to_default ();
}
void
diff --git a/gtk2_ardour/panner_ui.h b/gtk2_ardour/panner_ui.h
index 11bffc1661..a566e0f9ae 100644
--- a/gtk2_ardour/panner_ui.h
+++ b/gtk2_ardour/panner_ui.h
@@ -140,7 +140,8 @@ class PannerUI : public Gtk::HBox
Gtk::CheckMenuItem* bypass_menu_item;
void build_pan_menu (uint32_t which);
void pan_mute (uint32_t which);
- void pan_reset ();
+ void pan_reset (uint32_t which);
+ void pan_reset_all ();
void pan_bypass_toggle ();
void pan_automation_state_changed();
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index a4a1d5d3b9..b6eb9a9b68 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -248,6 +248,8 @@ class Panner : public std::vector<StreamPanner*>, public Stateful, public sigc::
void remove (uint32_t which);
void clear ();
void reset (uint32_t noutputs, uint32_t npans);
+ void reset_streampanner (uint32_t which_panner);
+ void reset_to_default ();
void snapshot (nframes_t now);
void transport_stopped (nframes_t frame);
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index 4848f559cc..cf56c8fdb7 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -800,6 +800,79 @@ Panner::set_bypassed (bool yn)
}
}
+void
+Panner::reset_to_default ()
+{
+ vector<float> positions;
+
+ switch (outputs.size()) {
+ case 0:
+ case 1:
+ return;
+ }
+
+ if (outputs.size() == 2) {
+ switch (size()) {
+ case 1:
+ front()->set_position (0.5);
+ front()->automation().reset_default (0.5);
+ return;
+ break;
+ case 2:
+ front()->set_position (0.0);
+ front()->automation().reset_default (0.0);
+ back()->set_position (1.0);
+ back()->automation().reset_default (1.0);
+ return;
+ default:
+ break;
+ }
+ }
+
+ vector<Output>::iterator o;
+ iterator p;
+
+ for (o = outputs.begin(), p = begin(); o != outputs.end() && p != end(); ++o, ++p) {
+ (*p)->set_position ((*o).x, (*o).y);
+ }
+}
+
+void
+Panner::reset_streampanner (uint32_t which)
+{
+ if (which >= size() || which >= outputs.size()) {
+ return;
+ }
+
+ switch (outputs.size()) {
+ case 0:
+ case 1:
+ return;
+
+ case 2:
+ switch (size()) {
+ case 1:
+ /* stereo out, 1 stream, default = middle */
+ front()->set_position (0.5);
+ front()->automation().reset_default (0.5);
+ break;
+ case 2:
+ /* stereo out, 2 streams, default = hard left/right */
+ if (which == 0) {
+ front()->set_position (0.0);
+ front()->automation().reset_default (0.0);
+ } else {
+ back()->set_position (1.0);
+ back()->automation().reset_default (1.0);
+ }
+ break;
+ }
+ return;
+
+ default:
+ (*this)[which]->set_position (outputs[which].x, outputs[which].y);
+ }
+}
void
Panner::reset (uint32_t nouts, uint32_t npans)