From 80371cdaaf0ee5c19953e93ead66c9a5cd6d668b Mon Sep 17 00:00:00 2001 From: Lucas Moesch Date: Thu, 16 Aug 2018 15:10:19 +0200 Subject: [PATCH] Initial clustering setup for real time renddering added. --- .../VABinauralCluster.cpp | 56 ++++ .../BinauralClusterEngine/VABinauralCluster.h | 49 ++++ .../VABinauralClusterEngine.cpp | 59 ++++ .../VABinauralClusterEngine.h | 55 ++++ .../VABinauralClusterPoolFactory.cpp | 19 ++ .../VABinauralClusterPoolFactory.h | 18 ++ .../VABinauralClustering.cpp | 66 +++++ .../VABinauralClustering.h | 55 ++++ .../VABinauralClusteringPoolFactory.cpp | 17 ++ .../VABinauralClusteringPoolFactory.h | 19 ++ .../VABinauralClusteringState.cpp | 103 +++++++ .../VABinauralClusteringState.h | 41 +++ .../BinauralClusterEngine/_SourceFiles.cmake | 29 ++ .../BinauralListener/VABinauralListener.cpp | 32 ++- .../BinauralListener/VABinauralListener.h | 48 +++- .../VABinauralListenerPoolFactory.cpp | 13 + .../VABinauralListenerPoolFactory.h | 22 ++ .../Utils/BinauralListener/_SourceFiles.cmake | 2 + .../VABinauralSoundSource.cpp | 32 +++ .../VABinauralSoundSource.h | 47 ++++ .../VABinauralSoundSourcePoolFactory.cpp | 19 ++ .../VABinauralSoundSourcePoolFactory.h | 22 ++ .../BinauralSoundSource/_SourceFiles.cmake | 21 ++ .../RealTime/Utils/_SourceFiles.cmake | 2 +- .../RealTime/VABinauralRealTimeRenderer.cpp | 258 +++++++++++++++++- .../RealTime/VABinauralRealTimeRenderer.h | 50 +++- src/Rendering/VAAudioRendererRegistry.cpp | 4 + 27 files changed, 1136 insertions(+), 22 deletions(-) create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/_SourceFiles.cmake create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.cpp create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.h create mode 100644 src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/_SourceFiles.cmake diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp new file mode 100644 index 0000000..f3090ff --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.cpp @@ -0,0 +1,56 @@ +#include "VABinauralCluster.h" + +VABinauralCluster::VABinauralCluster() +{ +} + +VABinauralCluster::VABinauralCluster(const VABinauralCluster& cluster) : + maxError(cluster.maxError), + _numSources(cluster._numSources), + _clusterSourcePos(cluster._clusterSourcePos) +{ + +} + + +VABinauralCluster::~VABinauralCluster() +{ +} + +void +VABinauralCluster::init(VABinauralSoundSource* source) +{ + _clusterSourcePos = _clusterSourcePos + source->predPos; + maxError = getDistError(source); + + ++_numSources; +} + +double +VABinauralCluster::getDistError(VABinauralSoundSource* source) +{ + double dotp = _clusterSourcePos.Dot(source->predPos); + + return ((dotp * dotp) / (_clusterSourcePos.Dot(_clusterSourcePos)) * (source->predPos.Dot(source->predPos))); +} + +void +VABinauralCluster::addSource(VABinauralSoundSource* source) +{ + double err = getDistError(source); + + _clusterSourcePos = (source->predPos + _clusterSourcePos * _numSources) / (_numSources + 1); + maxError = std::max(err, maxError); + + ++_numSources; +} + +void +VABinauralCluster::addSource(VABinauralSoundSource* source, double error) +{ + _clusterSourcePos = (source->predPos + _clusterSourcePos * _numSources) / (_numSources + 1); + maxError = std::max(error, maxError); + + ++_numSources; +} + diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h new file mode 100644 index 0000000..bbc56ca --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralCluster.h @@ -0,0 +1,49 @@ +#ifndef IW_VACORE_BINAURALCLUSTER +#define IW_VACORE_BINAURALCLUSTER + +// VA Includes +#include + +// Utils +#include "../BinauralSoundSource/VABinauralSoundSource.h" + + +class VABinauralCluster : public CVAPoolObject +{ +public: + double maxError; + + VABinauralCluster(); + + VABinauralCluster(const VABinauralCluster& cluster); + + ~VABinauralCluster(); + + void + init(VABinauralSoundSource* source); + + double + getDistError(VABinauralSoundSource* source); + + void + addSource(VABinauralSoundSource* source); + + void + addSource(VABinauralSoundSource* source, double error); + + void + removeSource(); + + void + reset(); + +private: + int _numSources; + + VAVec3 _clusterSourcePos; + + double + cummulativeMovingAverage(int n, double average, double value); +}; + +#endif // IW_VACORE_BINAURALCLUSTER \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp new file mode 100644 index 0000000..68cc7b0 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.cpp @@ -0,0 +1,59 @@ +#include "VABinauralClusterEngine.h" + +// VA includes +#include + + +VABinauralClusterEngine::VABinauralClusterEngine() +{ + +} + + +VABinauralClusterEngine::~VABinauralClusterEngine() +{ +} + +void +VABinauralClusterEngine::update() +{ + std::map< int, VABinauralClustering* >::iterator it; + for (it = _clusterings.begin(); it != _clusterings.end(); ++it) + { + it->second->update(); + } +} + +void +VABinauralClusterEngine::addSource( int sourceID, VABinauralSoundSource* source ) +{ + std::map< int, VABinauralClustering* >::iterator it; + for (it = _clusterings.begin(); it != _clusterings.end(); ++it) + { + it->second->addSource(sourceID, source); + } +} + +void +VABinauralClusterEngine::addListener(int listenerID, VABinauralListener* listener, clusterConfig_t& conf) +{ + VABinauralClustering* clustering = dynamic_cast< VABinauralClustering* >(_clusteringPool->RequestObject()); // Reference = 1 + + clustering->init(listenerID, listener, conf.numCluster); + + // add local reference + _clusterings.insert(std::pair< int, VABinauralClustering* >(listenerID, clustering)); + +} + +void +VABinauralClusterEngine::removeListener(int listenerID) +{ + std::map< int, VABinauralClustering* >::iterator it = _clusterings.find(listenerID); + VABinauralClustering* listener = it->second; + _clusterings.erase(it); + + /* + TODO: foreach cluster in CL delete cluster + */ +} diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h new file mode 100644 index 0000000..f76e749 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterEngine.h @@ -0,0 +1,55 @@ +#ifndef IW_VACORE_BINAURALCLUSTERENGINE +#define IW_VACORE_BINAURALCLUSTERENGINE + +// VA includes +#include + + +// ITA includes + + +// Utils +#include "../BinauralListener/VABinauralListener.h" +#include "../BinauralSoundSource/VABinauralSoundSource.h" +#include "./VABinauralClustering.h" +#include "./VABinauralCluster.h" + +class VABinauralClusterEngine +{ +public: + struct clusterConfig_t { + int numCluster; + }; + + ~VABinauralClusterEngine(); + + VABinauralClusterEngine(); + + void + update(); + + void + addSource( int sourceID, VABinauralSoundSource* source ); + + void + addListener( int listenerID, VABinauralListener* listener,clusterConfig_t& conf ); + + void + removeListener( int listenerID ); + + void + removeSource( int sourceID ); + +private: + std::map< int, VABinauralSoundSource* > _newSources; + std::map< int, VABinauralClustering* > _clusterings; + + IVAObjectPool* _sourcePool; + IVAObjectPool* _clusteringPool; + + //std::map< int, VABinauralSoundSource* > _sources; + //std::map< int, VABinauralListener* > _listener; + +}; + +#endif // IW_VACORE_BINAURALCLUSTERENGINE diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.cpp new file mode 100644 index 0000000..e6bc436 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.cpp @@ -0,0 +1,19 @@ +#include "VABinauralClusterPoolFactory.h" + +// Utils +#include "./VABinauralCluster.h" + +VABinauralClusterPoolFactory::VABinauralClusterPoolFactory() +{ +} + + +VABinauralClusterPoolFactory::~VABinauralClusterPoolFactory() +{ +} + +CVAPoolObject* +VABinauralClusterPoolFactory::CreatePoolObject() +{ + return new VABinauralCluster(); +}; \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.h new file mode 100644 index 0000000..8d3fe22 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusterPoolFactory.h @@ -0,0 +1,18 @@ +#ifndef IW_VACORE_BINAURALCLUSTERPOOLFACTORY +#define IW_VACORE_BINAURALCLUSTERPOOLFACTORY + +// VA Includes +#include +#include + +class VABinauralClusterPoolFactory : public IVAPoolObjectFactory +{ +public: + VABinauralClusterPoolFactory(); + ~VABinauralClusterPoolFactory(); + + CVAPoolObject* CreatePoolObject(); +}; + +#endif // IW_VACORE_BINAURALCLUSTERPOOLFACTORY + diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp new file mode 100644 index 0000000..9feb46c --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.cpp @@ -0,0 +1,66 @@ +#define NOMINMAX + +#include +#include + +#include + +// VA +#include + +// Utils +#include "./VABinauralClustering.h" +#include "./VABinauralClusterPoolFactory.h" + +VABinauralClustering::~VABinauralClustering() +{ + IVAPoolObjectFactory* clusterFactory = new VABinauralClusterPoolFactory(); + _clusterPool = IVAObjectPool::Create(16, 2, clusterFactory, true); +}; + +VABinauralClustering::VABinauralClustering(){}; + +void +VABinauralClustering::addSource(int sourceID, VABinauralSoundSource* source) +{ + _unassignedSources.insert(std::pair< int, VABinauralSoundSource* >(sourceID, source)); +}; + +void +VABinauralClustering::init(int listenerID, VABinauralListener* listener, int numClusters) +{ + _listenerID = listenerID; + _listener = listener; + _numClusters = numClusters; + _threshold = cos(180. / numClusters) * cos(180. / numClusters); +} + +void +VABinauralClustering::update() +{ + VABinauralClusteringState* state = new VABinauralClusteringState(*_clustering); + + // update unassigned sources + std::map< int , VABinauralSoundSource* >::iterator it; + + for (it = _unassignedSources.begin(); it != _unassignedSources.end(); ++it) + { + state->addSource(it->first, it->second, _threshold, 0); + } + + // TODO: refinement + for (it = _unassignedSources.begin(); it != _unassignedSources.end(); ++it) + { + _assignedSources.insert(std::pair< int, VABinauralSoundSource* >(it->first, it->second)); + } + + _unassignedSources.clear(); + + // TODO: update fixed clustertrajectories +} + +void +VABinauralClustering::PreRequest(){}; + +void +VABinauralClustering::PreRelease(){}; \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h new file mode 100644 index 0000000..4c3892e --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClustering.h @@ -0,0 +1,55 @@ +#ifndef IW_VACORE_BINAURALCLUSTERING +#define IW_VACORE_BINAURALCLUSTERING + +#include + +// VA Includes +#include +#include + +// Utils +#include "VABinauralCluster.h" +#include "VABinauralClusteringState.h" +#include "../BinauralListener/VABinauralListener.h" +#include "../BinauralSoundSource/VABinauralSoundSource.h" + +class VABinauralClustering : public CVAPoolObject +{ +public: + ~VABinauralClustering(); + + VABinauralClustering(); + + void + init(int listenerID, VABinauralListener* listener, int numClusters); + + void + update(); + + void + addSource(int sourceID, VABinauralSoundSource* source); + + +private: + int _listenerID; + int _numClusters; + double _threshold; + + VABinauralClusteringState* _clustering; + VABinauralListener* _listener; + IVAObjectPool* _clusterPool; + + std::map< int, VABinauralSoundSource* > _unassignedSources; + std::map< int, VABinauralSoundSource* > _assignedSources; + + std::pair< int, VABinauralCluster* > + assignCluster(VABinauralClusteringState* clustering, VABinauralSoundSource* source, double threshold, int numFreeClusters); + + void + PreRequest(); + + void + PreRelease(); +}; + +#endif // IW_VACORE_BINAURALCLUSTERING diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp new file mode 100644 index 0000000..018e7fd --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.cpp @@ -0,0 +1,17 @@ +#include "VABinauralClusteringPoolFactory.h" +#include "VABinauralClustering.h" + +VABinauralClusteringPoolFactory::VABinauralClusteringPoolFactory() +{ +} + + +VABinauralClusteringPoolFactory::~VABinauralClusteringPoolFactory() +{ +} + +CVAPoolObject* +VABinauralClusteringPoolFactory::CreatePoolObject() +{ + return new VABinauralClustering(); +}; \ 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 new file mode 100644 index 0000000..8c4c586 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringPoolFactory.h @@ -0,0 +1,19 @@ +#ifndef IW_VACORE_BINAURALCLUSTERINGPOOLFACTORY +#define IW_VACORE_BINAURALCLUSTERINGPOOLFACTORY + +// VA Includes +#include +#include + +class VABinauralClusteringPoolFactory : public IVAPoolObjectFactory +{ +public: + VABinauralClusteringPoolFactory(); + ~VABinauralClusteringPoolFactory(); + + CVAPoolObject* + CreatePoolObject(); + +}; + +#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 new file mode 100644 index 0000000..2d40dce --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.cpp @@ -0,0 +1,103 @@ +#define NOMINMAX + +#include + +// VA +#include + +// Utils +#include "VABinauralClusteringState.h" +#include "./VABinauralClusterPoolFactory.h" + + +VABinauralClusteringState::VABinauralClusteringState(int numClusters) +{ + for (int i = numClusters - 1; i >= 0; --i) + { + freeClusterIDs.push(i); + } +} + + +VABinauralClusteringState::~VABinauralClusteringState() +{ +} + +VABinauralClusteringState::VABinauralClusteringState(const VABinauralClusteringState& state) : + numClusters(state.numClusters), + sourceClusterReference(state.sourceClusterReference) +{ + std::map< int, VABinauralCluster* >::const_iterator it; + for (it = state.clusters.begin(); it != state.clusters.end(); ++it) + { + int clusterID = it->first; + VABinauralCluster* cluster = new VABinauralCluster(*(it->second)); + + clusters.insert(std::pair< int, VABinauralCluster* >(clusterID, cluster)); + } +} + +void +VABinauralClusteringState::addSource(int sourceID, VABinauralSoundSource* source, double threshold, int numBlockedClusters) +{ + int numFreeClusters = numClusters - numBlockedClusters - clusters.size(); + double err = 0, minerr = std::numeric_limits::infinity(); + + int nearestClusterID = -1; + VABinauralCluster* nearestCluster = nullptr; + + std::map< int, VABinauralCluster* >::iterator it; + + for (it = clusters.begin(); it != clusters.end(); ++it) + { + err = it->second->getDistError(source); + if (err < minerr) + { + minerr = err; + nearestClusterID = it->first; + nearestCluster = it->second; + } + } + + if ((minerr > threshold) && (numFreeClusters > 0)) + { + std::pair< int, VABinauralCluster*> p; + p = createCluster(source); + + nearestClusterID = p.first; + nearestCluster = p.second; + } + + nearestCluster->addSource(source, minerr); + sourceClusterReference.insert(std::pair< int, int >(sourceID, nearestClusterID)); +} + +std::pair< int, VABinauralCluster*> +VABinauralClusteringState::createCluster(VABinauralSoundSource* source) +{ + int clusterID = freeClusterIDs.back(); + VABinauralCluster* cluster = dynamic_cast< VABinauralCluster* >(_clusterPool->RequestObject()); // Reference = 1 + + cluster->init(source); + clusters.insert(std::pair< int, VABinauralCluster* >(clusterID, cluster)); + + freeClusterIDs.pop(); + + return std::pair< int, VABinauralCluster* >(clusterID, cluster); +} + + +double +VABinauralClusteringState::getMaxError() +{ + double max = 0; + std::map< int, VABinauralCluster* >::iterator it; + + for (it = clusters.begin(); it != clusters.end(); ++it) + { + max = std::max(max, it->second->maxError); + } + + return max; +} + diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h new file mode 100644 index 0000000..3fee304 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/VABinauralClusteringState.h @@ -0,0 +1,41 @@ +#ifndef IW_VACORE_BINAURALCLUSTERINGSTATE +#define IW_VACORE_BINAURALCLUSTERINGSTATE + +#include + +// VA Includes +#include +#include + +// Utils +#include "VABinauralCluster.h" +#include "../BinauralSoundSource/VABinauralSoundSource.h" + +class VABinauralClusteringState +{ +public: + int numClusters; + + std::queue< int > freeClusterIDs; + std::map< int, int> sourceClusterReference; + std::map< int, VABinauralCluster* > clusters; + + VABinauralClusteringState(int numClusters); + + VABinauralClusteringState(const VABinauralClusteringState& state); + + ~VABinauralClusteringState(); + + void + addSource(int sourceID, VABinauralSoundSource* source, double threshold, int numBlockedClusters); + + std::pair< int, VABinauralCluster*> + createCluster(VABinauralSoundSource* source); + + double getMaxError(); + +private: + IVAObjectPool* _clusterPool; +}; + +#endif // IW_VACORE_BINAURALCLUSTERINGSTATE \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/_SourceFiles.cmake new file mode 100644 index 0000000..08d98b6 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine/_SourceFiles.cmake @@ -0,0 +1,29 @@ +# $Id:$ + +set( RelativeDir "src/Rendering/Binaural/RealTime/Utils/BinauralClusterEngine" ) +set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils\\BinauralClusterEngine" ) + +set( DirFiles + VABinauralClusterEngine.cpp + VABinauralClustering.cpp + VABinauralCluster.cpp + VABinauralClusterEngine.h + VABinauralClustering.h + VABinauralCluster.h + VABinauralClusteringState.h + VABinauralClusteringState.cpp + VABinauralClusterPoolFactory.cpp + VABinauralClusterPoolFactory.h + VABinauralClusteringPoolFactory.cpp + VABinauralClusteringPoolFactory.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/BinauralListener/VABinauralListener.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.cpp index 4d77e8f..1f1d354 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.cpp +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.cpp @@ -1,11 +1,39 @@ #include "VABinauralListener.h" -VABinauralListener::VABinauralListener() +VABinauralListener::VABinauralListener(const CVACoreImpl* core, const config_t& conf) + : _core(core), + _conf(conf) +{}; + + +VABinauralListener::~VABinauralListener() { } +void +VABinauralListener::PreRequest() +{ + CVABasicMotionModel::Config listenerMotionConf; -VABinauralListener::~VABinauralListener() + listenerMotionConf.bLogEstimatedOutputEnabled = _conf.motionModelLogEstimated; + listenerMotionConf.bLogInputEnabled = _conf.motionModelLogInput; + listenerMotionConf.dWindowDelay = _conf.motionModelWindowDelay; + listenerMotionConf.dWindowSize = _conf.motionModelWindowSize; + listenerMotionConf.iNumHistoryKeys = _conf.motionModelNumHistoryKeys; + + sfOutput = new ITASampleFrame( + 2, + _core->GetCoreConfig()->oAudioDriverConfig.iBuffersize, + true + ); + + motionModel = new CVASharedMotionModel(new CVABasicMotionModel(listenerMotionConf), true); + data = nullptr; +} + +void +VABinauralListener::PreRelease() { + delete motionModel; } diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.h b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.h index 69e7336..d03040d 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.h +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListener.h @@ -5,12 +5,52 @@ #include #include +#include "../../../../../VACoreImpl.h" +#include "../../../../../Motion/VAMotionModelBase.h" +#include "../../../../../Motion/VASharedMotionModel.h" +#include "../../../../../Scene/VAScene.h" + +// ITA includes +#include + class VABinauralListener : public CVAPoolObject { public: - virtual ~VABinauralListener(); - - VABinauralListener(); + struct config_t { + bool motionModelLogInput; + bool motionModelLogEstimated; + + double motionModelWindowSize; + double motionModelWindowDelay; + + int motionModelNumHistoryKeys; + }; + + CVAListenerDesc* data; + CVASharedMotionModel* motionModel; + + VAVec3 predPos; + VAVec3 prefView; + VAVec3 predUp; + + ITASampleFrame* sfOutput; + + VABinauralListener(const CVACoreImpl* core, const config_t& conf); + + virtual + ~VABinauralListener(); + + void + PreRequest(); + + void + PreRelease(); + +private: + const config_t _conf; + const CVACoreImpl* _core; + + double _dCreationTimeStamp; }; -#endif // IW_VACORE_BINAURALListener +#endif // IW_VACORE_BINAURALLISTENER diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.cpp new file mode 100644 index 0000000..eb0602f --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.cpp @@ -0,0 +1,13 @@ +#include "VABinauralListenerPoolFactory.h" + +VABinauralListenerPoolFactory::VABinauralListenerPoolFactory(CVACoreImpl* core, const VABinauralListener::config_t& conf) + : _core(core), + _conf(conf){}; + +VABinauralListenerPoolFactory::~VABinauralListenerPoolFactory(){} + +CVAPoolObject* +VABinauralListenerPoolFactory::CreatePoolObject() +{ + return new VABinauralListener(_core, _conf); +}; \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.h b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.h new file mode 100644 index 0000000..82a51aa --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/VABinauralListenerPoolFactory.h @@ -0,0 +1,22 @@ +#ifndef IW_VACORE_BINAURALLISTENERPOOLFACTORY +#define IW_VACORE_BINAURALLISTENERPOOLFACTORY + +// Utils +#include "./VABinauralListener.h" + +class VABinauralListenerPoolFactory : public IVAPoolObjectFactory +{ +public: + VABinauralListenerPoolFactory(CVACoreImpl* core, const VABinauralListener::config_t& conf); + ~VABinauralListenerPoolFactory(); + + CVAPoolObject* CreatePoolObject(); + +private: + const VABinauralListener::config_t _conf; + + CVACoreImpl* _core; +}; + +#endif // IW_VACORE_BINAURALLISTENERPOOLFACTORY + diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/_SourceFiles.cmake index 01a40ab..0308f0f 100644 --- a/src/Rendering/Binaural/RealTime/Utils/BinauralListener/_SourceFiles.cmake +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralListener/_SourceFiles.cmake @@ -6,6 +6,8 @@ set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils\\Bi set( DirFiles VABinauralListener.cpp VABinauralListener.h + VABinauralListenerPoolFactory.cpp + VABinauralListenerPoolFactory.h _SourceFiles.cmake ) set( DirFiles_SourceGroup "${RelativeSourceGroup}" ) diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp new file mode 100644 index 0000000..76c3260 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.cpp @@ -0,0 +1,32 @@ +#include "VABinauralSoundSource.h" + + +VABinauralSoundSource::VABinauralSoundSource(const config_t& conf) + : _conf( conf ) +{} + + +VABinauralSoundSource::~VABinauralSoundSource() +{ +} + +void +VABinauralSoundSource::PreRequest() +{ + CVABasicMotionModel::Config listenerMotionConf; + + listenerMotionConf.bLogEstimatedOutputEnabled = _conf.motionModelLogEstimated; + listenerMotionConf.bLogInputEnabled = _conf.motionModelLogInput; + listenerMotionConf.dWindowDelay = _conf.motionModelWindowDelay; + listenerMotionConf.dWindowSize = _conf.motionModelWindowSize; + listenerMotionConf.iNumHistoryKeys = _conf.motionModelNumHistoryKeys; + + motionModel = new CVASharedMotionModel(new CVABasicMotionModel(listenerMotionConf), true); + data = nullptr; +} + +void +VABinauralSoundSource::PreRelease() +{ + delete motionModel; +} \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.h b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.h new file mode 100644 index 0000000..e0e68f5 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSource.h @@ -0,0 +1,47 @@ +#ifndef IW_VACORE_BINAURALSOUNDSOURCE +#define IW_VACORE_BINAURALSOUNDSOURCE + +// VA includes +#include +#include + +#include "../../../../../Motion/VAMotionModelBase.h" +#include "../../../../../Motion/VASharedMotionModel.h" +#include "../../../../../Scene/VAScene.h" + +class VABinauralSoundSource : public CVAPoolObject +{ +public: + struct config_t { + bool motionModelLogInput; + bool motionModelLogEstimated; + + double motionModelWindowSize; + double motionModelWindowDelay; + + int motionModelNumHistoryKeys; + }; + + CVASoundSourceDesc* data; + CVASharedMotionModel* motionModel; + + VAVec3 predPos; + VAVec3 prefView; + VAVec3 predUp; + + VABinauralSoundSource(const config_t& conf); + ~VABinauralSoundSource(); + + void + PreRequest(); + + void + PreRelease(); + +private: + const config_t _conf; + + double _dCreationTimeStamp; +}; + +#endif // IW_VACORE_BINAURALSOUNDSOURCE \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.cpp b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.cpp new file mode 100644 index 0000000..078d645 --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.cpp @@ -0,0 +1,19 @@ +#include "VABinauralSoundSourcePoolFactory.h" + + +VABinauralSoundSourcePoolFactory::VABinauralSoundSourcePoolFactory(VABinauralSoundSource::config_t conf) : + _conf(conf) +{ + +} + + +VABinauralSoundSourcePoolFactory::~VABinauralSoundSourcePoolFactory() +{ +} + +CVAPoolObject* +VABinauralSoundSourcePoolFactory::CreatePoolObject() +{ + return new VABinauralSoundSource(_conf); +}; \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.h b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.h new file mode 100644 index 0000000..7e21b1d --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.h @@ -0,0 +1,22 @@ +#ifndef IW_VACORE_BINAURALSOUNDSOURCEPOOLFACTORY +#define IW_VACORE_BINAURALSOUNDSOURCEPOOLFACTORY + +// Utils +#include "VABinauralSoundSource.h" + +class VABinauralSoundSourcePoolFactory : public IVAPoolObjectFactory +{ +public: + VABinauralSoundSourcePoolFactory(VABinauralSoundSource::config_t conf); + + ~VABinauralSoundSourcePoolFactory(); + + CVAPoolObject* + VABinauralSoundSourcePoolFactory::CreatePoolObject(); + +private: + const VABinauralSoundSource::config_t _conf; +}; + +#endif // IW_VACORE_BINAURALSOUNDSOURCEPOOLFACTORY + diff --git a/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/_SourceFiles.cmake b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/_SourceFiles.cmake new file mode 100644 index 0000000..52a0bdf --- /dev/null +++ b/src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource/_SourceFiles.cmake @@ -0,0 +1,21 @@ +# $Id:$ + +set( RelativeDir "src/Rendering/Binaural/RealTime/Utils/BinauralSoundSource" ) +set( RelativeSourceGroup "Source Files\\Rendering\\Binaural\\Realtime\\Utils\\BinauralSoundSource" ) + +set( DirFiles + VABinauralSoundSource.cpp + VABinauralSoundSource.h + VABinauralSoundSourcePoolFactory.cpp + VABinauralSoundSourcePoolFactory.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 907843a..d80c520 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 ) +set( SubDirs BinauralListener BinauralClusterEngine BinauralSoundSource) set( DirFiles _SourceFiles.cmake diff --git a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp index fb459af..b87e9d3 100644 --- a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp +++ b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.cpp @@ -2,28 +2,37 @@ // VA Includes #include +#include +#include "../../../VACoreImpl.h" #include "../../../Utils/VAUtils.h" // VA Core Includes #include "../../../Scene/VAScene.h" -class VABinauralClusterEngine : public CVAObject -{ -public: - virtual ~VABinauralClusterEngine(); - +// ITA includes +#include +#include -}; +// Utils +#include "./Utils/BinauralListener/VABinauralListenerPoolFactory.h" +#include "./Utils/BinauralSoundSource/VABinauralSoundSourcePoolFactory.h" -VABinauralRealTimeRenderer::VABinauralRealTimeRenderer( const CVAAudioRendererInitParams& params_ ) : - _params(params_), +VABinauralRealTimeRenderer::VABinauralRealTimeRenderer( const CVAAudioRendererInitParams& params ) : + _params(params), + _core(params.pCore), _newSceneState(NULL), _curSceneState(NULL), _indicateReset(false), - _resetAck(false) + _resetAck(false), + _clusterEngine() { - CVAConfigInterpreter conf(*_params.pConfig); + init(*_params.pConfig); + + IVAPoolObjectFactory* listenerFactory = new VABinauralListenerPoolFactory(_core, _defaultListenerConf); + _listenerPool = IVAObjectPool::Create(16, 2, listenerFactory, true); + IVAPoolObjectFactory* sourceFactory = new VABinauralSoundSourcePoolFactory(_defaultSourceConf); + _sourcePool = IVAObjectPool::Create(16, 2, sourceFactory, true); } @@ -31,6 +40,60 @@ VABinauralRealTimeRenderer::~VABinauralRealTimeRenderer() { } +void +VABinauralRealTimeRenderer::init( const CVAStruct& oArgs ) +{ + CVAConfigInterpreter conf(oArgs); + + // set interpolation algorithm + std::string vldInterpolationAlgorithm; + conf.OptString("SwitchingAlgorithm", vldInterpolationAlgorithm, "linear"); + vldInterpolationAlgorithm = toLowercase(vldInterpolationAlgorithm); + + if (vldInterpolationAlgorithm == "switch") + _defaultVDLSwitchingAlgorithm = CITAVariableDelayLine::SWITCH; + else if (vldInterpolationAlgorithm == "crossfade") + _defaultVDLSwitchingAlgorithm = CITAVariableDelayLine::CROSSFADE; + else if (vldInterpolationAlgorithm == "linear") + _defaultVDLSwitchingAlgorithm = CITAVariableDelayLine::LINEAR_INTERPOLATION; + else if (vldInterpolationAlgorithm == "cubicspline") + _defaultVDLSwitchingAlgorithm = CITAVariableDelayLine::CUBIC_SPLINE_INTERPOLATION; + else if (vldInterpolationAlgorithm == "windowedsinc") + _defaultVDLSwitchingAlgorithm = CITAVariableDelayLine::WINDOWED_SINC_INTERPOLATION; + else + ITA_EXCEPT1(INVALID_PARAMETER, "Unrecognized interpolation algorithm '" + vldInterpolationAlgorithm + "' in BinauralFreefieldAudioRendererConfig"); + + // HRTF filter length + conf.OptInteger("HRIRFilterLength", _hrirFilterLength, 256); + + // additional static delay + conf.OptNumber("AdditionalStaticDelaySeconds", _additionalStaticDelaySeconds, 0.0f); + + // default listener config + conf.OptInteger("MotionModelNumHistoryKeys", _defaultListenerConf.motionModelNumHistoryKeys, 1000); + + if (_defaultListenerConf.motionModelNumHistoryKeys < 1) + VA_EXCEPT2(INVALID_PARAMETER, "Basic motion model history needs to be greater than zero"); + + conf.OptNumber("MotionModelWindowSize", _defaultListenerConf.motionModelWindowSize, 0.1f); + conf.OptNumber("MotionModelWindowDelay", _defaultListenerConf.motionModelWindowDelay, 0.1f); + + if ((_defaultListenerConf.motionModelWindowSize <= 0) || (_defaultListenerConf.motionModelWindowDelay < 0)) + VA_EXCEPT2(INVALID_PARAMETER, "Basic motion model window parameters parse error (zero or negative?)"); + + // default source config + conf.OptInteger("MotionModelNumHistoryKeys", _defaultSourceConf.motionModelNumHistoryKeys, 1000); + + if (_defaultSourceConf.motionModelNumHistoryKeys < 1) + VA_EXCEPT2(INVALID_PARAMETER, "Basic motion model history needs to be greater than zero"); + + conf.OptNumber("MotionModelWindowSize", _defaultSourceConf.motionModelWindowSize, 0.1f); + conf.OptNumber("MotionModelWindowDelay", _defaultSourceConf.motionModelWindowDelay, 0.1f); + + if ((_defaultSourceConf.motionModelWindowSize <= 0) || (_defaultSourceConf.motionModelWindowDelay < 0)) + VA_EXCEPT2(INVALID_PARAMETER, "Basic motion model window parameters parse error (zero or negative?)"); +} + void VABinauralRealTimeRenderer::processStream(const ITAStreamInfo* streamInfo) { @@ -45,10 +108,181 @@ VABinauralRealTimeRenderer::updateScene(CVASceneState* newSceneState) _newSceneState = newSceneState; if (_newSceneState == _curSceneState) return; - // Neue Szene referenzieren (gegen Freigabe sperren) + // get reference to new scene _newSceneState->AddReference(); - // Unterschiede ermitteln: Neue Szene vs. alte Szene + // get difference between old scene state and current scene state CVASceneStateDiff diff; _newSceneState->Diff(_curSceneState, &diff); + + // update listeners + updateListeners(&diff); + + // update sources + updateSources(&diff); +} + +/* +ITADatasource* VABinauralRealTimeRenderer::GetOutputDatasource() +{ + return this; +} +*/ + +void +VABinauralRealTimeRenderer::updateSources( CVASceneStateDiff* diff ) +{ + typedef std::vector< int >::const_iterator icit_t; + + // Delete sources + for (icit_t it = diff->viDelSoundSourceIDs.begin(); it != diff->viDelSoundSourceIDs.end(); ++it) + { + const int& iID(*it++); + deleteSource(iID); + } + + // Add sources + for (icit_t it = diff->viNewSoundSourceIDs.begin(); it != diff->viNewSoundSourceIDs.end(); ++it) + { + const int& iID(*it++); + createSource(iID, _newSceneState->GetSoundSourceState(iID)); + } + + // update source trajectories + std::map< int, VABinauralSoundSource* >::iterator it; + + for (it = _sources.begin(); it != _sources.end(); ++it) + { + int sourceID = it->first; + VABinauralSoundSource* source = it->second; + + CVASoundSourceState* sourceCur = (_curSceneState ? _curSceneState->GetSoundSourceState(sourceID) : nullptr); + CVASoundSourceState* sourceNew = (_newSceneState ? _curSceneState->GetSoundSourceState(sourceID) : nullptr); + + const CVAMotionState* motionCur = (sourceCur ? sourceCur->GetMotionState() : nullptr); + const CVAMotionState* motionNew = (sourceNew ? sourceNew->GetMotionState() : nullptr); + + if (motionNew && (motionNew != motionCur)) + { + source->motionModel->InputMotionKey(motionNew); + } + } + + _clusterEngine.update(); +} + +void +VABinauralRealTimeRenderer::updateListeners( CVASceneStateDiff* diff ) +{ + typedef std::vector< int >::const_iterator icit_t; + + // Delete listeners + for (icit_t it = diff->viDelReceiverIDs.begin(); it != diff->viDelReceiverIDs.end(); ++it) + { + const int& iID(*it++); + deleteListener(iID); + } + + // Add listeners + for (icit_t it = diff->viNewReceiverIDs.begin(); it != diff->viNewReceiverIDs.end(); ++it) + { + const int& iID(*it++); + createListener(iID, _newSceneState->GetReceiverState(iID)); + } + + // update listener trajectories + for (std::map< int, VABinauralListener* >::iterator it = _listeners.begin(); it != _listeners.end(); ++it) + { + int iListenerID = it->first; + VABinauralListener* listener = it->second; + + CVAReceiverState* listenerCur = (_curSceneState ? _curSceneState->GetReceiverState(iListenerID) : nullptr); + CVAReceiverState* listenerNew = (_newSceneState ? _newSceneState->GetReceiverState(iListenerID) : nullptr); + + const CVAMotionState* motionCur = (listenerCur ? listenerCur->GetMotionState() : nullptr); + const CVAMotionState* motionNew = (listenerNew ? listenerNew->GetMotionState() : nullptr); + + if (motionNew && (motionNew != motionCur)) + { + listener->motionModel->InputMotionKey(motionNew); + } + } + +} + +void +VABinauralRealTimeRenderer::createSource( const int sourceID, const CVASoundSourceState* sourceState ) +{ + VABinauralSoundSource* source = dynamic_cast< VABinauralSoundSource* >(_sourcePool->RequestObject()); // Reference = 1 + + // set internal data + source->data = _core->GetSceneManager()->GetSoundSourceDesc(sourceID); + source->data->AddReference(); + + // set motion model + CVABasicMotionModel* motionInstance = dynamic_cast< CVABasicMotionModel* >(source->motionModel->GetInstance()); + motionInstance->SetName(std::string("bfrend_mm_source_" + source->data->sName)); + motionInstance->Reset(); + + // add local reference + _sources.insert(std::pair< int, VABinauralSoundSource* >(sourceID, source)); + + // add source to clustering + _clusterEngine.addSource(sourceID, source); +} + +void +VABinauralRealTimeRenderer::deleteSource(int sourceID) +{ + // remove local source reference + std::map< int, VABinauralSoundSource* >::iterator it = _sources.find(sourceID); + VABinauralSoundSource* source = it->second; + _sources.erase(it); + + //listener->bDeleted = true; + //listener->pData->RemoveReference(); + source->RemoveReference(); + + // remove listener reference from clustering + _clusterEngine.removeListener(sourceID); + } + +void +VABinauralRealTimeRenderer::createListener(int listenerID, const CVAReceiverState* recevierState) +{ + VABinauralListener* listener = dynamic_cast< VABinauralListener* >(_listenerPool->RequestObject()); // Reference = 1 + + // set internal data + listener->data = _core->GetSceneManager()->GetListenerDesc(listenerID); + listener->data->AddReference(); + + // set motion model + CVABasicMotionModel* motionInstance = dynamic_cast< CVABasicMotionModel* >(listener->motionModel->GetInstance()); + motionInstance->SetName(std::string("bfrend_mm_listener_" + listener->data->sName)); + motionInstance->Reset(); + + // add local reference + _listeners.insert(std::pair< int, VABinauralListener* >(listenerID, listener)); + + // add listener to clustering + VABinauralClusterEngine::clusterConfig_t config = { /*numClusters=*/ 9 }; + _clusterEngine.addListener(listenerID, listener, config); +} + +void +VABinauralRealTimeRenderer::deleteListener(int listenerID) +{ + // remove local listener reference + std::map< int, VABinauralListener* >::iterator it = _listeners.find(listenerID); + VABinauralListener* listener = it->second; + _listeners.erase(it); + + //listener->bDeleted = true; + //listener->pData->RemoveReference(); + listener->RemoveReference(); + + // remove listener reference from clustering + _clusterEngine.removeListener(listenerID); + +} \ No newline at end of file diff --git a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.h b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.h index 3cf8426..09cb7af 100644 --- a/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.h +++ b/src/Rendering/Binaural/RealTime/VABinauralRealTimeRenderer.h @@ -8,30 +8,74 @@ // ITA includes #include +// Other +#include "./Utils/BinauralClusterEngine/VABinauralClusterEngine.h" +#include "./Utils/BinauralSoundSource/VABinauralSoundSource.h" +#include "./Utils/BinauralListener/VABinauralListener.h" + class VABinauralRealTimeRenderer : public IVAAudioRenderer, public CVAObject { public: VABinauralRealTimeRenderer( const CVAAudioRendererInitParams& ); virtual ~VABinauralRealTimeRenderer(); - inline void loadScene(const std::string&) {}; + inline void loadScene( const std::string& ) {}; void processStream( const ITAStreamInfo* pStreamInfo ); - void updateScene(CVASceneState* newSceneState ); + void updateScene( CVASceneState* newSceneState ); // Resets the renderer to it's initial state void reset(); // Returns the renderers output stream datasource - ITADatasource* GetOutputDatasource(); + // ITADatasource* GetOutputDatasource(); private: const CVAAudioRendererInitParams _params; + + std::map< int, VABinauralSoundSource* > _sources; + std::map< int, VABinauralListener* > _listeners; + + VABinauralClusterEngine _clusterEngine; + + CVACoreImpl* _core; CVASceneState* _newSceneState; CVASceneState* _curSceneState; + + IVAObjectPool* _sourcePool; + IVAObjectPool* _listenerPool; + ITAAtomicBool _indicateReset, _resetAck; + + VABinauralListener::config_t _defaultListenerConf; //!< Default listener config for factory object creation + VABinauralSoundSource::config_t _defaultSourceConf; + + int _defaultVDLSwitchingAlgorithm; + int _hrirFilterLength; + double _additionalStaticDelaySeconds; + + void + init( const CVAStruct& oArgs ); + + void + updateListeners( CVASceneStateDiff* diff ); + + void + updateSources( CVASceneStateDiff* diff ); + + void + createListener( const int listenerID, const CVAReceiverState* receiverState ); + + void + createSource( const int sourceID, const CVASoundSourceState* sourceState ); + + void + deleteListener( const int listenerID ); + + void + deleteSource( const int sourceID ); }; diff --git a/src/Rendering/VAAudioRendererRegistry.cpp b/src/Rendering/VAAudioRendererRegistry.cpp index df70adb..d7f7633 100644 --- a/src/Rendering/VAAudioRendererRegistry.cpp +++ b/src/Rendering/VAAudioRendererRegistry.cpp @@ -24,6 +24,7 @@ #include "Prototyping/GenericPath/VAPTGenericPathAudioRenderer.h" #include "Prototyping/HearingAid/VAPTHearingAidRenderer.h" #include "VBAP/Freefield/VAVBAPFreefieldAudioRenderer.h" +#include "Binaural/RealTime/VABinauralRealTimeRenderer.h" #include "../VALog.h" @@ -91,6 +92,9 @@ void CVAAudioRendererRegistry::RegisterInternalCoreFactoryMethods() #ifdef VACORE_WITH_RENDERER_BINAURAL_ROOM_ACOUSTICS RegisterRendererDefaultFactory< CVARoomAcousticsAudioRenderer>( "BinauralRoomAcoustics" ); #endif // VACORE_WITH_RENDERER_BINAURAL_ROOM_ACOUSTICS +#ifdef VACORE_WITH_RENDERER_BINAURAL_REAL_TIME + RegisterRendererDefaultFactory< VABinauralRealTimeRenderer>("BinauralRealTime"); +#endif // VACORE_WITH_RENDERER_BINAURAL_REAL_TIME // Prototyping #ifdef VACORE_WITH_RENDERER_PROTOTYPE_FREE_FIELD -- GitLab