VAE - Virtual Audio Engine 1
Small Data Driven Audio Engine
vae::core::SpatialManager Class Reference

#include <vae_spatial_manager.hpp>

Collaboration diagram for vae::core::SpatialManager:

Public Member Functions

Result init (Size emitterCount)
 
Result addEmitter (EmitterHandle e)
 
EmitterHandle createEmitter ()
 
EmitterHandle createAutoEmitter (BankHandle bank, EventHandle event, float maxDist, const LocationDirection &locDir, Sample spread)
 
Result removeEmitter (EmitterHandle e)
 
EmittergetEmitter (EmitterHandle e)
 
bool hasEmitter (EmitterHandle e)
 
void compact ()
 
Result setEmitter (EmitterHandle emitter, const LocationDirection &locDir, Sample spread)
 
ListenersgetListeners ()
 
template<class Func >
Result forListeners (ListenerHandle handle, const Func &&func)
 
ListenerHandle createListener ()
 
Result setListener (ListenerHandle listener, const LocationOrientation &locOr)
 
Result removeListener (ListenerHandle listener)
 
template<class Callback >
void update (VoiceManger &manager, Callback callback)
 

Private Types

template<typename key , class T >
using Map = robin_hood::unordered_map< key, T >
 

Private Attributes

Map< EmitterHandle, EmittermEmitters
 
Listeners mListeners
 

Detailed Description

Definition at line 28 of file vae_spatial_manager.hpp.

Member Typedef Documentation

◆ Map

template<typename key , class T >
using vae::core::SpatialManager::Map = robin_hood::unordered_map<key, T>
private

Definition at line 31 of file vae_spatial_manager.hpp.

Member Function Documentation

◆ addEmitter()

Result vae::core::SpatialManager::addEmitter ( EmitterHandle  e)
inline

Definition at line 44 of file vae_spatial_manager.hpp.

44 {
47 if (mEmitters.contains(e)) {
48 VAE_INFO("Trying to add duplicate emitter %u", e)
50 }
51 Emitter emitter;
52 emitter.bank = InvalidBankHandle;
53 emitter.event = InvalidEventHandle;
54 // TODO VAE_DEBUG when allocation happens and also lock audio thread
55 mEmitters.insert({e, emitter});
57 return Result::Success;
58 }
Map< EmitterHandle, Emitter > mEmitters
const char *const emitters
constexpr EmitterHandle InvalidEmitterHandle
Definition: vae.hpp:61
constexpr EventHandle InvalidEventHandle
Definition: vae.hpp:55
@ DuplicateEmitter
Trying to register emitter twice.
constexpr BankHandle InvalidBankHandle
Definition: vae.hpp:57
#define VAE_INFO(msg,...)
Definition: vae_logger.hpp:84
#define VAE_PROFILER_SCOPE()
Profiles a scope.
#define VAE_PROFILER_PLOT(name, value)
Records a value.
#define VAE_ASSERT(condition)
Definition: vae_util.hpp:11
Here is the caller graph for this function:

◆ compact()

void vae::core::SpatialManager::compact ( )
inline

Definition at line 105 of file vae_spatial_manager.hpp.

105 {
107 // mEmitters.compact();
108 }

◆ createAutoEmitter()

EmitterHandle vae::core::SpatialManager::createAutoEmitter ( BankHandle  bank,
EventHandle  event,
float  maxDist,
const LocationDirection locDir,
Sample  spread 
)
inline

Definition at line 70 of file vae_spatial_manager.hpp.

