RavEngine
Loading...
Searching...
No Matches
AudioPlayer.hpp
1#pragma once
2#if !RVE_SERVER
3#include <SDL3/SDL_audio.h>
4#endif
5#include "Ref.hpp"
6#include "WeakRef.hpp"
7#include <taskflow/taskflow.hpp>
8#include <taskflow/core/worker.hpp>
9#include "DataStructures.hpp"
10#include "Types.hpp"
11#include "AudioSnapshot.hpp"
12#include <semaphore>
13
14struct _IPLContext_t;
15struct _IPLHRTF_t;
16struct _IPLAudioSettings_t;
17
18namespace RavEngine{
19
20class World;
21struct AudioSourceBase;
22struct AudioSnapshot;
23struct AudioDataProvider;
28#if !RVE_SERVER
29 SDL_AudioStream* stream = nullptr;
30 WeakRef<World> worldToRender;
31 uint64_t globalSamples = 0; // in units of a single channel
32 _IPLContext_t* steamAudioContext = nullptr;
33 _IPLHRTF_t* steamAudioHRTF = nullptr;
34#endif
35
36
37 static uint32_t SamplesPerSec;
38 static uint8_t nchannels;
39 static uint16_t buffer_size;
40 static uint32_t maxAudioSampleLatency;
41
42 static constexpr uint16_t config_buffersize = 512;
43 static constexpr uint16_t config_samplesPerSec = 44'100;
44 static constexpr uint32_t config_nchannels = 2;
45#if !RVE_SERVER
46 void Tick();
47
48 std::optional<SingleAudioRenderBuffer> playerRenderBuffer;
49
50 tf::Executor audioExecutor;
51 tf::Taskflow audioTaskflow;
52
53 AudioSnapshot* SnapshotToRender = nullptr;
54 tf::Future<void> taskflowFuture;
55
56 void SetupAudioTaskGraph();
57 std::vector<entity_id_t> destroyedSources, destroyedMeshComponents;
58
59 decltype(AudioSnapshot::dataProviders.begin()) dataProvidersBegin, dataProvidersEnd;
60 decltype(AudioSnapshot::ambientSources.begin()) ambientSourcesBegin, ambientSourcesEnd;
61 decltype(AudioSnapshot::simpleAudioSpaces.begin()) simpleSpacesBegin, simpleSpacesEnd;
62 decltype(AudioSnapshot::geometryAudioSpaces.begin()) geometrySpacesBegin, geometrySpacesEnd;
63 decltype(AudioSnapshot::boxAudioSpaces.begin()) boxSpacesBegin, boxSpacesEnd;
64
65 vector3 lpos{0};
66 quaternion lrot{0,0,0,0};
67 matrix4 invListenerTransform{ 1 }, listenerTransform{ 1 };
68
69 std::optional<std::thread> audioTickThread;
70 std::atomic<bool> audioThreadShouldRun = true;
71 std::vector<float> interleavedOutputBuffer;
72
73 void PerformAudioTickPreamble();
74 void CalculateGeometryAudioSpace(AudioSnapshot::GeometryAudioSpaceData& r);
75 void CalculateSimpleAudioSpace(AudioSnapshot::SimpleAudioSpaceData&);
76 void CalculateBoxAudioSpace(AudioSnapshot::BoxReverbationSpaceData&);
77 void CalculateFinalMix();
78 void ST_DoMix();
79#endif
80
81
82public:
83#if !RVE_SERVER
84 auto GetSteamAudioHRTF() const {
85 return steamAudioHRTF;
86 }
87 auto GetSteamAudioContext() const {
88 return steamAudioContext;
89 }
90
91 auto GetSteamAudioState() const {
92
93 struct SAState{
94 decltype(steamAudioHRTF) hrtf;
95 decltype(steamAudioContext) context;
96 } state{
97 .hrtf = steamAudioHRTF,
98 .context = steamAudioContext
99 };
100 return state;
101 }
102 _IPLAudioSettings_t GetSteamAudioSettings() const;
103
104 AudioPlayer();
105
109 inline void SetWorld(Ref<World> w){
110 worldToRender = w;
111 }
112
113
117 void Init();
118
122 void Shutdown();
123
124 const static auto GetSamplesPerSec() {
125 return SamplesPerSec;
126 }
127
128 const static auto GetNChannels(){
129 return nchannels;
130 }
131
132 const static auto GetBufferSize(){
133 return buffer_size;
134 }
135
136 decltype(globalSamples) GetGlobalAudioTime() const{
137 return globalSamples;
138 }
139#endif
140
141};
142
143}
Definition AudioPlayer.hpp:27
void Shutdown()
Definition AudioPlayer.cpp:495
void SetWorld(Ref< World > w)
Definition AudioPlayer.hpp:109
void Init()
Definition AudioPlayer.cpp:428
Definition base.h:1940
Definition concurrentqueue.h:747
Definition Animation.hpp:6
Definition AudioSnapshot.hpp:27
Definition AudioSnapshot.hpp:11
Definition qualifier.hpp:36
Definition type_quat.hpp:20
Definition qualifier.hpp:35