diff options
author | Robin Gareus <robin@gareus.org> | 2014-01-11 22:59:25 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2014-01-11 23:38:27 +0100 |
commit | 80127f9ccade3292a22377173d44a72619497950 (patch) | |
tree | 05a095ba61ca33e184a19ff4f8a076e8381478a3 /libs/panners | |
parent | 72d8ca89e2f4b2e194b2bbd99261deb5b2108a40 (diff) |
VBAP backend re-work (part one):
* fix azimuth, don't clamp but map to [0,1]
* prepare elevation (10+ speakers)
Diffstat (limited to 'libs/panners')
-rw-r--r-- | libs/panners/vbap/vbap.cc | 43 | ||||
-rw-r--r-- | libs/panners/vbap/vbap.h | 1 |
2 files changed, 29 insertions, 15 deletions
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc index 2241ab96e3..0b01c2d9d3 100644 --- a/libs/panners/vbap/vbap.cc +++ b/libs/panners/vbap/vbap.cc @@ -75,6 +75,7 @@ VBAPanner::VBAPanner (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> , _speakers (new VBAPSpeakers (s)) { _pannable->pan_azimuth_control->Changed.connect_same_thread (*this, boost::bind (&VBAPanner::update, this)); + _pannable->pan_elevation_control->Changed.connect_same_thread (*this, boost::bind (&VBAPanner::update, this)); _pannable->pan_width_control->Changed.connect_same_thread (*this, boost::bind (&VBAPanner::update, this)); update (); @@ -119,6 +120,7 @@ VBAPanner::update () /* panner azimuth control is [0 .. 1.0] which we interpret as [0 .. 360] degrees */ double center = _pannable->pan_azimuth_control->get_value() * 360.0; + double elevation = _pannable->pan_elevation_control->get_value() * 90.0; if (_signals.size() > 1) { @@ -156,8 +158,8 @@ VBAPanner::update () for (vector<Signal*>::iterator s = _signals.begin(); s != _signals.end(); ++s) { Signal* signal = *s; - - signal->direction = AngularVector (signal_direction, 0.0); + + signal->direction = AngularVector (signal_direction, elevation); compute_gains (signal->desired_gains, signal->desired_outputs, signal->direction.azi, signal->direction.ele); signal_direction += degree_step_per_signal; } @@ -168,8 +170,8 @@ VBAPanner::update () for (vector<Signal*>::reverse_iterator s = _signals.rbegin(); s != _signals.rend(); ++s) { Signal* signal = *s; - - signal->direction = AngularVector (signal_direction, 0.0); + + signal->direction = AngularVector (signal_direction, elevation); compute_gains (signal->desired_gains, signal->desired_outputs, signal->direction.azi, signal->direction.ele); signal_direction += degree_step_per_signal; } @@ -180,7 +182,7 @@ VBAPanner::update () /* width has no role to play if there is only 1 signal: VBAP does not do "diffusion" of a single channel */ Signal* s = _signals.front(); - s->direction = AngularVector (center, 0); + s->direction = AngularVector (center, elevation); compute_gains (s->desired_gains, s->desired_outputs, s->direction.azi, s->direction.ele); } } @@ -428,6 +430,9 @@ VBAPanner::what_can_be_automated() const if (_signals.size() > 1) { s.insert (Evoral::Parameter (PanWidthAutomation)); } + if (_speakers->dimension() == 3) { + s.insert (Evoral::Parameter (PanElevationAutomation)); + } return s; } @@ -439,6 +444,8 @@ VBAPanner::describe_parameter (Evoral::Parameter p) return _("Direction"); case PanWidthAutomation: return _("Diffusion"); + case PanElevationAutomation: + return _("Elevation"); default: return _pannable->describe_parameter (p); } @@ -452,10 +459,13 @@ VBAPanner::value_as_string (boost::shared_ptr<AutomationControl> ac) const switch (ac->parameter().type()) { case PanAzimuthAutomation: /* direction */ - return string_compose (_("%1"), int (rint (val * 360.0))); + return string_compose (_("%1\u00B0"), int (rint (val * 360.0))); case PanWidthAutomation: /* diffusion */ return string_compose (_("%1%%"), (int) floor (100.0 * fabs(val))); + + case PanElevationAutomation: /* elevation */ + return string_compose (_("%1\u00B0"), (int) floor (90.0 * fabs(val))); default: return _pannable->value_as_string (ac); @@ -481,15 +491,11 @@ VBAPanner::get_speakers () const void VBAPanner::set_position (double p) { - if (p < 0.0) { - p = 1.0 + p; - } - - if (p > 1.0) { - p = fmod (p, 1.0); - } - - _pannable->pan_azimuth_control->set_value (p); + /* map into 0..1 range */ + int over = p; + over -= (p >= 0) ? 0 : 1; + p -= (double)over; + _pannable->pan_azimuth_control->set_value (p); } void @@ -499,10 +505,17 @@ VBAPanner::set_width (double w) } void +VBAPanner::set_elevation (double e) +{ + _pannable->pan_elevation_control->set_value (min (1.0, max (0.0, e))); +} + +void VBAPanner::reset () { set_position (0); set_width (1); + set_elevation (0); update (); } diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h index e90bbc6fb1..ee9d456627 100644 --- a/libs/panners/vbap/vbap.h +++ b/libs/panners/vbap/vbap.h @@ -46,6 +46,7 @@ public: void set_position (double); void set_width (double); + void set_elevation (double); std::set<Evoral::Parameter> what_can_be_automated() const; |