73 {
75 auto handle = createEmitter();
76 auto& e = mEmitters[handle];
77 e.position = { locDir.position.x, locDir.position.y, locDir.position.z };
78 e.spread = spread;
79 e.maxDist = maxDist;
80 e.bank = bank;
81 e.event = event;
82 return handle;
83 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ createEmitter()

EmitterHandle vae::core::SpatialManager::createEmitter ( )
inline

Definition at line 60 of file vae_spatial_manager.hpp.

60 {
62 EmitterHandle ret = rand();
63 while (hasEmitter(ret)) {
64 ret = rand();
65 }
66 auto result = addEmitter(ret);
67 return result == Result::Success ? ret : InvalidEmitterHandle;
68 }
Result addEmitter(EmitterHandle e)
bool hasEmitter(EmitterHandle e)
LargeHandle EmitterHandle
Definition: vae.hpp:43
Here is the call graph for this function:
Here is the caller graph for this function:

◆ createListener()

ListenerHandle vae::core::SpatialManager::createListener ( )
inline

Definition at line 146 of file vae_spatial_manager.hpp.

146 {
148 for (ListenerHandle index = 0; index < StaticConfig::MaxListeners; index++) {
149 auto& i = mListeners[index];
150 if (i.id == InvalidListenerHandle) {
151 i.id = index;
152 i.position = { 0.f, 0.f, 0.f };
153 i.front = { 0.f, 0.f, -1.f };
154 i.up = { 0.f, 1.f, 0.f };
155 return index;
156 }
157 }
158 VAE_ERROR("Exeeded maxim amount of listeners define in StaticConfig::MaxListeners")
160 }
constexpr Size MaxListeners
How many listeners can observe 3D voices.
Definition: vae.hpp:288
SmallHandle ListenerHandle
Definition: vae.hpp:45
constexpr ListenerHandle InvalidListenerHandle
Definition: vae.hpp:59
#define VAE_ERROR(msg,...)
Definition: vae_logger.hpp:80
Here is the caller graph for this function:

◆ forListeners()

template<class Func >
Result vae::core::SpatialManager::forListeners ( ListenerHandle  handle,
const Func &&  func 
)
inline

Definition at line 130 of file vae_spatial_manager.hpp.

130 {
132 if (handle == AllListeners) {
133 for(ListenerHandle index = 0; index < StaticConfig::MaxListeners; index++) {
134 auto& i = mListeners[index];
135 if (i.id == InvalidListenerHandle) { continue; }
136 Result result = func(i);
137 if (result != Result::Success) {
138 return result;
139 }
140 }
141 return Result::Success;
142 }
143 return func(mListeners[handle]);
144 }
constexpr ListenerHandle AllListeners
Will address all listeners.
Definition: vae.hpp:60
Result
Return Types for most engine functions.
Definition: vae.hpp:73
Here is the caller graph for this function:

◆ getEmitter()

Emitter & vae::core::SpatialManager::getEmitter ( EmitterHandle  e)
inline

Definition at line 95 of file vae_spatial_manager.hpp.

95 {
97 return mEmitters[e];
98 }
Here is the caller graph for this function:

◆ getListeners()

Listeners & vae::core::SpatialManager::getListeners ( )
inline

Definition at line 125 of file vae_spatial_manager.hpp.

125 {
126 return mListeners;
127 }
Here is the caller graph for this function:

◆ hasEmitter()

bool vae::core::SpatialManager::hasEmitter ( EmitterHandle  e)
inline

Definition at line 100 of file vae_spatial_manager.hpp.

100 {
102 return mEmitters.contains(e);
103 }
Here is the caller graph for this function:

◆ init()

Result vae::core::SpatialManager::init ( Size  emitterCount)
inline

Definition at line 38 of file vae_spatial_manager.hpp.

38 {
39 VAE_PROFILER_SCOPE_NAMED("Spatial Init")
40 mEmitters.reserve(emitterCount);
41 return Result::Success;
42 }
#define VAE_PROFILER_SCOPE_NAMED(name)
Profiles a scope and names it.

◆ removeEmitter()

Result vae::core::SpatialManager::removeEmitter ( EmitterHandle  e)
inline

Definition at line 85 of file vae_spatial_manager.hpp.

85 {
87 auto res = mEmitters.erase(e);
88 if (res == 1) {
90 return Result::Success;
91 }
93 }
@ ElementNotFound
Referenced data not found.
Here is the caller graph for this function:

◆ removeListener()

Result vae::core::SpatialManager::removeListener ( ListenerHandle  listener)
inline

Definition at line 181 of file vae_spatial_manager.hpp.

181 {
183 if (StaticConfig::MaxListeners <= listener) {
184 VAE_WARN("Accessed invalid listener %i", listener)
186 }
187 mListeners[listener].id = InvalidListenerHandle;
188 return Result::Success;
189 }
@ ValidHandleRequired
Handle provided wasn't valid but needs to be.
#define VAE_WARN(msg,...)
Definition: vae_logger.hpp:85
Here is the caller graph for this function:

◆ setEmitter()

Result vae::core::SpatialManager::setEmitter ( EmitterHandle  emitter,
const LocationDirection locDir,
Sample  spread 
)
inline

Definition at line 110 of file vae_spatial_manager.hpp.

113 {
115 if (!hasEmitter(emitter)) {
116 VAE_DEBUG("Accessed invalid emitter %i", emitter)
118 }
119 auto& e = getEmitter(emitter);
120 e.position = { locDir.position.x, locDir.position.y, locDir.position.z };
121 e.spread = spread;
122 return Result::Success;
123 }
Emitter & getEmitter(EmitterHandle e)
#define VAE_DEBUG(msg,...)
Definition: vae_logger.hpp:83
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setListener()

Result vae::core::SpatialManager::setListener ( ListenerHandle  listener,
const LocationOrientation locOr 
)
inline

Definition at line 162 of file vae_spatial_manager.hpp.

165 {
167 if (StaticConfig::MaxListeners <= listener) {
168 VAE_WARN("Accessed invalid listener %i", listener)
170 }
171 auto& l = mListeners[listener];
172 if (l.id == InvalidBankHandle) {
174 }
175 l.position = { locOr.position.x, locOr.position.y, locOr.position.z };
176 l.front = { locOr.front.x, locOr.front.y, locOr.front.z };
177 l.up = { locOr.up.x, locOr.up.y, locOr.up.z };
178 return Result::Success;
179 }
Here is the caller graph for this function:

◆ update()

template<class Callback >
void vae::core::SpatialManager::update ( VoiceManger manager,
Callback  callback 
)
inline

Definition at line 192 of file vae_spatial_manager.hpp.

192 {
193 VAE_PROFILER_SCOPE_NAMED("Spatial Update")
194
195 // TODO perf maybe swap loops
196 // This triggers nearby auto emitters
197 forListeners(AllListeners, [&](Listener& l) {
198 for (auto& emitter : mEmitters) {
199 auto& e = emitter.second;
200 // TODO seperate auto emitter somehow
201 if (e.bank == InvalidBankHandle) { continue; } // means it wants to auto emit
202 if (e.autoplaying) { continue; }
203 // only trigger sounds which haven't been auto triggered
204 const auto distance = glm::distance(l.position, e.position);
205 if (distance < e.maxDist) {
206 mEmitters[emitter.first].autoplaying = true;
207 callback(e.event, e.bank, emitter.first);
208 }
209 }
210 return Result::Success;
211 });
212 }
Result forListeners(ListenerHandle handle, const Func &&func)
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ mEmitters

Map<EmitterHandle, Emitter> vae::core::SpatialManager::mEmitters
private

Definition at line 34 of file vae_spatial_manager.hpp.

◆ mListeners

Listeners vae::core::SpatialManager::mListeners
private

Definition at line 36 of file vae_spatial_manager.hpp.


The documentation for this class was generated from the following file: