From 665fbd6eb643171446ecfdeba513b7db9970711f Mon Sep 17 00:00:00 2001 From: Lucas Moesch Date: Tue, 2 Oct 2018 15:12:13 +0200 Subject: [PATCH] WIP - added convolver initialization. --- .../VABinauralCluster.cpp | 18 ++++--- .../BinauralClusterEngine/VABinauralCluster.h | 9 +++- .../VABinauralClusterEngine.cpp | 6 +-- .../VABinauralClusterEngine.h | 3 +- .../VABinauralClustering.cpp | 47 +++++++++++++++++-- .../VABinauralClustering.h | 20 +++++--- .../VABinauralClusteringPoolFactory.cpp | 5 +- .../VABinauralClusteringPoolFactory.h | 4 +- .../VABinauralClusteringState.cpp | 25 ++++++---- .../VABinauralClusteringState.h | 7 ++- .../VABinauralSoundSource.cpp | 4 +- .../RealTime/VABinauralRealTimeRenderer.cpp | 4 +- src/Rendering/VAAudioRendererRegistry.cpp | 5 -- 13 files changed, 111 insertions(+), 46 deletions(-) diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp index 3e2b3a6..1f43bd0 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp @@ -39,8 +39,10 @@ VABinauralCluster::~VABinauralCluster() } void -VABinauralCluster::init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener) +VABinauralCluster::init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener, ITAUPConvolution* FIRConvolverChL, ITAUPConvolution* FIRConvolverChR) { + _FIRConvolverChL = FIRConvolverChL; + _FIRConvolverChR = FIRConvolverChR; _listener = listener; _listenerPos = listener->predPos; _clusterSourcePos = _clusterSourcePos + source->predPos; @@ -64,6 +66,8 @@ VABinauralCluster::init(int sourceID, VABinauralSoundSource* source, VABinauralL void VABinauralCluster::init(VABinauralCluster* cluster) { + _FIRConvolverChL = cluster->_FIRConvolverChL; + _FIRConvolverChR = cluster->_FIRConvolverChR; _listener = cluster->_listener; _listenerPos = _listener->predPos; _clusterSourcePos = cluster->_clusterSourcePos; @@ -114,12 +118,11 @@ VABinauralCluster::getOutput() double toaSourceChL = _listener->toaEstimator->getTOALeft(sourceMetrics.phi, sourceMetrics.theta); double toSourceaChR = _listener->toaEstimator->getTOARight(sourceMetrics.phi, sourceMetrics.theta); - //source->vdlChL->SetDelayTime(toaDistance + toaSourceChL - toaHRTFChL); - //source->vdlChR->SetDelayTime(toaDistance + toSourceaChR - toaHRTFChR); - - source->vdlChL->SetDelayTime(toaDistance + toaSourceChL); - source->vdlChR->SetDelayTime(toaDistance + toSourceaChR); + source->vdlChL->SetDelayTime(toaDistance + toaSourceChL - toaHRTFChL); + source->vdlChR->SetDelayTime(toaDistance + toSourceaChR - toaHRTFChR); + //source->vdlChL->SetDelayTime(toaDistance + toaSourceChL); + //source->vdlChR->SetDelayTime(toaDistance + toSourceaChR); source->vdlChL->Process(input, &(_tmpChL)); source->vdlChR->Process(input, &(_tmpChR)); @@ -130,6 +133,9 @@ VABinauralCluster::getOutput() // convolve here! + _FIRConvolverChL->Process((*_output)[0].data(), (*_output)[0].data(), ITABase::MixingMethod::OVERWRITE); + _FIRConvolverChR->Process((*_output)[1].data(), (*_output)[1].data(), ITABase::MixingMethod::OVERWRITE); + return _output; } diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h index ef463fa..1e27d7f 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h @@ -4,6 +4,9 @@ // VA Includes #include +// ITA includes +#include + // Utils #include "../BinauralSoundSource/VABinauralSoundSource.h" #include "../BinauralListener/VABinauralListener.h" @@ -22,7 +25,7 @@ public: ~VABinauralCluster(); void - init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener); + init(int sourceID, VABinauralSoundSource* source, VABinauralListener* listener, ITAUPConvolution* FIRConvolverChL, ITAUPConvolution* FIRConvolverChR); void init(VABinauralCluster* cluster); @@ -53,13 +56,15 @@ private: VABinauralListener* _listener; + ITAUPConvolution* _FIRConvolverChL; + ITAUPConvolution* _FIRConvolverChR; + VAVec3 _listenerPos; VAVec3 _clusterSourcePos; VAVec3 _clusterSourceToListenerPos; std::map _sources; - double cummulativeMovingAverage(int n, double average, double value); }; diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp index 5073ce2..1e62341 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp @@ -7,9 +7,9 @@ #include "./VABinauralClusteringPoolFactory.h"> -VABinauralClusterEngine::VABinauralClusterEngine() +VABinauralClusterEngine::VABinauralClusterEngine(int blocklength) { - IVAPoolObjectFactory* clusteringFactory = new VABinauralClusteringPoolFactory(); + IVAPoolObjectFactory* clusteringFactory = new VABinauralClusteringPoolFactory(blocklength); _clusteringPool = IVAObjectPool::Create(16, 2, clusteringFactory, true); } @@ -70,7 +70,7 @@ VABinauralClusterEngine::addListener(int listenerID, VABinauralListener* listene { VABinauralClustering* clustering = dynamic_cast< VABinauralClustering* >(_clusteringPool->RequestObject()); // Reference = 1 - clustering->init(listenerID, listener, conf.numCluster); + clustering->init(listenerID, listener, conf.numCluster, conf.HRIRFilterLength); // add local reference _clusterings.insert(std::pair< int, VABinauralClustering* >(listenerID, clustering)); diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h index 2940fdc..6f169f2 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h @@ -19,13 +19,14 @@ class VABinauralClusterEngine public: struct clusterConfig_t { int numCluster; + int HRIRFilterLength; }; std::map< int, VABinauralClustering* > _clusterings; ~VABinauralClusterEngine(); - VABinauralClusterEngine(); + VABinauralClusterEngine(int blocklength); void update(); diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp index 6230ec2..e3da4cc 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp @@ -8,14 +8,18 @@ // VA #include +// ITA includes +#include + // Utils #include "./VABinauralClustering.h" #include "./VABinauralClusterPoolFactory.h" -VABinauralClustering::VABinauralClustering() +VABinauralClustering::VABinauralClustering(int blocklength) : +_blocklength(blocklength) { IVAPoolObjectFactory* clusterFactory = new VABinauralClusterPoolFactory(); - _clusterPool = IVAObjectPool::Create(16, 2, clusterFactory, true); + clusterPool = IVAObjectPool::Create(16, 2, clusterFactory, true); }; VABinauralClustering::~VABinauralClustering(){}; @@ -33,8 +37,9 @@ VABinauralClustering::removeSource(int sourceID) } void -VABinauralClustering::init(int listenerID, VABinauralListener* listener, int numClusters) +VABinauralClustering::init(int listenerID, VABinauralListener* listener, int numClusters, int HRIRFilterLength) { + _HRIRFilterLength = HRIRFilterLength; _listenerID = listenerID; _listener = listener; _numClusters = numClusters; @@ -42,7 +47,41 @@ VABinauralClustering::init(int listenerID, VABinauralListener* listener, int num _output = new ITASampleFrame(2, listener->output->GetLength(), true); - _curState.reset(new VABinauralClusteringState(_numClusters, _listener)); + // initialize left channel convolver for each cluster + for (int i = 0; i < _numClusters; ++i) + { + ITAUPConvolution* convChL = new ITAUPConvolution(_blocklength, _HRIRFilterLength); + + convChL->SetFilterExchangeFadingFunction(ITABase::FadingFunction::COSINE_SQUARE); + convChL->SetFilterCrossfadeLength((std::min)(_blocklength, 32)); + convChL->SetGain(0.0f, true); + + ITAUPFilter* HRIRFilterChL = convChL->RequestFilter(); + HRIRFilterChL->identity(); + + convChL->ExchangeFilter(HRIRFilterChL); + + FIRConvolverChL.insert(std::pair< int, ITAUPConvolution* >(i, convChL)); + } + + // initialize right channel convolver for each cluster + for (int i = 0; i < _numClusters; ++i) + { + ITAUPConvolution* convChR = new ITAUPConvolution(_blocklength, _HRIRFilterLength); + + convChR->SetFilterExchangeFadingFunction(ITABase::FadingFunction::COSINE_SQUARE); + convChR->SetFilterCrossfadeLength((std::min)(_blocklength, 32)); + convChR->SetGain(0.0f, true); + + ITAUPFilter* HRIRFilterChR = convChR->RequestFilter(); + HRIRFilterChR->identity(); + + convChR->ExchangeFilter(HRIRFilterChR); + + FIRConvolverChR.insert(std::pair< int, ITAUPConvolution* >(i, convChR)); + } + + _curState.reset(new VABinauralClusteringState(_numClusters, _listener, clusterPool, &FIRConvolverChL, &FIRConvolverChR)); } ITASampleFrame* diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h index 7e0fc3c..41663bb 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h @@ -19,12 +19,17 @@ class VABinauralClustering : public CVAPoolObject // friend VABinauralClusteringState; public: + IVAObjectPool* clusterPool; + + std::map< int, ITAUPConvolution* > FIRConvolverChL; + std::map< int, ITAUPConvolution* > FIRConvolverChR; + ~VABinauralClustering(); - VABinauralClustering(); + VABinauralClustering(int blocklength); void - init(int listenerID, VABinauralListener* listener, int numClusters); + init(int listenerID, VABinauralListener* listener, int numClusters, int HRIRFilterLength); ITASampleFrame* getOutput(); @@ -40,19 +45,20 @@ public: private: + int _HRIRFilterLength; + int _blocklength; int _listenerID; int _numClusters; double _threshold; ITASampleFrame* _output; - - std::unique_ptr _curState; - std::unique_ptr _nextState; - VABinauralListener* _listener; - IVAObjectPool* _clusterPool; std::set< int > _delSourceIDs; + + std::unique_ptr _curState; + std::unique_ptr _nextState; + std::map< int, VABinauralSoundSource* > _unassignedSources; std::map< int, VABinauralSoundSource* > _assignedSources; diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp index 018e7fd..c243dd1 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp @@ -1,7 +1,8 @@ #include "VABinauralClusteringPoolFactory.h" #include "VABinauralClustering.h" -VABinauralClusteringPoolFactory::VABinauralClusteringPoolFactory() +VABinauralClusteringPoolFactory::VABinauralClusteringPoolFactory(int blocklength) : + _blocklength(blocklength) { } @@ -13,5 +14,5 @@ VABinauralClusteringPoolFactory::~VABinauralClusteringPoolFactory() CVAPoolObject* VABinauralClusteringPoolFactory::CreatePoolObject() { - return new VABinauralClustering(); + return new VABinauralClustering(_blocklength); }; \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h index 8c4c586..cae0439 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h @@ -8,12 +8,14 @@ class VABinauralClusteringPoolFactory : public IVAPoolObjectFactory { public: - VABinauralClusteringPoolFactory(); + VABinauralClusteringPoolFactory(int blocklength); ~VABinauralClusteringPoolFactory(); CVAPoolObject* CreatePoolObject(); +private: + int _blocklength; }; #endif // IW_VACORE_BINAURALCLUSTERINGPOOLFACTORY \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp index 0c2aa5a..36f8f00 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp @@ -10,34 +10,39 @@ #include "./VABinauralClusterPoolFactory.h" -VABinauralClusteringState::VABinauralClusteringState(int numClusters, VABinauralListener* listener) : +VABinauralClusteringState::VABinauralClusteringState(int numClusters, VABinauralListener* listener, IVAObjectPool* clusterPool, std::map* FIRConvolverChL, std::map* FIRConvolverChR) : numClusters(numClusters), - listener(listener) + listener(listener), + _clusterPool(clusterPool), + _FIRConvolverChL(FIRConvolverChL), + _FIRConvolverChR(FIRConvolverChR) { + for (int i = numClusters - 1; i >= 0; --i) { freeClusterIDs.push(i); } - - IVAPoolObjectFactory* clusterFactory = new VABinauralClusterPoolFactory(); - _clusterPool = IVAObjectPool::Create(16, 2, clusterFactory, true); } VABinauralClusteringState::~VABinauralClusteringState() { + for (auto &const clusterIt : clusters) + { + clusterIt.second->RemoveReference(); + } } VABinauralClusteringState::VABinauralClusteringState(const VABinauralClusteringState& state) : numClusters(state.numClusters), listener(state.listener), sourceClusterReference(state.sourceClusterReference), - freeClusterIDs(state.freeClusterIDs) + freeClusterIDs(state.freeClusterIDs), + _clusterPool(state._clusterPool), + _FIRConvolverChL(state._FIRConvolverChL), + _FIRConvolverChR(state._FIRConvolverChR) { - IVAPoolObjectFactory* clusterFactory = new VABinauralClusterPoolFactory(); - _clusterPool = IVAObjectPool::Create(16, 2, clusterFactory, true); - std::map< int, VABinauralCluster* >::const_iterator it; for (it = state.clusters.begin(); it != state.clusters.end(); ++it) { @@ -104,7 +109,7 @@ VABinauralClusteringState::createCluster(int sourceID, VABinauralSoundSource* s int clusterID = freeClusterIDs.back(); VABinauralCluster* cluster = dynamic_cast< VABinauralCluster* >(_clusterPool->RequestObject()); // Reference = 1 - cluster->init(sourceID, source, listener); + cluster->init(sourceID, source, listener, _FIRConvolverChL->find(clusterID)->second, _FIRConvolverChR->find(clusterID)->second); clusters.insert(std::pair< int, VABinauralCluster* >(clusterID, cluster)); freeClusterIDs.pop(); diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h index 09f27ea..43b4ede 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h @@ -7,6 +7,9 @@ #include #include +// ITA includes +#include + // Utils #include "VABinauralCluster.h" #include "../BinauralSoundSource/VABinauralSoundSource.h" @@ -23,7 +26,7 @@ public: VABinauralListener* listener; - VABinauralClusteringState(int numClusters, VABinauralListener* listener); + VABinauralClusteringState(int numClusters, VABinauralListener* listener, IVAObjectPool* clusterPool, std::map* FIRConvolverCHL, std::map* FIRConvolverCHR); VABinauralClusteringState(const VABinauralClusteringState& state); @@ -44,6 +47,8 @@ public: double getMaxError(); private: + std::map* _FIRConvolverChL; + std::map* _FIRConvolverChR; IVAObjectPool* _clusterPool; }; diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp index f510983..7bff158 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp @@ -4,8 +4,8 @@ VABinauralSoundSource::VABinauralSoundSource(const config_t& conf) : conf( conf ) { - vdlChL = new CITAVariableDelayLine(conf.sampleRate, conf.blockLength, 3. * conf.sampleRate, CITAVariableDelayLine::CUBIC_SPLINE_INTERPOLATION); - vdlChR = new CITAVariableDelayLine(conf.sampleRate, conf.blockLength, 3. * conf.sampleRate, CITAVariableDelayLine::CUBIC_SPLINE_INTERPOLATION); + vdlChL = new CITAVariableDelayLine(conf.sampleRate, conf.blockLength, 3. * conf.sampleRate, CITAVariableDelayLine::SWITCH); + vdlChR = new CITAVariableDelayLine(conf.sampleRate, conf.blockLength, 3. * conf.sampleRate, CITAVariableDelayLine::SWITCH); } diff --git a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp index fc1574f..baa3a02 100644 --- a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp +++ b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp @@ -27,7 +27,7 @@ VABinauralRealTimeRenderer::VABinauralRealTimeRenderer( const CVAAudioRendererIn _curSceneState(NULL), _indicateReset(false), _resetAck(false), - _clusterEngine() + _clusterEngine(GetBlocklength()) { init(*_params.pConfig); @@ -345,7 +345,7 @@ VABinauralRealTimeRenderer::createListener(int listenerID, const CVAReceiverStat _listeners.insert(std::pair< int, VABinauralListener* >(listenerID, listener)); // add listener to clustering - VABinauralClusterEngine::clusterConfig_t config = { /*numClusters=*/ 9 }; + VABinauralClusterEngine::clusterConfig_t config = { /*numClusters=*/ 9, /*hrirFilterLength*/ _hrirFilterLength}; _clusterEngine.addListener(listenerID, listener, config); } diff --git a/src/Rendering/VAAudioRendererRegistry.cpp b/src/Rendering/VAAudioRendererRegistry.cpp index 2e4b2ca..1a8efa8 100644 --- a/src/Rendering/VAAudioRendererRegistry.cpp +++ b/src/Rendering/VAAudioRendererRegistry.cpp @@ -91,15 +91,10 @@ void CVAAudioRendererRegistry::RegisterInternalCoreFactoryMethods() #endif #ifdef VACORE_WITH_RENDERER_BINAURAL_ROOM_ACOUSTICS RegisterRendererDefaultFactory< CVARoomAcousticsAudioRenderer>( "BinauralRoomAcoustics" ); -<<<<<<< HEAD #endif // VACORE_WITH_RENDERER_BINAURAL_ROOM_ACOUSTICS #ifdef VACORE_WITH_RENDERER_BINAURAL_REAL_TIME RegisterRendererDefaultFactory< VABinauralRealTimeRenderer>("BinauralRealTime"); #endif // VACORE_WITH_RENDERER_BINAURAL_REAL_TIME -======= -#endif ->>>>>>> develop - // Prototyping #ifdef VACORE_WITH_RENDERER_PROTOTYPE_FREE_FIELD RegisterRendererDefaultFactory< CVAPrototypeFreeFieldAudioRenderer >( "PrototypeFreeField" ); -- GitLab