diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2011-02-17 16:43:55 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2011-02-17 16:43:55 +0000 |
commit | da144ab5edb5bb629a8300c2cbf93c7f87947a83 (patch) | |
tree | dbb556f06c4667a820655895d704d60c98e690b4 /libs/panners/vbap | |
parent | 97e2aedc2d8f9ba8b6100e9ddafa08fc9762c8f7 (diff) |
more progress on speakers/vbap etc. etc (still a work in progress)
git-svn-id: svn://localhost/ardour2/branches/3.0@8887 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/panners/vbap')
-rw-r--r-- | libs/panners/vbap/vbap.cc | 24 | ||||
-rw-r--r-- | libs/panners/vbap/vbap.h | 6 | ||||
-rw-r--r-- | libs/panners/vbap/vbap_speakers.cc | 19 | ||||
-rw-r--r-- | libs/panners/vbap/vbap_speakers.h | 7 |
4 files changed, 21 insertions, 35 deletions
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc index 239a253f19..e563952efd 100644 --- a/libs/panners/vbap/vbap.cc +++ b/libs/panners/vbap/vbap.cc @@ -37,9 +37,9 @@ VBAPanner::Signal::Signal (Session& session, VBAPanner& p, uint32_t n) desired_outputs[0] = desired_outputs[1] = desired_outputs[2] = -1; }; -VBAPanner::VBAPanner (boost::shared_ptr<Pannable> p, Speakers& s) +VBAPanner::VBAPanner (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> s) : Panner (p) - , _speakers (VBAPSpeakers::instance (s)) + , _speakers (new VBAPSpeakers (s)) { _pannable->pan_azimuth_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)); @@ -138,16 +138,16 @@ VBAPanner::compute_gains (double gains[3], int speaker_ids[3], int azi, int ele) gains[0] = gains[1] = gains[2] = 0; speaker_ids[0] = speaker_ids[1] = speaker_ids[2] = 0; - for (i = 0; i < _speakers.n_tuples(); i++) { + for (i = 0; i < _speakers->n_tuples(); i++) { small_g = 10000000.0; - for (j = 0; j < _speakers.dimension(); j++) { + for (j = 0; j < _speakers->dimension(); j++) { gtmp[j] = 0.0; - for (k = 0; k < _speakers.dimension(); k++) { - gtmp[j] += cartdir[k] * _speakers.matrix(i)[j*_speakers.dimension()+k]; + for (k = 0; k < _speakers->dimension(); k++) { + gtmp[j] += cartdir[k] * _speakers->matrix(i)[j*_speakers->dimension()+k]; } if (gtmp[j] < small_g) { @@ -162,12 +162,12 @@ VBAPanner::compute_gains (double gains[3], int speaker_ids[3], int azi, int ele) gains[0] = gtmp[0]; gains[1] = gtmp[1]; - speaker_ids[0] = _speakers.speaker_for_tuple (i, 0); - speaker_ids[1] = _speakers.speaker_for_tuple (i, 1); + speaker_ids[0] = _speakers->speaker_for_tuple (i, 0); + speaker_ids[1] = _speakers->speaker_for_tuple (i, 1); - if (_speakers.dimension() == 3) { + if (_speakers->dimension() == 3) { gains[2] = gtmp[2]; - speaker_ids[2] = _speakers.speaker_for_tuple (i, 2); + speaker_ids[2] = _speakers->speaker_for_tuple (i, 2); } else { gains[2] = 0.0; speaker_ids[2] = -1; @@ -275,7 +275,7 @@ VBAPanner::set_state (const XMLNode& node, int /*version*/) } Panner* -VBAPanner::factory (boost::shared_ptr<Pannable> p, Speakers& s) +VBAPanner::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> s) { return new VBAPanner (p, s); } @@ -289,7 +289,7 @@ VBAPanner::in() const ChanCount VBAPanner::out() const { - return ChanCount (DataType::AUDIO, _speakers.n_speakers()); + return ChanCount (DataType::AUDIO, _speakers->n_speakers()); } std::set<Evoral::Parameter> diff --git a/libs/panners/vbap/vbap.h b/libs/panners/vbap/vbap.h index cf010cc331..937199194f 100644 --- a/libs/panners/vbap/vbap.h +++ b/libs/panners/vbap/vbap.h @@ -37,7 +37,7 @@ class Pannable; class VBAPanner : public Panner { public: - VBAPanner (boost::shared_ptr<Pannable>, Speakers& s); + VBAPanner (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>); ~VBAPanner (); void configure_io (ChanCount in, ChanCount /* ignored - we use Speakers */); @@ -46,7 +46,7 @@ public: std::set<Evoral::Parameter> what_can_be_automated() const; - static Panner* factory (boost::shared_ptr<Pannable>, Speakers& s); + static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>); void distribute (BufferSet& ibufs, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes); @@ -72,7 +72,7 @@ private: }; std::vector<Signal*> _signals; - VBAPSpeakers& _speakers; + boost::shared_ptr<VBAPSpeakers> _speakers; void compute_gains (double g[3], int ls[3], int azi, int ele); void update (); diff --git a/libs/panners/vbap/vbap_speakers.cc b/libs/panners/vbap/vbap_speakers.cc index 7e70e5df66..506ad4a25b 100644 --- a/libs/panners/vbap/vbap_speakers.cc +++ b/libs/panners/vbap/vbap_speakers.cc @@ -43,23 +43,12 @@ using namespace ARDOUR; using namespace PBD; using namespace std; -VBAPSpeakers* VBAPSpeakers::_instance = 0; - -VBAPSpeakers& -VBAPSpeakers::instance (Speakers& s) -{ - if (_instance == 0) { - _instance = new VBAPSpeakers (s); - } - - return *_instance; -} - -VBAPSpeakers::VBAPSpeakers (Speakers& s) +VBAPSpeakers::VBAPSpeakers (boost::shared_ptr<Speakers> s) : _dimension (2) - , _speakers (s.speakers()) + , _speakers (s->speakers()) { - s.Changed.connect_same_thread (speaker_connection, boost::bind (&VBAPSpeakers::update, this)); + // s.Changed.connect_same_thread (speaker_connection, boost::bind (&VBAPSpeakers::update, this)); + update (); } VBAPSpeakers::~VBAPSpeakers () diff --git a/libs/panners/vbap/vbap_speakers.h b/libs/panners/vbap/vbap_speakers.h index 8fe006ea1c..3bd298ba3d 100644 --- a/libs/panners/vbap/vbap_speakers.h +++ b/libs/panners/vbap/vbap_speakers.h @@ -43,20 +43,17 @@ public: int n_tuples () const { return _matrices.size(); } int dimension() const { return _dimension; } - static VBAPSpeakers& instance (Speakers&); + VBAPSpeakers (boost::shared_ptr<Speakers>); uint32_t n_speakers() const { return _speakers.size(); } ~VBAPSpeakers (); private: - static VBAPSpeakers* _instance; static const double MIN_VOL_P_SIDE_LGTH = 0.01; int _dimension; - std::vector<Speaker>& _speakers; + std::vector<Speaker> _speakers; PBD::ScopedConnection speaker_connection; - VBAPSpeakers (Speakers&); - struct azimuth_sorter { bool operator() (const Speaker& s1, const Speaker& s2) { return s1.angles().azi < s2.angles().azi; |