VABinauralCluster.cpp 4.51 KB
Newer Older
1
2
3
#define NOMINMAX

#include <math.h>
4
5
#include "VABinauralCluster.h"

6
7
8
// Utils
#include "../BinauralTimeOfArrivalEstimator/VABinauralTOAEstimator.h"

9
10
11
12
13
14
VABinauralCluster::VABinauralCluster()
{
}

VABinauralCluster::VABinauralCluster(const VABinauralCluster& cluster) :
	maxError(cluster.maxError),
Lucas Moesch's avatar
wip    
Lucas Moesch committed
15
	numSources(cluster.numSources),
16
17
18
19
20
21
22
23
	_clusterSourcePos(cluster._clusterSourcePos)
{

}


VABinauralCluster::~VABinauralCluster()
{
24
25
26
27
28
29
30
31
32
33
34
	VABinauralSoundSource* source;
	std::map<int, VABinauralSoundSource*>::const_iterator it;

	// clear all references from this cluster
	for (it = _sources.begin(); it != _sources.end();)
	{
		source = it->second;
		it = _sources.erase(it);

		source->RemoveReference();
	}
35
36
37
}

void
38
VABinauralCluster::init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener)
39
{
40
41
	_listener = listener;
	_listenerPos = listener->predPos;
42
	_clusterSourcePos = _clusterSourcePos + source->predPos;
43
44
45
46
47
48
49
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

	_output = new ITASampleFrame(2, listener->output->GetLength(), true);
	
	_tmpChL.Init(listener->output->GetLength(), true);
	_tmpChR.Init(listener->output->GetLength(), true);

50
51
	maxError = getDistError(source);

Lucas Moesch's avatar
WIP    
Lucas Moesch committed
52
53
	_sources.insert(std::pair<int, VABinauralSoundSource*>(sourceID, source));

54
55
56
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
57
	++numSources;
58
59
}

Lucas Moesch's avatar
Lucas Moesch committed
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
void
VABinauralCluster::init(VABinauralCluster* cluster)
{
	_listener = cluster->_listener;
	_listenerPos = _listener->predPos;
	_clusterSourcePos = cluster->_clusterSourcePos;
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

	_output = new ITASampleFrame(2, _listener->output->GetLength(), true);

	_tmpChL.Init(_listener->output->GetLength(), true);
	_tmpChR.Init(_listener->output->GetLength(), true);

	maxError = cluster->maxError;

	std::map< int, VABinauralSoundSource*>::const_iterator it;
	for (it = cluster->_sources.begin(); it != cluster->_sources.end(); ++it)
	{
		_sources.insert(std::pair<int, VABinauralSoundSource*>(it->first, it->second));
		it->second->AddReference();
	}

	numSources = cluster->numSources;
}

85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
ITASampleFrame*
VABinauralCluster::getOutput()
{
	// reset output Buffer
	_output->zero();

	// set VDL Values
	std::map<int, VABinauralSoundSource*>::const_iterator it;
	for (it = _sources.begin(); it != _sources.end(); ++it)
	{
		VABinauralSoundSource* source = it->second;
		const ITASampleBuffer* input = source->data->pSignalSourceInputBuf;

		VAVec3 sourceToListenerPos = source->predPos - _listenerPos;
		sourceToListenerPos.Norm();

		double phi = atan2(sourceToListenerPos.y, sourceToListenerPos.x);
		double theta = acos(sourceToListenerPos.z);

104
		//TODO: add general distance VDL
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
		double toaChL = _listener->toaEstimator->getTOALeft(phi, theta);
		double toaChR = _listener->toaEstimator->getTOARight(phi, theta);

		source->vdlChL->SetDelayTime(toaChL);
		source->vdlChR->SetDelayTime(toaChR);

		source->vdlChL->Process(input, &(_tmpChL));
		source->vdlChR->Process(input, &(_tmpChR));

		(*_output)[0] += _tmpChL;
		(*_output)[1] += _tmpChR;
	}

	// convolve 

	return _output;
}

123
124
125
double
VABinauralCluster::getDistError(VABinauralSoundSource* source)
{
126
127
	VAVec3 sourceToListenerPos = source->predPos - _listenerPos;
	double dotp = _clusterSourceToListenerPos.Dot(sourceToListenerPos);
128

129
	return (dotp * dotp) / (_clusterSourcePos.Dot(_clusterSourcePos) * sourceToListenerPos.Dot(sourceToListenerPos));
130
131
132
}

void 
Lucas Moesch's avatar
WIP    
Lucas Moesch committed
133
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source)
134
135
136
{
	double err = getDistError(source);

Lucas Moesch's avatar
wip    
Lucas Moesch committed
137
	_clusterSourcePos = (source->predPos + _clusterSourcePos * numSources) / (numSources + 1);
138
139
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

140
141
	maxError = std::max(err, maxError);

Lucas Moesch's avatar
WIP    
Lucas Moesch committed
142
143
	_sources.insert(std::pair<int, VABinauralSoundSource*>(sourceID, source));

144
145
146
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
147
	++numSources;
148
149
150
}

void
151
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source, double error)
152
{
Lucas Moesch's avatar
wip    
Lucas Moesch committed
153
	_clusterSourcePos = (source->predPos + _clusterSourcePos * numSources) / (numSources + 1);
154
155
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

156
157
	maxError = std::max(error, maxError);

158
159
160
161
	_sources.insert(std::pair<int, VABinauralSoundSource*>(sourceID, source));
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
	++numSources;
}

void
VABinauralCluster::removeSource(int sourceID)
{
	std::map<int, VABinauralSoundSource*>::const_iterator it = _sources.find(sourceID);
	VABinauralSoundSource* source = it->second;

	_sources.erase(it);

	source->RemoveReference();

	_clusterSourcePos = (_clusterSourcePos * numSources - source->predPos) / (numSources - 1);

	//TODO: MaxError
	--numSources;

180
181
}