summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2011-02-17 16:43:55 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2011-02-17 16:43:55 +0000
commitda144ab5edb5bb629a8300c2cbf93c7f87947a83 (patch)
treedbb556f06c4667a820655895d704d60c98e690b4 /libs
parent97e2aedc2d8f9ba8b6100e9ddafa08fc9762c8f7 (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')
-rw-r--r--libs/ardour/ardour/panner.h3
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/ardour/speakers.h1
-rw-r--r--libs/ardour/panner.cc2
-rw-r--r--libs/ardour/panner_shell.cc13
-rw-r--r--libs/ardour/session.cc5
-rw-r--r--libs/ardour/session_state.cc4
-rw-r--r--libs/panners/1in2out/panner_1in2out.cc2
-rw-r--r--libs/panners/1in2out/panner_1in2out.h8
-rw-r--r--libs/panners/2in2out/panner_2in2out.cc2
-rw-r--r--libs/panners/2in2out/panner_2in2out.h2
-rw-r--r--libs/panners/vbap/vbap.cc24
-rw-r--r--libs/panners/vbap/vbap.h6
-rw-r--r--libs/panners/vbap/vbap_speakers.cc19
-rw-r--r--libs/panners/vbap/vbap_speakers.h7
15 files changed, 46 insertions, 56 deletions
diff --git a/libs/ardour/ardour/panner.h b/libs/ardour/ardour/panner.h
index 5e0ed991d6..75f9ea598c 100644
--- a/libs/ardour/ardour/panner.h
+++ b/libs/ardour/ardour/panner.h
@@ -162,7 +162,6 @@ class Panner : public PBD::Stateful, public PBD::ScopedConnectionList
XMLNode& get_state ();
-
virtual void distribute_one (AudioBuffer&, BufferSet& obufs, gain_t gain_coeff, pframes_t nframes, uint32_t which) = 0;
virtual void distribute_one_automated (AudioBuffer&, BufferSet& obufs,
framepos_t start, framepos_t end, pframes_t nframes,
@@ -176,7 +175,7 @@ extern "C" {
std::string name;
int32_t in;
int32_t out;
- ARDOUR::Panner* (*factory)(boost::shared_ptr<ARDOUR::Pannable>, ARDOUR::Speakers&);
+ ARDOUR::Panner* (*factory)(boost::shared_ptr<ARDOUR::Pannable>, boost::shared_ptr<ARDOUR::Speakers>);
};
}
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 25b7b72fe4..dfa09fd357 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -716,7 +716,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
/* Speakers */
- Speakers& get_speakers ();
+ boost::shared_ptr<Speakers> get_speakers ();
/* Controllables */
@@ -1478,7 +1478,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void start_time_changed (framepos_t);
void end_time_changed (framepos_t);
- Speakers* _speakers;
+ boost::shared_ptr<Speakers> _speakers;
};
} // namespace ARDOUR
diff --git a/libs/ardour/ardour/speakers.h b/libs/ardour/ardour/speakers.h
index 0bee66af07..2bbfdadfa7 100644
--- a/libs/ardour/ardour/speakers.h
+++ b/libs/ardour/ardour/speakers.h
@@ -43,6 +43,7 @@ public:
virtual void remove_speaker (int id);
virtual void move_speaker (int id, const PBD::AngularVector& new_position);
virtual void clear_speakers ();
+ uint32_t size() const { return _speakers.size(); }
void setup_default_speakers (uint32_t nspeakers);
diff --git a/libs/ardour/panner.cc b/libs/ardour/panner.cc
index 6498c2777a..26009e1a64 100644
--- a/libs/ardour/panner.cc
+++ b/libs/ardour/panner.cc
@@ -25,6 +25,8 @@
#include "ardour/session.h"
#include "ardour/utils.h"
+#include "pbd/stacktrace.h"
+
using namespace std;
using namespace ARDOUR;
diff --git a/libs/ardour/panner_shell.cc b/libs/ardour/panner_shell.cc
index ecf7adf990..d67925ed5c 100644
--- a/libs/ardour/panner_shell.cc
+++ b/libs/ardour/panner_shell.cc
@@ -104,7 +104,18 @@ PannerShell::configure_io (ChanCount in, ChanCount out)
abort ();
}
- Panner* p = pi->descriptor.factory (_pannable, _session.get_speakers());
+ boost::shared_ptr<Speakers> speakers = _session.get_speakers ();
+
+ if (nouts != speakers->size()) {
+ /* hmm, output count doesn't match session speaker count so
+ create a new speaker set.
+ */
+ Speakers* s = new Speakers ();
+ s->setup_default_speakers (nouts);
+ speakers.reset (s);
+ }
+
+ Panner* p = pi->descriptor.factory (_pannable, speakers);
boost_debug_shared_ptr_mark_interesting (p, "Panner");
_panner.reset (p);
_panner->configure_io (in, out);
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index 4c25989c0a..39f6fc4ff7 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -323,7 +323,6 @@ Session::destroy ()
playlists.reset ();
delete _locations;
- delete _speakers;
DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
@@ -4175,10 +4174,10 @@ Session::ensure_search_path_includes (const string& path, DataType type)
}
}
-Speakers&
+boost::shared_ptr<Speakers>
Session::get_speakers()
{
- return *_speakers;
+ return _speakers;
}
list<string>
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 9a359e1b05..b925e9416e 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -221,7 +221,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
midi_control_ui = 0;
_step_editors = 0;
no_questions_about_missing_files = false;
- _speakers = new Speakers;
+ _speakers.reset (new Speakers);
AudioDiskstream::allocate_working_buffers();
@@ -1186,9 +1186,7 @@ Session::state(bool full_state)
}
node->add_child_nocopy (_speakers->get_state());
-
node->add_child_nocopy (_tempo_map->get_state());
-
node->add_child_nocopy (get_control_protocol_state());
if (_extra_xml) {
diff --git a/libs/panners/1in2out/panner_1in2out.cc b/libs/panners/1in2out/panner_1in2out.cc
index cce2ec9b71..6c002c1591 100644
--- a/libs/panners/1in2out/panner_1in2out.cc
+++ b/libs/panners/1in2out/panner_1in2out.cc
@@ -317,7 +317,7 @@ Panner1in2out::distribute_one_automated (AudioBuffer& srcbuf, BufferSet& obufs,
Panner*
-Panner1in2out::factory (boost::shared_ptr<Pannable> p, Speakers& /* ignored */)
+Panner1in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> /* ignored */)
{
return new Panner1in2out (p);
}
diff --git a/libs/panners/1in2out/panner_1in2out.h b/libs/panners/1in2out/panner_1in2out.h
index ffc67ac54d..c36e3e87c7 100644
--- a/libs/panners/1in2out/panner_1in2out.h
+++ b/libs/panners/1in2out/panner_1in2out.h
@@ -51,13 +51,7 @@ class Panner1in2out : public Panner
std::set<Evoral::Parameter> what_can_be_automated() const;
- /* this class just leaves the pan law itself to be defined
- by the update(), do_distribute_automated()
- methods. derived classes also need a factory method
- and a type name. See EqualPowerStereoPanner as an example.
- */
-
- static Panner* factory (boost::shared_ptr<Pannable>, Speakers&);
+ static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
std::string describe_parameter (Evoral::Parameter);
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
diff --git a/libs/panners/2in2out/panner_2in2out.cc b/libs/panners/2in2out/panner_2in2out.cc
index 8667fd5f54..df859a1eff 100644
--- a/libs/panners/2in2out/panner_2in2out.cc
+++ b/libs/panners/2in2out/panner_2in2out.cc
@@ -426,7 +426,7 @@ Panner2in2out::distribute_one_automated (AudioBuffer& srcbuf, BufferSet& obufs,
}
Panner*
-Panner2in2out::factory (boost::shared_ptr<Pannable> p, Speakers& /* ignored */)
+Panner2in2out::factory (boost::shared_ptr<Pannable> p, boost::shared_ptr<Speakers> /* ignored */)
{
return new Panner2in2out (p);
}
diff --git a/libs/panners/2in2out/panner_2in2out.h b/libs/panners/2in2out/panner_2in2out.h
index 2014bb032e..b9b9a73dfb 100644
--- a/libs/panners/2in2out/panner_2in2out.h
+++ b/libs/panners/2in2out/panner_2in2out.h
@@ -57,7 +57,7 @@ class Panner2in2out : public Panner
std::set<Evoral::Parameter> what_can_be_automated() const;
- static Panner* factory (boost::shared_ptr<Pannable>, Speakers&);
+ static Panner* factory (boost::shared_ptr<Pannable>, boost::shared_ptr<Speakers>);
std::string describe_parameter (Evoral::Parameter);
std::string value_as_string (boost::shared_ptr<AutomationControl>) const;
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;