diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp index 9148ac142d6e69111e8fea1f93c9088f84243eaf..348526ec71ae67918387c1f0f91930bdfd204e10 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp @@ -3,7 +3,11 @@ #include #include "VABinauralCluster.h" +// ITA includes +#include + // Utils +#include "../RelationMetrics/VARelationMetrics.h" #include "../BinauralTimeOfArrivalEstimator/VABinauralTOAEstimator.h" VABinauralCluster::VABinauralCluster() @@ -88,6 +92,13 @@ VABinauralCluster::getOutput() // reset output Buffer _output->zero(); + // 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); + // set VDL Values std::map::const_iterator it; for (it = _sources.begin(); it != _sources.end(); ++it) @@ -95,18 +106,16 @@ VABinauralCluster::getOutput() VABinauralSoundSource* source = it->second; const ITASampleBuffer* input = source->data->pSignalSourceInputBuf; - VAVec3 sourceToListenerPos = source->predPos - _listenerPos; - sourceToListenerPos.Norm(); + VARelationMetrics sourceMetrics; + sourceMetrics.calc(_listener->predPos, _listener->predView, _listener->predUp, source->predPos); - double phi = atan2(sourceToListenerPos.y, sourceToListenerPos.x); - double theta = acos(sourceToListenerPos.z); - - //TODO: add general distance VDL - double toaChL = _listener->toaEstimator->getTOALeft(phi, theta); - double toaChR = _listener->toaEstimator->getTOARight(phi, theta); + 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); - source->vdlChL->SetDelayTime(toaChL); - source->vdlChR->SetDelayTime(toaChR); + source->vdlChL->SetDelayTime(toaDistance + toaSourceChL - toaHRTFChL); + source->vdlChR->SetDelayTime(toaDistance + toSourceaChR - toaHRTFChR); source->vdlChL->Process(input, &(_tmpChL)); source->vdlChR->Process(input, &(_tmpChR)); @@ -115,7 +124,7 @@ VABinauralCluster::getOutput() (*_output)[1] += _tmpChR; } - // convolve + // convolve here! return _output; } diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8ef63724bf472fd39c7da2d19442a6d0131272bf --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.cpp @@ -0,0 +1,24 @@ +#include "VARelationMetrics.h" + + +VARelationMetrics::VARelationMetrics() +{ +} + + +VARelationMetrics::~VARelationMetrics() +{ +} + +void +VARelationMetrics::calc(const VAVec3& sourcePos, const VAVec3& sourceView, const VAVec3& sourceUp, const VAVec3& targetPos) +{ + VAVec3 relTargetPos = targetPos - sourcePos; + VAVec3 sourceViewMinusZ = sourceView * (-1.0f); + VAVec3 sourceRight = sourceViewMinusZ.Cross(sourceUp); + + dist = relTargetPos.Length(); + relTargetPos = relTargetPos / dist; + phi = atan2(relTargetPos.Dot(sourceRight), relTargetPos.Dot(sourceViewMinusZ)); + theta = asin(relTargetPos.Dot(sourceUp)); +} diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h new file mode 100644 index 0000000000000000000000000000000000000000..affa01087a176d38380120b2ce0a3d20078e97b8 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/VARelationMetrics.h @@ -0,0 +1,21 @@ +#ifndef IW_VACORE_RELATIONMETRICS +#define IW_VACORE_RELATIONMETRICS + +// VA Includes +#include + +class VARelationMetrics +{ +public: + double theta; + double phi; + double dist; + + VARelationMetrics(); + ~VARelationMetrics(); + + void + calc(const VAVec3& sourcePos, const VAVec3& sourceView, const VAVec3& sourceUp, const VAVec3& targetPos); +}; + +#endif \\ IW_VACORE_RELATIONMETRICS \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake new file mode 100644 index 0000000000000000000000000000000000000000..0a05292bbbb83893d80ff80d0e885529c3c19860 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/RelationMetrics/_SourceFiles.cmake @@ -0,0 +1,19 @@ +# $Id:$ + +set( RelativeDir "src/Rendering/Binaural/RealTime/Utils/RelationMetrics" ) +set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils\\RelationMetrics" ) + +set( DirFiles + VARelationMetrics.cpp + VARelationMetrics.h + _SourceFiles.cmake +) +set( DirFiles_SourceGroup "${RelativeSourceGroup}" ) + +set( LocalSourceGroupFiles ) +foreach( File ${DirFiles} ) + list( APPEND LocalSourceGroupFiles "${RelativeDir}/${File}" ) + list( APPEND ProjectSources "${RelativeDir}/${File}" ) +endforeach() +source_group( ${DirFiles_SourceGroup} FILES ${LocalSourceGroupFiles} ) + diff --git a/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake index 68e21508a853366b4347ba453cf5dba7e74ec762..bd6f21ed21e17f5e0303229cc35215e79502bfab 100644 --- a/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake +++ b/src/Rendering/Binaural/RealTime/Utils/_SourceFiles.cmake @@ -2,7 +2,7 @@ set( RelativeDir "src/Rendering/Binaural/Realtime/Utils" ) set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils" ) -set( SubDirs BinauralListener BinauralClusterEngine BinauralSoundSource BinauralTimeOfArrivalEstimator) +set( SubDirs BinauralListener BinauralClusterEngine BinauralSoundSource BinauralTimeOfArrivalEstimator RelationMetrics) set( DirFiles _SourceFiles.cmake diff --git a/src/Utils/VAUtils.cpp b/src/Utils/VAUtils.cpp index b95e8b991b3a666c8448731d4a93f3c0fdc4c351..07874645c3026703f8d46ec974daef90339c013f 100644 --- a/src/Utils/VAUtils.cpp +++ b/src/Utils/VAUtils.cpp @@ -276,7 +276,6 @@ double GetElevationOnTarget_DEG( const VAVec3& vOriginPos, const VAVec3& vView, { VAVec3 vDir = vTargetPos - vOriginPos; vDir.Norm(); - const VAVec3 vRight = vView.Cross( vUp ); const double dElevationAngleDeg = asin( vDir.Dot( vUp ) ) * 180.0f / ITAConstants::PI_D; return dElevationAngleDeg; }