of the software.
*/
+#include <vector>
#include <cmath>
#include <algorithm>
#include <stdlib.h>
using namespace PBD;
using namespace std;
+const double VBAPSpeakers::MIN_VOL_P_SIDE_LGTH = 0.01;
+
+typedef std::vector<double> DoubleVector;
+typedef std::vector<float> FloatVector;
+typedef std::vector<bool> BoolVector;
+typedef std::vector<int> IntVector;
+typedef std::vector<IntVector> IntVector2D;
+typedef std::vector<DoubleVector> DoubleVector2D;
+
VBAPSpeakers::VBAPSpeakers (boost::shared_ptr<Speakers> s)
: _dimension (2)
- , _speakers (s->speakers())
+ , _parent (s)
{
- // s.Changed.connect_same_thread (speaker_connection, boost::bind (&VBAPSpeakers::update, this));
+ _parent->Changed.connect_same_thread (speaker_connection, boost::bind (&VBAPSpeakers::update, this));
update ();
}
VBAPSpeakers::update ()
{
int dim = 2;
-
+
+ _speakers = _parent->speakers();
+
for (vector<Speaker>::const_iterator i = _speakers.begin(); i != _speakers.end(); ++i) {
if ((*i).angles().ele != 0.0) {
- cerr << "\n\n\nSPEAKER " << (*i).id << " has ele = " << (*i).angles().ele << "\n\n\n\n";
dim = 3;
break;
}
_dimension = dim;
- cerr << "update with dimension = " << dim << " speakers = " << _speakers.size() << endl;
-
if (_speakers.size() < 2) {
/* nothing to be done with less than two speakers */
return;
int i,j,k,l,table_size;
int n_speakers = _speakers.size ();
- int connections[n_speakers][n_speakers];
- float distance_table[((n_speakers * (n_speakers - 1)) / 2)];
- int distance_table_i[((n_speakers * (n_speakers - 1)) / 2)];
- int distance_table_j[((n_speakers * (n_speakers - 1)) / 2)];
- float distance;
- struct ls_triplet_chain *trip_ptr, *prev, *tmp_ptr;
- if (n_speakers == 0) {
+ if (n_speakers < 1) {
return;
}
+ FloatVector distance_table(((n_speakers * (n_speakers - 1)) / 2));
+ IntVector distance_table_i(((n_speakers * (n_speakers - 1)) / 2));
+ IntVector distance_table_j(((n_speakers * (n_speakers - 1)) / 2));
+ IntVector2D connections(n_speakers, IntVector(n_speakers));
+ float distance;
+ struct ls_triplet_chain *trip_ptr, *prev, *tmp_ptr;
+
for (i = 0; i < n_speakers; i++) {
for (j = i+1; j < n_speakers; j++) {
for(k=j+1;k<n_speakers;k++) {
matrices and stores the data to a global array
*/
const int n_speakers = _speakers.size();
- const double AZIMUTH_DELTA_THRESHOLD_DEGREES = (180.0/M_PI) * (M_PI - 0.175);
- int sorted_speakers[n_speakers];
- bool exists[n_speakers];
- double inverse_matrix[n_speakers][4];
- int expected_pairs = 0;
- int pair;
- int speaker;
-
- cerr << "CHOOSE PAIRS\n";
- if (n_speakers == 0) {
+ if (n_speakers < 1) {
return;
}
+ IntVector sorted_speakers(n_speakers);
+ BoolVector exists(n_speakers);
+ DoubleVector2D inverse_matrix(n_speakers, DoubleVector(4));
+ const double AZIMUTH_DELTA_THRESHOLD_DEGREES = (180.0/M_PI) * (M_PI - 0.175);
+ int expected_pairs = 0;
+ int pair;
+ int speaker;
+
for (speaker = 0; speaker < n_speakers; ++speaker) {
exists[speaker] = false;
}
/* sort loudspeakers according their aximuth angle */
- sort_2D_lss (sorted_speakers);
+ sort_2D_lss (&sorted_speakers[0]);
/* adjacent loudspeakers are the loudspeaker pairs to be used.*/
for (speaker = 0; speaker < n_speakers-1; speaker++) {
- cerr << "Looking at "
- << _speakers[sorted_speakers[speaker]].id << " @ " << _speakers[sorted_speakers[speaker]].angles().azi
- << " and "
- << _speakers[sorted_speakers[speaker+1]].id << " @ " << _speakers[sorted_speakers[speaker+1]].angles().azi
- << " delta = "
- << _speakers[sorted_speakers[speaker+1]].angles().azi - _speakers[sorted_speakers[speaker]].angles().azi
- << endl;
-
if ((_speakers[sorted_speakers[speaker+1]].angles().azi -
_speakers[sorted_speakers[speaker]].angles().azi) <= AZIMUTH_DELTA_THRESHOLD_DEGREES) {
if (calc_2D_inv_tmatrix( _speakers[sorted_speakers[speaker]].angles().azi,
_speakers[sorted_speakers[speaker+1]].angles().azi,
- inverse_matrix[speaker]) != 0){
+ &inverse_matrix[speaker][0]) != 0){
exists[speaker] = true;
expected_pairs++;
}
+_speakers[sorted_speakers[0]].angles().azi) <= AZIMUTH_DELTA_THRESHOLD_DEGREES) {
if (calc_2D_inv_tmatrix(_speakers[sorted_speakers[n_speakers-1]].angles().azi,
_speakers[sorted_speakers[0]].angles().azi,
- inverse_matrix[n_speakers-1]) != 0) {
+ &inverse_matrix[n_speakers-1][0]) != 0) {
exists[n_speakers-1] = true;
expected_pairs++;
}
_speaker_tuples[pair][0] = sorted_speakers[speaker];
_speaker_tuples[pair][1] = sorted_speakers[speaker+1];
- cerr << "PAIR[" << pair << "] = " << sorted_speakers[speaker] << " + " << sorted_speakers[speaker+1] << endl;
-
pair++;
}
}
_speaker_tuples[pair][0] = sorted_speakers[n_speakers-1];
_speaker_tuples[pair][1] = sorted_speakers[0];
-
- cerr << "PAIR[" << pair << "] = " << sorted_speakers[n_speakers-1] << " + " << sorted_speakers[0] << endl;
-
}
}
for (n = 0, s = tmp.begin(); s != tmp.end(); ++s, ++n) {
sorted_speakers[n] = (*s).id;
- cerr << "Sorted[" << n << "] = " << (*s).id << endl;
}
}
double x1,x2,x3,x4;
double det;
- x1 = cos (azi1);
- x2 = sin (azi1);
- x3 = cos (azi2);
- x4 = sin (azi2);
+ x1 = cos (azi1 * (M_PI/180.0));
+ x2 = sin (azi1 * (M_PI/180.0));
+ x3 = cos (azi2 * (M_PI/180.0));
+ x4 = sin (azi2 * (M_PI/180.0));
det = (x1 * x4) - ( x3 * x2 );
if (fabs(det) <= 0.001) {