summaryrefslogtreecommitdiff
path: root/libs/panners/vbap
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-01-10 16:07:57 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-01-10 16:07:57 -0500
commit3020b224fa2d6e1b6b8a576e8e8e211e0585f2a2 (patch)
tree314c3099bcc57d9af09d249e1e7dd8e45baca642 /libs/panners/vbap
parentd15fda6d751a465d278f477923075d4783f3b1ca (diff)
parent897fbdc652434d3aa1e67223c3c3ef7ae9be2318 (diff)
Merge windows+cc branch into cairocanvas branch. Not finished, need to now merge windows branch to get changes from there
Diffstat (limited to 'libs/panners/vbap')
-rw-r--r--libs/panners/vbap/vbap.cc18
-rw-r--r--libs/panners/vbap/vbap_speakers.cc51
-rw-r--r--libs/panners/vbap/wscript3
3 files changed, 45 insertions, 27 deletions
diff --git a/libs/panners/vbap/vbap.cc b/libs/panners/vbap/vbap.cc
index 2241ab96e3..f160ae3d24 100644
--- a/libs/panners/vbap/vbap.cc
+++ b/libs/panners/vbap/vbap.cc
@@ -25,6 +25,10 @@
#include <iostream>
#include <string>
+#ifdef COMPILER_MSVC
+#include <malloc.h>
+#endif
+
#include "pbd/cartesian.h"
#include "pbd/compose.h"
@@ -53,7 +57,7 @@ static PanPluginDescriptor _descriptor = {
VBAPanner::factory
};
-extern "C" { PanPluginDescriptor* panner_descriptor () { return &_descriptor; } }
+extern "C" ARDOURPANNER_API PanPluginDescriptor* panner_descriptor () { return &_descriptor; }
VBAPanner::Signal::Signal (Session&, VBAPanner&, uint32_t, uint32_t n_speakers)
{
@@ -65,7 +69,7 @@ VBAPanner::Signal::Signal (Session&, VBAPanner&, uint32_t, uint32_t n_speakers)
}
void
-VBAPanner::Signal::Signal::resize_gains (uint32_t n)
+VBAPanner::Signal::resize_gains (uint32_t n)
{
gains.assign (n, 0.0);
}
@@ -293,7 +297,7 @@ VBAPanner::distribute_one (AudioBuffer& srcbuf, BufferSet& obufs, gain_t gain_co
assert (sz == obufs.count().n_audio());
- int8_t outputs[sz]; // on the stack, no malloc
+ int8_t *outputs = (int8_t*)alloca(sz); // on the stack, no malloc
/* set initial state of each output "record"
*/
@@ -322,10 +326,10 @@ VBAPanner::distribute_one (AudioBuffer& srcbuf, BufferSet& obufs, gain_t gain_co
/* at this point, we can test a speaker's status:
- (outputs[o] & 1) <= in use before
- (outputs[o] & 2) <= in use this time
- (outputs[o] & 3) == 3 <= in use both times
- outputs[o] == 0 <= not in use either time
+ (*outputs[o] & 1) <= in use before
+ (*outputs[o] & 2) <= in use this time
+ (*outputs[o] & 3) == 3 <= in use both times
+ *outputs[o] == 0 <= not in use either time
*/
diff --git a/libs/panners/vbap/vbap_speakers.cc b/libs/panners/vbap/vbap_speakers.cc
index b84698bbd9..f2533222bd 100644
--- a/libs/panners/vbap/vbap_speakers.cc
+++ b/libs/panners/vbap/vbap_speakers.cc
@@ -31,6 +31,11 @@
of the software.
*/
+#ifdef COMPILER_MSVC
+#pragma warning ( disable : 4244 )
+#endif
+
+#include <vector>
#include <cmath>
#include <algorithm>
#include <stdlib.h>
@@ -45,6 +50,13 @@ 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)
, _parent (s)
@@ -104,17 +116,18 @@ VBAPSpeakers::choose_speaker_triplets(struct ls_triplet_chain **ls_triplets)
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++) {
@@ -505,25 +518,25 @@ VBAPSpeakers::choose_speaker_pairs (){
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;
-
- 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++) {
@@ -532,7 +545,7 @@ VBAPSpeakers::choose_speaker_pairs (){
_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++;
}
@@ -543,7 +556,7 @@ VBAPSpeakers::choose_speaker_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++;
}
diff --git a/libs/panners/vbap/wscript b/libs/panners/vbap/wscript
index bc18def5e6..8fe9dc8e8a 100644
--- a/libs/panners/vbap/wscript
+++ b/libs/panners/vbap/wscript
@@ -22,7 +22,8 @@ def build(bld):
obj = bld(features = 'cxx cxxshlib')
obj.source = [ 'vbap_speakers.cc', 'vbap.cc' ]
obj.export_includes = ['.']
- obj.defines = [ 'PACKAGE="libardour_panvbap"' ]
+ obj.defines = ['PACKAGE="libardour_panvbap"']
+ obj.defines += ['ARDOURPANNER_DLL_EXPORTS']
obj.includes = ['.']
obj.name = 'libardour_panvbap'
obj.target = 'panvbap'