From 8a7e3f17f4b78bb0383e47a7ee2e63fb964c04e7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 30 Apr 2009 15:04:16 +0000 Subject: [PATCH] implement panner reset functionality (missing since 0.99?) ported from 2.X git-svn-id: svn://localhost/ardour2/branches/3.0@5015 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/panner_ui.cc | 13 +++++-- gtk2_ardour/panner_ui.h | 3 +- libs/ardour/ardour/panner.h | 5 +-- libs/ardour/panner.cc | 74 +++++++++++++++++++++++++++++++++++++ 4 files changed, 88 insertions(+), 7 deletions(-) diff --git a/gtk2_ardour/panner_ui.cc b/gtk2_ardour/panner_ui.cc index 636035abd3..2df79d2c39 100644 --- a/gtk2_ardour/panner_ui.cc +++ b/gtk2_ardour/panner_ui.cc @@ -497,9 +497,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 @@ -518,8 +518,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 b6c439fd6a..3fb4632d13 100644 --- a/gtk2_ardour/panner_ui.h +++ b/gtk2_ardour/panner_ui.h @@ -142,7 +142,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); + 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 2e7a73561e..9e54696048 100644 --- a/libs/ardour/ardour/panner.h +++ b/libs/ardour/ardour/panner.h @@ -229,9 +229,8 @@ class Panner : public Processor StreamPanner* add (); void remove (uint32_t which); void reset (uint32_t noutputs, uint32_t npans); - - - + void reset_streampanner (uint32_t which_panner); + void reset_to_default (); XMLNode& get_state (void); XMLNode& state (bool full); diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc index a00edfdd3f..23c87f0a2e 100644 --- a/libs/ardour/panner.cc +++ b/libs/ardour/panner.cc @@ -748,6 +748,80 @@ Panner::set_bypassed (bool yn) } +void +Panner::reset_to_default () +{ + vector positions; + + switch (outputs.size()) { + case 0: + case 1: + return; + } + + if (outputs.size() == 2) { + switch (_streampanners.size()) { + case 1: + _streampanners.front()->set_position (0.5); + _streampanners.front()->pan_control()->list()->reset_default (0.5); + return; + break; + case 2: + _streampanners.front()->set_position (0.0); + _streampanners.front()->pan_control()->list()->reset_default (0.0); + _streampanners.back()->set_position (1.0); + _streampanners.back()->pan_control()->list()->reset_default (1.0); + return; + default: + break; + } + } + + vector::iterator o; + vector::iterator p; + + for (o = outputs.begin(), p = _streampanners.begin(); o != outputs.end() && p != _streampanners.end(); ++o, ++p) { + (*p)->set_position ((*o).x, (*o).y); + } +} + +void +Panner::reset_streampanner (uint32_t which) +{ + if (which >= _streampanners.size() || which >= outputs.size()) { + return; + } + + switch (outputs.size()) { + case 0: + case 1: + return; + + case 2: + switch (_streampanners.size()) { + case 1: + /* stereo out, 1 stream, default = middle */ + _streampanners.front()->set_position (0.5); + _streampanners.front()->pan_control()->list()->reset_default (0.5); + break; + case 2: + /* stereo out, 2 streams, default = hard left/right */ + if (which == 0) { + _streampanners.front()->set_position (0.0); + _streampanners.front()->pan_control()->list()->reset_default (0.0); + } else { + _streampanners.back()->set_position (1.0); + _streampanners.back()->pan_control()->list()->reset_default (1.0); + } + break; + } + return; + + default: + _streampanners[which]->set_position (outputs[which].x, outputs[which].y); + } +} + void Panner::reset (uint32_t nouts, uint32_t npans) {