diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp index 3e2b3a6ccf1503af953c430ca83cbbc49f7de704..1f43bd066e80101539d8ce258a4638158144d9c7 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 ef463fa8b52737bf1ae309a74ea5db53d8521110..1e27d7f16fbd1a902bfe4632cb63f76e88abb29a 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 5073ce26aeaae07fef41f34c66114cb50446cc9b..1e62341ca7c8d57a092ca9a133c5a5159f9b9549 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 2940fdcd001aee4c1de5018f3669bc34ddd3b5c7..6f169f20167783c8d465c49be69f85652ac484b4 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 6230ec2cfb6ea9280243f8eca1b9d6e6c9f79501..e3da4cc815fb5acf23742de9dc48379f231b0696 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 7e0fc3c0fbf25430c94752871309def42632d7d0..41663bb35bde935411c7200b5acd81bc28388d35 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 018e7fd85c6657c15aa493344d358d4b0a945b43..c243dd1828c422098443b2f260f096229ae5a74f 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 8c4c5867201a502ef8b81ff68bfb039b7ce1fc14..cae043974cb8f39bbf2fc8497ab989650571ac29 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 0c2aa5aced93eb23344f77537baa1051ecc4dec4..36f8f0076f360ba21df429181df5af9a9286ae6e 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 09f27eaf9d32cb8a621616cb67eafbadda733dfc..43b4ede5890421f58e18caf2bf67659b90daa93c 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 f51098399a842b85a14037179c4c47afeda912a5..7bff1587b20f1012350b1bdbcb9923ce54fd33bc 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 fc1574fd7c189c034c48b788deadb49cf1878f42..baa3a02e79030d0bf8e9911948a6b4f12c71fd80 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 2e4b2ca0d979c35568f43ab083d25cec8d5ab7cf..1a8efa813576915c922c91d90c858c6e7d6a4eeb 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" );