Plasma Engine  2.0
Loading...
Searching...
No Matches
AudioSystemRequests.h
1#pragma once
2
3#include <AudioSystemPlugin/AudioSystemPluginDLL.h>
4
5#include <AudioSystemPlugin/Core/AudioSystemData.h>
6
7#include <Foundation/Types/Status.h>
8#include <Foundation/Types/VariantType.h>
9
10
12#define PL_DECLARE_AUDIOSYSTEM_REQUEST_CALLBACK(name) \
13 using CallbackType = plDelegate<void(const name&)>; \
14 CallbackType m_Callback
15
16
18#define PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(name) \
19 bool operator==(const name& rhs) const \
20 { \
21 return static_cast<plAudioSystemRequest>(*this) == static_cast<plAudioSystemRequest>(rhs); \
22 } \
23 bool operator!=(const name& rhs) const \
24 { \
25 return !(*this == rhs); \
26 } \
27 PL_DECLARE_AUDIOSYSTEM_REQUEST_CALLBACK(name)
28
29
31#define PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(name, eq_ex) \
32 bool operator==(const name& rhs) const \
33 { \
34 return static_cast<plAudioSystemRequest>(*this) == static_cast<plAudioSystemRequest>(rhs) && (eq_ex); \
35 } \
36 bool operator!=(const name& rhs) const \
37 { \
38 return !(*this == rhs); \
39 } \
40 PL_DECLARE_AUDIOSYSTEM_REQUEST_CALLBACK(name)
41
42
44#define PL_DECLARE_AUDIOSYSTEM_REQUEST_HASH_SIMPLE(name) \
45 template <> \
46 struct plHashHelper<name> \
47 { \
48 PL_ALWAYS_INLINE static plUInt32 Hash(const name& value) \
49 { \
50 return plHashHelper<plAudioSystemRequest>::Hash(value); \
51 } \
52 PL_ALWAYS_INLINE static bool \
53 Equal(const name& a, const name& b) \
54 { \
55 return a == b; \
56 } \
57 }
58
59
61#define PL_DECLARE_AUDIOSYSTEM_REQUEST_HASH(name, hash_ex) \
62 template <> \
63 struct plHashHelper<name> \
64 { \
65 PL_ALWAYS_INLINE static plUInt32 Hash(const name& value) \
66 { \
67 return plHashingUtils::CombineHashValues32(plHashHelper<plAudioSystemRequest>::Hash(value), (hash_ex)); \
68 } \
69 PL_ALWAYS_INLINE static bool \
70 Equal(const name& a, const name& b) \
71 { \
72 return a == b; \
73 } \
74 }
75
76
78#define PL_DECLARE_AUDIOSYSTEM_REQUEST_STREAM_OPERATORS(name) \
79 PL_AUDIOSYSTEMPLUGIN_DLL void operator<<(plStreamWriter& Stream, const name& Value); \
80 PL_AUDIOSYSTEMPLUGIN_DLL void operator>>(plStreamReader& Stream, name& Value)
81
82
84#define PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(name) \
85 PL_DECLARE_AUDIOSYSTEM_REQUEST_HASH_SIMPLE(name); \
86 PL_DECLARE_AUDIOSYSTEM_REQUEST_STREAM_OPERATORS(name); \
87 PL_DECLARE_REFLECTABLE_TYPE(PL_AUDIOSYSTEMPLUGIN_DLL, name); \
88 PL_DECLARE_CUSTOM_VARIANT_TYPE(name)
89
90
92#define PL_DECLARE_AUDIOSYSTEM_REQUEST(name, hash_ex) \
93 PL_DECLARE_AUDIOSYSTEM_REQUEST_HASH(name, hash_ex); \
94 PL_DECLARE_AUDIOSYSTEM_REQUEST_STREAM_OPERATORS(name); \
95 PL_DECLARE_REFLECTABLE_TYPE(PL_AUDIOSYSTEMPLUGIN_DLL, name); \
96 PL_DECLARE_CUSTOM_VARIANT_TYPE(name)
97
98
101#define PL_DEFINE_AUDIOSYSTEM_STREAM_OPERATORS_SIMPLE(name) \
102 void operator<<(plStreamWriter& Stream, const name& Value) \
103 { \
104 Stream << static_cast<const plAudioSystemRequest&>(Value); \
105 } \
106 void operator>>(plStreamReader& Stream, name& Value) \
107 { \
108 Stream >> static_cast<plAudioSystemRequest&>(Value); \
109 }
110
111
126struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequest
127{
129 plAudioSystemDataID m_uiEntityId{0};
130
132 plAudioSystemDataID m_uiListenerId{0};
133
135 plAudioSystemDataID m_uiObjectId{0};
136
138 plStatus m_eStatus{PL_FAILURE};
139
140 bool operator==(const plAudioSystemRequest& rhs) const
141 {
142 return m_uiEntityId == rhs.m_uiEntityId && m_uiListenerId == rhs.m_uiListenerId && m_uiObjectId == rhs.m_uiObjectId && m_eStatus.Succeeded() == rhs.m_eStatus.Succeeded();
143 }
144
145 bool operator!=(const plAudioSystemRequest& rhs) const
146 {
147 return !(*this == rhs);
148 }
149};
150
151template <>
153{
154 PL_ALWAYS_INLINE static plUInt32 Hash(const plAudioSystemRequest& value)
155 {
157 }
158
159 PL_ALWAYS_INLINE static bool Equal(const plAudioSystemRequest& a, const plAudioSystemRequest& b)
160 {
161 return a == b;
162 }
163};
164
166struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestRegisterEntity : public plAudioSystemRequest
167{
168 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestRegisterEntity, m_sName == rhs.m_sName);
169
173};
174
176struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestSetEntityTransform : public plAudioSystemRequest
177{
178 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestSetEntityTransform, m_Transform == rhs.m_Transform);
179
180 plAudioSystemTransform m_Transform;
181};
182
184struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestUnregisterEntity : public plAudioSystemRequest
185{
186 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestUnregisterEntity);
187};
188
190struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestRegisterListener : public plAudioSystemRequest
191{
192 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestRegisterListener, m_sName == rhs.m_sName);
193
197};
198
201{
202 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestSetListenerTransform, m_Transform == rhs.m_Transform);
203
204 plAudioSystemTransform m_Transform;
205};
206
208struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestUnregisterListener : public plAudioSystemRequest
209{
210 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestUnregisterListener);
211};
212
214struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestLoadTrigger : public plAudioSystemRequest
215{
216 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestLoadTrigger, m_uiEventId == rhs.m_uiEventId);
217
219 plAudioSystemDataID m_uiEventId{0};
220};
221
223struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestActivateTrigger : public plAudioSystemRequest
224{
225 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestActivateTrigger, m_uiEventId == rhs.m_uiEventId);
226
228 plAudioSystemDataID m_uiEventId{0};
229};
230
232struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestStopEvent : public plAudioSystemRequest
233{
234 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestStopEvent, m_uiTriggerId == rhs.m_uiTriggerId);
235
237 plAudioSystemDataID m_uiTriggerId{0};
238};
239
241struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestUnloadTrigger : public plAudioSystemRequest
242{
243 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestUnloadTrigger);
244};
245
247struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestSetRtpcValue : public plAudioSystemRequest
248{
249 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestSetRtpcValue, m_fValue == rhs.m_fValue);
250
252 float m_fValue{0.0f};
253};
254
256struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestSetSwitchState : public plAudioSystemRequest
257{
258 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestSetSwitchState);
259};
260
263{
264 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestSetEnvironmentAmount, m_fAmount == rhs.m_fAmount);
265
267 float m_fAmount{0.0f};
268};
269
272{
273 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE(plAudioSystemRequestSetObstructionOcclusion, m_fObstruction == rhs.m_fObstruction && m_fOcclusion == rhs.m_fOcclusion);
274
276 float m_fObstruction{0.0f};
277
279 float m_fOcclusion{0.0f};
280};
281
283struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestLoadBank : public plAudioSystemRequest
284{
285 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestLoadBank);
286};
287
289struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestUnloadBank : public plAudioSystemRequest
290{
291 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestUnloadBank);
292};
293
296struct PL_AUDIOSYSTEMPLUGIN_DLL plAudioSystemRequestShutdown : public plAudioSystemRequest
297{
298 PL_DECLARE_AUDIOSYSTEM_REQUEST_TYPE_SIMPLE(plAudioSystemRequestShutdown);
299};
300
301PL_DECLARE_AUDIOSYSTEM_REQUEST_STREAM_OPERATORS(plAudioSystemRequest);
302PL_DECLARE_REFLECTABLE_TYPE(PL_AUDIOSYSTEMPLUGIN_DLL, plAudioSystemRequest);
303
304PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestRegisterEntity, plHashHelper<plString>::Hash(value.m_sName));
305PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestSetEntityTransform, plHashHelper<plAudioSystemTransform>::Hash(value.m_Transform));
306PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestUnregisterEntity);
307PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestRegisterListener, plHashHelper<plString>::Hash(value.m_sName));
308PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestSetListenerTransform, plHashHelper<plAudioSystemTransform>::Hash(value.m_Transform));
309PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestUnregisterListener);
310PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestLoadTrigger, plHashHelper<plAudioSystemDataID>::Hash(value.m_uiEventId));
311PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestActivateTrigger, plHashHelper<plAudioSystemDataID>::Hash(value.m_uiEventId));
312PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestStopEvent, plHashHelper<plAudioSystemDataID>::Hash(value.m_uiTriggerId));
313PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestUnloadTrigger);
314PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestSetRtpcValue, plHashHelper<plInt32>::Hash(plMath::FloatToInt(value.m_fValue * 1000.0f)));
315PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestSetSwitchState);
316PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestSetEnvironmentAmount, plHashHelper<plInt32>::Hash(plMath::FloatToInt(value.m_fAmount * 1000.0f)));
317PL_DECLARE_AUDIOSYSTEM_REQUEST(plAudioSystemRequestSetObstructionOcclusion, plHashHelper<plInt32>::Hash(plMath::FloatToInt(value.m_fObstruction * 1000.0f)) * plHashHelper<plInt32>::Hash(plMath::FloatToInt(value.m_fOcclusion * 1000.0f)));
318PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestLoadBank);
319PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestUnloadBank);
320PL_DECLARE_AUDIOSYSTEM_REQUEST_SIMPLE(plAudioSystemRequestShutdown);
321
324{
325 explicit CallRequestCallbackFunc(const plVariant& value)
326 : m_Value(value)
327 {
328 }
329
330 template <typename T>
331 PL_ALWAYS_INLINE void Call() const
332 {
333 plResult conversionStatus = PL_SUCCESS;
334 const auto& request = m_Value.ConvertTo<T>(&conversionStatus);
335
336 if (conversionStatus.Succeeded())
337 {
338 request.m_Callback(request);
339 }
340 }
341
342 template <typename T>
343 void operator()() const
344 {
345 if (!m_Value.IsValid())
346 return;
347
349 {
350 Call<plAudioSystemRequestRegisterEntity>();
351 }
353 {
354 Call<plAudioSystemRequestSetEntityTransform>();
355 }
356 else if (m_Value.IsA<plAudioSystemRequestUnregisterEntity>())
357 {
358 Call<plAudioSystemRequestUnregisterEntity>();
359 }
360 else if (m_Value.IsA<plAudioSystemRequestRegisterListener>())
361 {
362 Call<plAudioSystemRequestRegisterListener>();
363 }
365 {
366 Call<plAudioSystemRequestSetListenerTransform>();
367 }
369 {
370 Call<plAudioSystemRequestUnregisterListener>();
371 }
372 else if (m_Value.IsA<plAudioSystemRequestLoadTrigger>())
373 {
374 Call<plAudioSystemRequestLoadTrigger>();
375 }
376 else if (m_Value.IsA<plAudioSystemRequestActivateTrigger>())
377 {
378 Call<plAudioSystemRequestActivateTrigger>();
379 }
380 else if (m_Value.IsA<plAudioSystemRequestStopEvent>())
381 {
382 Call<plAudioSystemRequestStopEvent>();
383 }
384 else if (m_Value.IsA<plAudioSystemRequestSetRtpcValue>())
385 {
386 Call<plAudioSystemRequestSetRtpcValue>();
387 }
388 else if (m_Value.IsA<plAudioSystemRequestSetSwitchState>())
389 {
390 Call<plAudioSystemRequestSetSwitchState>();
391 }
393 {
394 Call<plAudioSystemRequestSetEnvironmentAmount>();
395 }
397 {
398 Call<plAudioSystemRequestSetObstructionOcclusion>();
399 }
400 else if (m_Value.IsA<plAudioSystemRequestLoadBank>())
401 {
402 Call<plAudioSystemRequestLoadBank>();
403 }
404 else if (m_Value.IsA<plAudioSystemRequestUnloadBank>())
405 {
406 Call<plAudioSystemRequestUnloadBank>();
407 }
408 else if (m_Value.IsA<plAudioSystemRequestShutdown>())
409 {
410 Call<plAudioSystemRequestShutdown>();
411 }
412 else
413 {
414 plLog::Error("[AudioSystem] Received an Audio Request with an invalid type");
415 }
416 }
417
418 const plVariant& m_Value;
419};
static void Error(plLogInterface *pInterface, const plFormatString &string)
An error that needs to be fixed as soon as possible.
Definition Log.cpp:375
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
bool IsValid() const
Returns whether this variant stores any other type than 'Invalid'.
Definition Variant_inl.h:274
T ConvertTo(plResult *out_pConversionStatus=nullptr) const
Tries to convert the stored value to the given type. The optional status parameter can be used to che...
Definition Variant_inl.h:421
bool IsA() const
Returns whether the stored type is exactly the given type.
constexpr plInt32 FloatToInt(float value)
Casts the float to an integer, removes the fractional part.
Definition Math_inl.h:462
A functor used by plVariant to call an audio request callback.
Definition AudioSystemRequests.h:324
Audio request to activate a trigger.
Definition AudioSystemRequests.h:224
Base class for all audio system requests.
Definition AudioSystemRequests.h:127
plStatus m_eStatus
The status of the audio request.
Definition AudioSystemRequests.h:138
plAudioSystemDataID m_uiListenerId
The audio listener which is being manipulated, if any.
Definition AudioSystemRequests.h:132
plAudioSystemDataID m_uiObjectId
The audio object (trigger, rtpc, environment, etc.) which is being manipulated, if any.
Definition AudioSystemRequests.h:135
plAudioSystemDataID m_uiEntityId
The audio entity which is being manipulated, if any.
Definition AudioSystemRequests.h:129
Audio request to load a sound bank.
Definition AudioSystemRequests.h:284
Audio request to load data needed to activate a trigger.
Definition AudioSystemRequests.h:215
Audio request to register a new entity in the audio system.
Definition AudioSystemRequests.h:167
plString m_sName
A friendly name for the entity. Not very used by most of the audio engines for other purposes than de...
Definition AudioSystemRequests.h:172
Audio request to register a new listener in the audio system.
Definition AudioSystemRequests.h:191
plString m_sName
A friendly name for the listener. Not very used by most of the audio engines for other purposes than ...
Definition AudioSystemRequests.h:196
Audio request to set the transform and velocity of an entity.
Definition AudioSystemRequests.h:177
Audio request to set the current amount of an environment on the specified entity.
Definition AudioSystemRequests.h:263
Audio request to set the transform and velocity of a listener.
Definition AudioSystemRequests.h:201
Audio request to set the current amount of an environment on the specified entity.
Definition AudioSystemRequests.h:272
Audio request to set the value of a real-time parameter.
Definition AudioSystemRequests.h:248
Audio request to set the active state of a switch.
Definition AudioSystemRequests.h:257
Audio request to shutdown the audio system. Used internally only. Sending this request at runtime wil...
Definition AudioSystemRequests.h:297
Audio request to stop an event.
Definition AudioSystemRequests.h:233
Audio request to unload a sound bank.
Definition AudioSystemRequests.h:290
Audio request to unload data loaded by a trigger.
Definition AudioSystemRequests.h:242
Audio request to unregister an entity from the audio system.
Definition AudioSystemRequests.h:185
Audio request to unregister a listener from the audio system.
Definition AudioSystemRequests.h:209
Stores the transformation data for an audio entity.
Definition AudioSystemData.h:17
Helper struct to calculate the Hash of different types.
Definition HashingUtils.h:75
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
An plResult with an additional message for the reason of failure.
Definition Status.h:12