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

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

6
7
8
// ITA includes
#include <ITAConstants.h>

9
// Utils
10
#include "../RelationMetrics/VARelationMetrics.h"
11
12
#include "../BinauralTimeOfArrivalEstimator/VABinauralTOAEstimator.h"

13
14
15
16
17
18
VABinauralCluster::VABinauralCluster()
{
}

VABinauralCluster::VABinauralCluster(const VABinauralCluster& cluster) :
	maxError(cluster.maxError),
Lucas Moesch's avatar
wip    
Lucas Moesch committed
19
	numSources(cluster.numSources),
20
21
22
23
24
25
26
27
	_clusterSourcePos(cluster._clusterSourcePos)
{

}


VABinauralCluster::~VABinauralCluster()
{
28
29
30
31
32
33
34
35
36
37
38
	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();
	}
39
40
41
}

void
42
VABinauralCluster::init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener, ITAUPConvolution* FIRConvolverChL, ITAUPConvolution* FIRConvolverChR)
43
{
44
45
	_FIRConvolverChL = FIRConvolverChL;
	_FIRConvolverChR = FIRConvolverChR;
46
47
	_listener = listener;
	_listenerPos = listener->predPos;
48
	_clusterSourcePos = _clusterSourcePos + source->predPos;
49
50
51
52
53
54
55
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

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

56
57
	maxError = getDistError(source);

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

60
61
62
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
63
	++numSources;
64
65
}

Lucas Moesch's avatar
Lucas Moesch committed
66
67
68
void
VABinauralCluster::init(VABinauralCluster* cluster)
{
69
70
	_FIRConvolverChL = cluster->_FIRConvolverChL;
	_FIRConvolverChR = cluster->_FIRConvolverChR;
Lucas Moesch's avatar
Lucas Moesch committed
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
	_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;
}

93
94
95
96
97
98
ITASampleFrame*
VABinauralCluster::getOutput()
{
	// reset output Buffer
	_output->zero();

99
100
101
102
103
104
105
	// get cluster HRTF TOA
	VARelationMetrics clusterSourceMetrics;
	clusterSourceMetrics.calc(_listener->predPos, _listener->predView, _listener->predUp, _clusterSourcePos);

	double toaHRTFChL = _listener->toaEstimator->getTOALeft(clusterSourceMetrics.phi, clusterSourceMetrics.theta);
	double toaHRTFChR = _listener->toaEstimator->getTOARight(clusterSourceMetrics.phi, clusterSourceMetrics.theta);

106
107
108
109
110
111
112
	// 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;

113
114
		VARelationMetrics sourceMetrics;
		sourceMetrics.calc(_listener->predPos, _listener->predView, _listener->predUp, source->predPos);
115

116
117
118
119
		double toaDistance = sourceMetrics.dist / 343; // TODO: Medium Propagation....
	
		double toaSourceChL = _listener->toaEstimator->getTOALeft(sourceMetrics.phi, sourceMetrics.theta);
		double toSourceaChR = _listener->toaEstimator->getTOARight(sourceMetrics.phi, sourceMetrics.theta);
120

121
122
		source->vdlChL->SetDelayTime(toaDistance + toaSourceChL - toaHRTFChL);
		source->vdlChR->SetDelayTime(toaDistance + toSourceaChR - toaHRTFChR);
Lucas Moesch's avatar
WIP    
Lucas Moesch committed
123

124
125
		//source->vdlChL->SetDelayTime(toaDistance + toaSourceChL);
		//source->vdlChR->SetDelayTime(toaDistance + toSourceaChR);
126
127
128
129
130
131
132
133

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

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

134
	// convolve here!
135

136
137
138
	_FIRConvolverChL->Process((*_output)[0].data(), (*_output)[0].data(), ITABase::MixingMethod::OVERWRITE);
	_FIRConvolverChR->Process((*_output)[1].data(), (*_output)[1].data(), ITABase::MixingMethod::OVERWRITE);

139
140
141
	return _output;
}

142
143
144
double
VABinauralCluster::getDistError(VABinauralSoundSource* source)
{
145
146
	VAVec3 sourceToListenerPos = source->predPos - _listenerPos;
	double dotp = _clusterSourceToListenerPos.Dot(sourceToListenerPos);
147

148
	return (dotp * dotp) / (_clusterSourcePos.Dot(_clusterSourcePos) * sourceToListenerPos.Dot(sourceToListenerPos));
149
150
151
}

void 
Lucas Moesch's avatar
WIP    
Lucas Moesch committed
152
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source)
153
154
155
{
	double err = getDistError(source);

Lucas Moesch's avatar
wip    
Lucas Moesch committed
156
	_clusterSourcePos = (source->predPos + _clusterSourcePos * numSources) / (numSources + 1);
157
158
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

159
160
	maxError = std::max(err, maxError);

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

163
164
165
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
166
	++numSources;
167
168
169
}

void
170
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source, double error)
171
{
Lucas Moesch's avatar
wip    
Lucas Moesch committed
172
	_clusterSourcePos = (source->predPos + _clusterSourcePos * numSources) / (numSources + 1);
173
174
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

175
176
	maxError = std::max(error, maxError);

177
178
179
180
	_sources.insert(std::pair<int, VABinauralSoundSource*>(sourceID, source));
	// --
	source->AddReference();

Lucas Moesch's avatar
wip    
Lucas Moesch committed
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
	++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;

199
200
}