VABinauralCluster.cpp 3.43 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 15 16 17 18 19 20 21 22 23
VABinauralCluster::VABinauralCluster()
{
}

VABinauralCluster::VABinauralCluster(const VABinauralCluster& cluster) :
	maxError(cluster.maxError),
	_numSources(cluster._numSources),
	_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();

57 58 59
	++_numSources;
}

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 85 86 87 88 89 90 91 92 93 94 95 96 97
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);

		// add general distance VDL
		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;
}

98 99 100
double
VABinauralCluster::getDistError(VABinauralSoundSource* source)
{
101 102
	VAVec3 sourceToListenerPos = source->predPos - _listenerPos;
	double dotp = _clusterSourceToListenerPos.Dot(sourceToListenerPos);
103

104
	return (dotp * dotp) / (_clusterSourcePos.Dot(_clusterSourcePos) * sourceToListenerPos.Dot(sourceToListenerPos));
105 106 107
}

void 
Lucas Moesch's avatar
WIP  
Lucas Moesch committed
108
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source)
109 110 111 112
{
	double err = getDistError(source);

	_clusterSourcePos = (source->predPos + _clusterSourcePos * _numSources) / (_numSources + 1);
113 114
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

115 116
	maxError = std::max(err, maxError);

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

119 120 121
	// --
	source->AddReference();

122 123 124 125
	++_numSources;
}

void
126
VABinauralCluster::addSource(int sourceID, VABinauralSoundSource* source, double error)
127 128
{
	_clusterSourcePos = (source->predPos + _clusterSourcePos * _numSources) / (_numSources + 1);
129 130
	_clusterSourceToListenerPos = _clusterSourcePos - _listenerPos;

131 132
	maxError = std::max(error, maxError);

133 134 135 136
	_sources.insert(std::pair<int, VABinauralSoundSource*>(sourceID, source));
	// --
	source->AddReference();

137 138 139
	++_numSources;
}