diff options
-rw-r--r-- | gtk2_ardour/panner2d.cc | 31 | ||||
-rw-r--r-- | gtk2_ardour/panner2d.h | 3 | ||||
-rw-r--r-- | libs/panners/vbap/vbap.cc | 12 | ||||
-rw-r--r-- | libs/panners/vbap/vbap.h | 3 |
4 files changed, 31 insertions, 18 deletions
diff --git a/gtk2_ardour/panner2d.cc b/gtk2_ardour/panner2d.cc index 5054a9ee37..56bf159ba9 100644 --- a/gtk2_ardour/panner2d.cc +++ b/gtk2_ardour/panner2d.cc @@ -29,6 +29,7 @@ #include "pbd/error.h" #include "pbd/cartesian.h" #include "ardour/panner.h" +#include "ardour/pannable.h" #include "ardour/speakers.h" #include "panner2d.h" @@ -63,8 +64,11 @@ Panner2d::Target::set_text (const char* txt) Panner2d::Panner2d (boost::shared_ptr<Panner> p, int32_t h) : panner (p), width (0), height (h) { - panner->StateChanged.connect (state_connection, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context()); - panner->Changed.connect (change_connection, invalidator (*this), boost::bind (&Panner2d::handle_position_change, this), gui_context()); + panner->StateChanged.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_state_change, this), gui_context()); + panner->Changed.connect (connections, invalidator (*this), boost::bind (&Panner2d::handle_position_change, this), gui_context()); + + panner->pannable()->pan_azimuth_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context()); + panner->pannable()->pan_width_control->Changed.connect (connections, invalidator(*this), boost::bind (&Panner2d::handle_position_change, this), gui_context()); drag_target = 0; set_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK|Gdk::POINTER_MOTION_MASK); @@ -197,28 +201,25 @@ Panner2d::add_target (const AngularVector& a) void Panner2d::handle_state_change () { - ENSURE_GUI_THREAD (*this, &Panner2d::handle_state_change) - queue_draw (); } void Panner2d::handle_position_change () { -#ifdef PANNER_HACKS uint32_t n; - ENSURE_GUI_THREAD (*this, &Panner2d::handle_position_change) - for (n = 0; n < pucks.size(); ++n) { - pucks[n]->position = panner->streampanner(n).get_position (); - } + for (uint32_t i = 0; i < pucks.size(); ++i) { + pucks[i]->position = panner->signal_position (i); + } + + vector<Speaker>& speakers (panner->get_speakers()->speakers()); for (n = 0; n < targets.size(); ++n) { - targets[n]->position = panner->output(n).position; + targets[n]->position = speakers[n].angles(); } queue_draw (); -#endif } void @@ -528,11 +529,9 @@ Panner2d::handle_motion (gint evx, gint evy, GdkModifierType state) cp.angular (drag_target->position); /* sets drag target position */ -#ifdef PANNER_HACKS - panner->streampanner (drag_index).set_position (drag_target->position); -#endif - - queue_draw (); + double degree_fract = drag_target->position.azi / 360.0; + + panner->set_position (degree_fract); } } diff --git a/gtk2_ardour/panner2d.h b/gtk2_ardour/panner2d.h index 4c7bd1530c..9ace95cb50 100644 --- a/gtk2_ardour/panner2d.h +++ b/gtk2_ardour/panner2d.h @@ -130,8 +130,7 @@ class Panner2d : public Gtk::DrawingArea void handle_state_change (); void handle_position_change (); - PBD::ScopedConnection state_connection; - PBD::ScopedConnection change_connection; + PBD::ScopedConnectionList connections; /* cartesian coordinates in GTK units ; adjust to same but on a circle of radius 1.0 and centered in the middle of our area diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc index fc75ae7183..56af0edbe1 100644 --- a/libs/panners/vbap/vbap.cc +++ b/libs/panners/vbap/vbap.cc @@ -347,3 +347,15 @@ VBAPanner::get_speakers () const { return _speakers->parent(); } + +void +VBAPanner::set_position (double p) +{ + _pannable->pan_azimuth_control->set_value (p); +} + +void +VBAPanner::set_width (double p) +{ + _pannable->pan_width_control->set_value (p); +} diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h index af3c1c0df2..7aa136ac78 100644 --- a/libs/panners/vbap/vbap.h +++ b/libs/panners/vbap/vbap.h @@ -44,6 +44,9 @@ public: ChanCount in() const; ChanCount out() const; + void set_position (double); + void set_width (double); + std::set<Evoral::Parameter> what_can_be_automated() const; static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>); |