Plasma Engine  2.0
Loading...
Searching...
No Matches
FmodSingleton.h
1#pragma once
2
3#include <Core/Interfaces/SoundInterface.h>
4#include <Core/ResourceManager/ResourceHandle.h>
5#include <FmodPlugin/FmodPluginDLL.h>
6#include <Foundation/Configuration/Plugin.h>
7#include <Foundation/Configuration/Singleton.h>
8#include <Foundation/Types/UniquePtr.h>
9
11class plOpenDdlWriter;
14
16
18enum class plFmodSpeakerMode : plUInt8
19{
20 ModeStereo,
21 Mode5Point1,
22 Mode7Point1,
23};
24
26struct PL_FMODPLUGIN_DLL plFmodConfiguration
27{
28 plString m_sMasterSoundBank;
29 plFmodSpeakerMode m_SpeakerMode = plFmodSpeakerMode::Mode5Point1;
31 plUInt16 m_uiVirtualChannels = 32;
32 plUInt32 m_uiSamplerRate = 0;
33
34 void Save(plOpenDdlWriter& ref_ddl) const;
35 void Load(const plOpenDdlReaderElement& ddl);
36
37 bool operator==(const plFmodConfiguration& rhs) const;
38 bool operator!=(const plFmodConfiguration& rhs) const { return !operator==(rhs); }
39};
40
42struct PL_FMODPLUGIN_DLL plFmodAssetProfiles
43{
44 static constexpr const plStringView s_sConfigFile = ":project/RuntimeConfigs/FmodConfig.ddl"_plsv;
45
46 plResult Save(plStringView sFile = s_sConfigFile) const;
47 plResult Load(plStringView sFile = s_sConfigFile);
48
50};
51
52class PL_FMODPLUGIN_DLL plFmod : public plSoundInterface
53{
54 PL_DECLARE_SINGLETON_OF_INTERFACE(plFmod, plSoundInterface);
55
56public:
57 plFmod();
58
59 void Startup();
60 void Shutdown();
61
62 FMOD::Studio::System* GetStudioSystem() const { return m_pStudioSystem; }
63 FMOD::System* GetLowLevelSystem() const { return m_pLowLevelSystem; }
64
67 virtual void LoadConfiguration(plStringView sFile) override;
68
71 virtual void SetOverridePlatform(plStringView sPlatform) override;
72
74 virtual void UpdateSound() override;
75
77 virtual void SetMasterChannelVolume(float fVolume) override;
78 virtual float GetMasterChannelVolume() const override;
79
81 virtual void SetMasterChannelMute(bool bMute) override;
82 virtual bool GetMasterChannelMute() const override;
83
86 virtual void SetMasterChannelPaused(bool bPaused) override;
87 virtual bool GetMasterChannelPaused() const override;
88
93 virtual void SetSoundGroupVolume(plStringView sVcaGroupGuid, float fVolume) override;
94 virtual float GetSoundGroupVolume(plStringView sVcaGroupGuid) const override;
95 void UpdateSoundGroupVolumes();
96
98 virtual void SetNumListeners(plUInt8 uiNumListeners) override;
99 virtual plUInt8 GetNumListeners() override;
100
101 static void GameApplicationEventHandler(const plGameApplicationExecutionEvent& e);
102
109 void SetNumBlendedReverbVolumes(plUInt8 uiNumBlendedVolumes);
110
112 plUInt8 GetNumBlendedReverbVolumes() const { return m_uiNumBlendedVolumes; }
113
114
115 virtual void SetListenerOverrideMode(bool bEnabled) override;
116 virtual void SetListener(plInt32 iIndex, const plVec3& vPosition, const plVec3& vForward, const plVec3& vUp, const plVec3& vVelocity) override;
117 plVec3 GetListenerPosition() { return m_vListenerPosition; }
118
119 virtual plResult OneShotSound(plStringView sResourceID, const plTransform& globalPosition, float fPitch = 1.0f, float fVolume = 1.0f, bool bBlockIfNotLoaded = true) override;
120
121private:
122 friend class plFmodSoundBankResource;
123 void QueueSoundBankDataForDeletion(plDataBuffer* pData);
124 void ClearSoundBankDataDeletionQueue();
125 mutable plMutex m_DeletionQueueMutex;
126
127private:
128 void DetectPlatform();
129 plResult LoadMasterSoundBank(const char* szMasterBankResourceID);
130
131 bool m_bInitialized = false;
132 bool m_bListenerOverrideMode = false;
133 plVec3 m_vListenerPosition;
134 plUInt8 m_uiNumBlendedVolumes = 4;
135
136 FMOD::Studio::System* m_pStudioSystem;
137 FMOD::System* m_pLowLevelSystem;
138
139 struct Data
140 {
141 plMap<plString, float> m_VcaVolumes;
142 plFmodAssetProfiles m_Configs;
143 plString m_sPlatform;
144 plFmodSoundBankResourceHandle m_hMasterBank;
145 plFmodSoundBankResourceHandle m_hMasterBankStrings;
146 plHybridArray<plDataBuffer*, 4> m_SbDeletionQueue;
147 };
148
149 plUniquePtr<Data> m_pData;
150};
Definition FmodSingleton.h:53
plUInt8 GetNumBlendedReverbVolumes() const
See SetNumBlendedReverbVolumes()
Definition FmodSingleton.h:112
Definition FmodSoundBankResource.h:14
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
Definition Map.h:408
Provides a simple mechanism for mutual exclusion to prevent multiple threads from accessing a shared ...
Definition Mutex.h:13
Represents a single 'object' in a DDL document, e.g. either a custom type or a primitives list.
Definition OpenDdlReader.h:11
The base class for OpenDDL writers.
Definition OpenDdlWriter.h:13
Definition SoundInterface.h:7
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
A Unique ptr manages an object and destroys that object when it goes out of scope....
Definition UniquePtr.h:10
All available Fmod platform configurations.
Definition FmodSingleton.h:43
The Fmod configuration to be used on a specific platform.
Definition FmodSingleton.h:27
Definition GameApplicationBase.h:32
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54