RavEngine
Loading...
Searching...
No Matches
AudioSpace.hpp
1#pragma once
2
3#include "mathtypes.hpp"
4#include "Ref.hpp"
5#include "ComponentWithOwner.hpp"
6#include "Queryable.hpp"
7#if !RVE_SERVER
8
9#include "AudioSource.hpp"
10#include "Types.hpp"
11#include "DebugDrawer.hpp"
12#include "AudioRingbuffer.hpp"
13#include "Filesystem.hpp"
14#include <api/resonance_audio_api.h>
15#include <common/room_properties.h>
16
17struct _IPLBinauralEffect_t;
18struct _IPLDirectEffect_t;
19struct _IPLSource_t;
20struct _IPLSimulator_t;
21struct _IPLScene_t;
22struct _IPLInstancedMesh_t;
23struct _IPLPathEffect_t;
24
25namespace RavEngine{
26
27class AudioRoomSyncSystem;
28class AudioPlayer;
29struct AudioMeshAsset;
30
31using RoomMat = vraudio::MaterialName;
32
33#define ENABLE_RINGBUFFERS 0
34
38class SimpleAudioSpace : public ComponentWithOwner, public IDebugRenderable, public Queryable<SimpleAudioSpace,IDebugRenderable>{
39 friend class RavEngine::AudioPlayer;
40public:
42 friend class RavEngine::AudioPlayer;
43 float sourceRadius = 10;
44
56 const matrix4& invListenerTransform
57 );
58
59 // internal use only. Called when an audio source component is destroyed
60 void DeleteAudioDataForEntity(entity_id_t entity);
61
62 RoomData();
63 ~RoomData();
64#if ENABLE_RINGBUFFERS
65 auto& GetRingBuffer(){
66 return debugBuffer;
67 }
68 void OutputSampleData(const Filesystem::Path& path) const;
69#endif
70
71 private:
72 struct SteamAudioEffects {
73 _IPLBinauralEffect_t* binauralEffect = nullptr;
74 _IPLDirectEffect_t* directEffect = nullptr;
75 };
76
77 void DestroyEffects(SteamAudioEffects&);
78
80
81 SingleAudioRenderBuffer workingBuffers;
82 SingleAudioRenderBufferNoScratch accumulationBuffer;
83
84#if ENABLE_RINGBUFFERS
86#endif
87 };
88
89
90 SimpleAudioSpace(Entity owner) : ComponentWithOwner(owner), data(std::make_shared<RoomData>()) {}
91
92 void SetRadius(float radius) {
93 data->sourceRadius = radius;
94 }
95 float GetRadius() const {
96 return data->sourceRadius;
97 }
98
99 const auto GetData() const {
100 return data;
101 }
102
107private:
108 Ref<RoomData> data;
109};
110
111struct GeometryAudioSpace : public ComponentWithOwner, public IDebugRenderable, public Queryable<GeometryAudioSpace, IDebugRenderable> {
112 friend class RavEngine::AudioRoomSyncSystem;
113 friend class RavEngine::AudioPlayer;
114public:
115
116 struct RoomData : public AudioGraphComposed {
117 friend class RavEngine::AudioPlayer;
118 friend class GeometryAudioSpace;
119 friend class AudioSnapshot;
120 RoomData();
121 ~RoomData();
122
132 const matrix4& invRoomTransform);
133
142
151 void ConsiderMesh(Ref<AudioMeshAsset> mesh, const matrix4& transform, const vector3& roomPos, const matrix4& invRoomTransform, entity_t ownerID);
152
153 void RenderAudioSource(
156 );
157
158 // internal use only. Called when an audio source component is destroyed
159 void DeleteAudioDataForEntity(entity_id_t entity);
160 void DeleteMeshDataForEntity(entity_id_t entity);
161 private:
162 float sourceRadius = 10, meshRadius = 10;
163
164 struct SteamAudioSourceConfig {
165 _IPLSource_t* source = nullptr;
166 _IPLDirectEffect_t* directEffect = nullptr;
167 _IPLPathEffect_t* pathEffect = nullptr;
168 _IPLBinauralEffect_t* binauralEffect = nullptr; //NOTE: this will be replaced by pathEffect at some point
169 vector3 roomSpacePos{ 0,0,0 };
170 };
171
172 // must be called when destroying a SteamAudioSourceConfig
173 void DestroySteamAudioSourceConfig(SteamAudioSourceConfig&);
174
176
177 struct SteamAudioMeshConfig {
178 _IPLInstancedMesh_t* instancedMesh = nullptr;
179 vector3 lastPos{ 0,0,0 };
180 quaternion lastRot{ 0,0,0,0 };
181 };
182
183 // must be called when destroying a SteamAudioMeshConfig
184 void DestroySteamAudioMeshConfig(SteamAudioMeshConfig&);
185
187
188 _IPLSimulator_t* steamAudioSimulator = nullptr;
189 _IPLScene_t* rootScene = nullptr;
190
191 SingleAudioRenderBuffer workingBuffers;
192 SingleAudioRenderBufferNoScratch accumulationBuffer;
193 };
194
195 const auto GetData() const {
196 return data;
197 }
198
202 void SetAudioSourceRadius(float radius) {
203 data->sourceRadius = radius;
204 }
205
209 void SetMeshRadius(float radius) {
210 data->meshRadius = radius;
211 }
212
213 auto GetAudioSourceRadius() const {
214 return data->sourceRadius;
215 }
216
217 auto GetMeshRadius() const {
218 return data->meshRadius;
219 }
220
221 GeometryAudioSpace(Entity owner) : ComponentWithOwner(owner), data(std::make_shared<RoomData>()) {}
222
224private:
225 Ref<RoomData> data;
226};
227
228class BoxReverbationAudioSpace : public ComponentWithOwner, public IDebugRenderable, public Queryable<BoxReverbationAudioSpace, IDebugRenderable> {
229public:
231 float reflection_scalar = 1, reverb_gain = 1, reverb_time = 1, reverb_brightness = 0;
232 };
233private:
234
235 friend class AudioPlayer;
236 friend class AudioSnapshot;
237 struct RoomData : public AudioGraphComposed {
238 friend class AudioPlayer;
239
240 // Material name of each surface of the shoebox room in this order:
241 // [0] (-)ive x-axis wall (left)
242 // [1] (+)ive x-axis wall (right)
243 // [2] (-)ive y-axis wall (bottom)
244 // [3] (+)ive y-axis wall (top)
245 // [4] (-)ive z-axis wall (front)
246 // [5] (+)ive z-axis wall (back)
247
248 Array<RoomMat, 6> wallMaterials{
249 RoomMat::kTransparent,
250 RoomMat::kTransparent,
251 RoomMat::kTransparent,
252 RoomMat::kTransparent,
253 RoomMat::kTransparent,
254 RoomMat::kTransparent
255 };
256 SpinLock wallMatMtx;
257 std::atomic<bool> wallsNeedUpdate = false;
258
259 RoomData();
260 ~RoomData();
261 private:
262 vraudio::ResonanceAudioApi* audioEngine = nullptr;
264 SingleAudioRenderBuffer workingBuffers;
265
266 void ConsiderAudioSource(const PlanarSampleBufferInlineView& monoSourceData, const vector3& worldPos, const quaternion& worldRot, const matrix4& invRoomTransform, entity_t ownerID, const vector3& roomHalfExts);
267
268 void RenderSpace(PlanarSampleBufferInlineView& outBuffer, PlanarSampleBufferInlineView& scratchBuffer, const vector3& listenerPosRoomSpace, const quaternion& listenerRotRoomSpace, const vector3& roomHalfExts, const RoomProperties& roomProperties);
269
270 void DeleteAudioDataForEntity(entity_id_t entity);
271 };
272
273 Ref<RoomData> roomData;
274 vector3 roomHalfExts{ 10, 10, 10 };
275 RoomProperties roomProperties;
276public:
277 BoxReverbationAudioSpace(Entity owner);
279 auto GetData() const {
280 return roomData;
281 }
282 auto GetHalfExts() const {
283 return roomHalfExts;
284 }
285
286 void SetHalfExts(const decltype(roomHalfExts)& h) {
287 roomHalfExts = h;
288 roomData->wallsNeedUpdate = true;
289 }
290
291 void SetWallMaterial(uint8_t idx, RoomMat material) {
292 std::lock_guard guard(roomData->wallMatMtx);
293 roomData->wallMaterials.at(idx) = material;
294 roomData->wallsNeedUpdate = true;
295 }
296 void SetWallMaterials(const Array<RoomMat, 6>& materials) {
297 std::lock_guard guard(roomData->wallMatMtx);
298 roomData->wallMaterials = materials;
299 roomData->wallsNeedUpdate = true;
300 }
301 // note: returns a copy!!
302 auto GetWallMaterials() const {
303 std::lock_guard guard(roomData->wallMatMtx);
304 return roomData->wallMaterials;
305 }
306 const auto& GetRoomProperties() const {
307 return roomProperties;
308 }
309 auto& GetRoomProperties() {
310 return roomProperties;
311 }
312};
313
314
315}
316#endif
Definition AudioPlayer.hpp:27
Definition AudioRingbuffer.hpp:8
Definition AudioSpace.hpp:228
void DebugDraw(RavEngine::DebugDrawer &dbg, const RavEngine::Transform &tr) const override
Definition AudioSpace.hpp:278
Definition ComponentWithOwner.hpp:6
Definition DebugDrawer.hpp:11
Definition AudioTypes.hpp:20
Definition AudioSpace.hpp:38
void DebugDraw(RavEngine::DebugDrawer &dbg, const RavEngine::Transform &tr) const override
Definition AudioSpace.hpp:106
Definition SpinLock.hpp:9
Definition concurrentqueue.h:747
Definition resonance_audio_api.h:142
Definition Animation.hpp:6
Definition Types.hpp:10
Definition AudioTypes.hpp:114
Definition AudioSnapshot.hpp:11
Definition Entity.hpp:11
Definition AudioSpace.hpp:116
void ConsiderAudioSource(const vector3 &sourcePos, entity_t owningEntity, const vector3 &roomPos, const matrix4 &invRoomTransform)
Definition AudioSpace.cpp:183
void CalculateRoom(const matrix4 &invRoomTransform, const vector3 &listenerForwardWorldSpace, const vector3 &listenerUpWorldSpace, const vector3 &listenerRightWorldSpace)
Definition AudioSpace.cpp:291
void ConsiderMesh(Ref< AudioMeshAsset > mesh, const matrix4 &transform, const vector3 &roomPos, const matrix4 &invRoomTransform, entity_t ownerID)
Definition AudioSpace.cpp:323
Definition AudioSpace.hpp:111
void SetAudioSourceRadius(float radius)
Definition AudioSpace.hpp:202
void DebugDraw(RavEngine::DebugDrawer &dbg, const RavEngine::Transform &tr) const override
Definition AudioSpace.hpp:223
void SetMeshRadius(float radius)
Definition AudioSpace.hpp:209
Definition IDebugRenderable.hpp:8
Definition Queryable.hpp:21
Definition AudioSpace.hpp:41
void RenderAudioSource(PlanarSampleBufferInlineView &buffer, PlanarSampleBufferInlineView &scratchBuffer, PlanarSampleBufferInlineView monoSourceData, const vector3 &sourcePos, entity_t owningEntity, const matrix4 &invListenerTransform)
Definition AudioSpace.cpp:21
Definition Transform.hpp:20
Definition qualifier.hpp:36
Definition type_quat.hpp:20
Definition qualifier.hpp:35