3#include "mc/_HeaderOutputPredefine.h"
6#include "mc/deps/audio/SoundPauseSource.h"
7#include "mc/deps/audio/SoundSystemBase.h"
8#include "mc/deps/audio/fmod/FileSystemFMOD.h"
9#include "mc/deps/audio/fmod/SoundInstanceListFMOD.h"
10#include "mc/deps/audio/fmod/SoundLoaderFMOD.h"
11#include "mc/deps/core/file/PathBuffer.h"
12#include "mc/deps/core/sound/SoundFormat.h"
13#include "mc/deps/core/utility/Owner.h"
14#include "mc/deps/core/utility/UniqueOwnerPointer.h"
15#include "mc/deps/game_refs/WeakRef.h"
39namespace Core {
class Path; }
41namespace FMOD {
class Channel; }
43namespace FMOD {
class Sound; }
44namespace FMOD {
class System; }
59 ::ll::TypedStorage<8, 8, ::FMOD::Channel*> mChannel;
60 ::ll::TypedStorage<8, 8, ::FMOD::Sound*> mSound;
61 ::ll::TypedStorage<8, 8, uint64> mHandle;
62 ::ll::TypedStorage<4, 4, int> mByteDepth;
63 ::ll::TypedStorage<4, 4, int> mChannels;
64 ::ll::TypedStorage<4, 4, int> mSamplingRate;
65 ::ll::TypedStorage<4, 4, int> mDecodeBufferSize;
66 ::ll::TypedStorage<8, 24, ::std::vector<float>> mSwapBuffer;
67 ::ll::TypedStorage<8, 80, ::std::mutex> mDataLock;
68 ::ll::TypedStorage<4, 4, uint> mWriteCursor;
69 ::ll::TypedStorage<4, 4, uint> mReadCursor;
70 ::ll::TypedStorage<8, 24, ::std::vector<float>> mData;
71 ::ll::TypedStorage<1, 1, bool> mHasReceivedAllData;
72 ::ll::TypedStorage<4, 4, float> mVolumeOnPause;
76 using LockType = ::std::mutex;
81 ::ll::TypedStorage<8, 8, ::FMOD::System*> mSystem;
82 ::ll::TypedStorage<8, 32, ::Bedrock::Owner<uint64>> mSoundUniqueID;
83 ::ll::TypedStorage<8, 40, ::SoundInstanceListFMOD> mActiveSounds;
84 ::ll::TypedStorage<8, 64, ::std::unordered_map<uint64, ::std::unique_ptr<::SoundSystemFMOD::StreamInfo>>>
86 ::ll::TypedStorage<8, 8, uint64> mLoopingSoundUniqueID;
87 ::ll::TypedStorage<8, 8, uint64> mStreamingSoundUniqueID;
88 ::ll::TypedStorage<1, 1, bool> mEnabled;
89 ::ll::TypedStorage<8, 8, ::FMOD::ChannelGroup*> mPrimaryChannelGroup;
90 ::ll::TypedStorage<8, 8, ::FMOD::ChannelGroup*> mSoundChannelGroup;
91 ::ll::TypedStorage<8, 8, ::FMOD::ChannelGroup*> mMusicChannelGroup;
92 ::ll::TypedStorage<8, 8, ::FMOD::ChannelGroup*> mTTSChannelGroup;
93 ::ll::TypedStorage<8, 16, ::std::map<::std::string, ::FMOD::ChannelGroup*>> mSoundCategoryChannelGroups;
94 ::ll::TypedStorage<1, 1, ::FileSystemFMOD> mFileSystem;
95 ::ll::TypedStorage<8, 16, ::gsl::not_null<::std::shared_ptr<::FMODSoundReleaseQueue>>
const> mSoundReleaseQueue;
96 ::ll::TypedStorage<8, 8, ::gsl::not_null<::std::unique_ptr<::SoundCacheFMOD>>
const> mSoundCache;
97 ::ll::TypedStorage<8, 8, ::ResourceLoader&> mResourceLoader;
98 ::ll::TypedStorage<8, 16, ::gsl::not_null<::Bedrock::UniqueOwnerPointer<::Audio::IAudioAssetProvider const>>
const>
100 ::ll::TypedStorage<8, 144, ::SoundLoaderFMOD> mSoundLoader;
101 ::ll::TypedStorage<8, 32, ::Core::PathBuffer<::std::string>> mDataUrl;
102 ::ll::TypedStorage<8, 8, uint64> mThreadMask;
103 ::ll::TypedStorage<8, 64, ::std::function<void(::SoundLoadTask)>> mAsyncLoad;
104 ::ll::TypedStorage<4, 4, float> mEvictionStatTimer;
105 ::ll::TypedStorage<8, 8, uint64> mCurrentEvictionRate;
110 SoundSystemFMOD& operator=(SoundSystemFMOD
const&);
111 SoundSystemFMOD(SoundSystemFMOD
const&);
117 virtual ~SoundSystemFMOD() =
default;
119 virtual bool preinit() ;
121 virtual void init() ;
123 virtual void destroy() ;
125 virtual void setOutputDevice(::SoundSystemGUID& outputDevice) ;
127 virtual void setAsyncLoadFunction(::std::function<
void(::SoundLoadTask)> asyncLoad) ;
129 virtual void enable(
bool status) ;
131 virtual void mute(
bool muted) ;
133 virtual bool addListener(
int const handle) ;
135 virtual void removeListener(
int const handle) ;
137 virtual void setMainVolume(
float vol) ;
139 virtual void setMusicVolume(
float vol) ;
141 virtual void setSoundVolume(
float vol) ;
143 virtual void setSoundCategoryVolume(::std::string
const& category,
float vol) ;
145 virtual void setTTSVolume(
float vol) ;
147 virtual bool loadRawFromMemory(
148 ::Core::Path
const& soundPath,
152 int defaultfrequency,
156 virtual bool loadFromMemory(::Core::Path
const& soundPath,
char const* data, uint64 dataSize) ;
158 virtual void unload(::Core::Path
const& soundPath) ;
160 virtual void unloadAllExcept(::std::vector<::Core::PathBuffer<::std::string>>
const& exceptions) ;
162 virtual void stop(::std::string
const& eventName) ;
164 virtual void stop(uint64 handle) ;
166 virtual void stop(::ServerSoundHandle serverSoundHandle) ;
168 virtual void setVolume(::ServerSoundHandle serverSoundHandle,
float volume) ;
170 virtual void setPitch(::ServerSoundHandle serverSoundHandle,
float pitch) ;
172 virtual void fade(::ServerSoundHandle serverSoundHandle,
float duration,
float targetVolume) ;
174 virtual void setPlaybackPosition(::ServerSoundHandle serverSoundHandle,
float seconds) ;
176 virtual void setPlaybackPosition(uint64 soundHandle,
float seconds) ;
178 virtual void pause(::ServerSoundHandle serverSoundHandle, ::SoundPauseSource source) ;
180 virtual void pause(uint64 soundHandle, ::SoundPauseSource source) ;
182 virtual void resume(::ServerSoundHandle serverSoundHandle, ::SoundPauseSource source) ;
184 virtual void resume(uint64 soundHandle, ::SoundPauseSource source) ;
186 virtual void signalStart(uint64 soundHandle) ;
188 virtual void stopAllSounds() ;
190 virtual void pauseAllPlayingSounds(::SoundPauseSource source) ;
192 virtual void resumeAllPreviouslyPlayingSounds(::SoundPauseSource source) ;
194 virtual void fadeOut(uint64 handle,
float duration)
const ;
197 playEvent(::SoundEvent
const& soundEvent, ::std::string
const& eventName,
float volume,
float pitch) ;
199 virtual uint64 playEventAt(
200 ::SoundEvent
const& soundEvent,
201 ::std::string
const& eventName,
207 ::std::optional<::ServerSoundHandle> serverSoundHandle
210 virtual uint64 playEventAt(::SoundEvent
const& soundEvent, ::PlaySoundOptions
const& options) ;
212 virtual uint64 playStreamableEventAt(
213 ::SoundEvent
const& soundEvent,
214 ::SoundItem
const& soundItem,
215 ::std::unique_ptr<::Audio::IStreamableAudioAsset> streamableAudioAsset,
216 ::PlaySoundOptions
const& options
219 virtual uint64 playEventAttached(
220 ::SoundEvent
const& soundEvent,
221 ::std::string
const& eventName,
222 ::std::function<
void(::SoundInstanceProperties&)>&& getSoundProperties
225 virtual uint64 playAt(
226 ::Core::Path
const& soundPath,
227 ::SoundEvent
const* soundEvent,
228 ::std::string
const& eventName,
238 bool useLegacyMaxDistance,
240 ::std::optional<::ServerSoundHandle> serverSoundHandle,
245 virtual void playMusic(::PlayMusicOptions options, ::SoundItem
const& soundItem) ;
247 virtual uint64 playStreamableMusic(
248 ::std::string
const& eventName,
249 ::SoundItem
const& soundItem,
250 ::std::unique_ptr<::Audio::IStreamableAudioAsset> streamableAudioAsset
253 virtual void pauseMusic(
bool paused) ;
255 virtual void stopMusic() ;
257 virtual void fadeMusicOut(
float time) ;
259 virtual bool isMusicChannelPlaying() const ;
261 virtual
bool isPlayingMusicEvent(::std::
string const& eventName) const ;
263 virtual
bool isPlayingMusic(::Core::PathView soundPath) const ;
265 virtual
bool isLoadingMusic() const ;
267 virtual
void cancelLoadMusic() ;
269 virtual ::Core::PathView getCurrentlyPlayingMusicPath() const ;
271 virtual ::std::
string getCurrentlyPlayingEventName() const ;
273 virtual
void update(
float elapsedTime) ;
275 virtual
void playSound(
281 ::FMOD::ChannelGroup* channelGroup,
282 ::FMOD::Channel*& channel,
283 ::FMOD::Sound*& soundToPlay,
287 bool useLegacyMaxDistance,
291 virtual ::FMOD::Sound* getFirstSubSound(::std::shared_ptr<::FMOD::Sound> const& sound) const;
293 virtual
bool isPlayingSound(uint64 handle) const ;
295 virtual
bool isPlayingSound(::Core::Path const& soundPath) const ;
297 virtual
bool isPlayingSound(::ServerSoundHandle serverSoundHandle) const ;
299 virtual
bool isSoundActive(uint64 handle) const ;
301 virtual
bool wasSoundStoppedExplicitly(::ServerSoundHandle serverSoundHandle) const ;
303 virtual uint64 registerLoop(
304 ::SoundItem const& soundItem,
305 ::std::weak_ptr<::SoundEvent> const soundEvent,
306 ::std::
string const& eventName,
307 ::std::function<
void(::LoopingSoundState&)> getSoundState,
308 float fadeInDuration,
309 float fadeOutDuration
312 virtual
void unregisterLoop(uint64 handle,
bool hard) ;
314 virtual
void displayDebugStats(::std::
string& debugOutputFormat) const ;
316 virtual uint64 getNewSoundHandle() ;
318 virtual ::std::optional<::PlayingSoundAttributes> tryGetPlayingSoundAttributes(uint64 handle) const ;
320 virtual ::std::optional<::PlayingSoundAttributes>
321 tryGetPlayingSoundAttributes(::ServerSoundHandle serverSoundHandle) const ;
323 virtual ::std::optional<::LoopingSoundAttributes> tryGetLoopingSoundAttributes(uint64 handle) const ;
325 virtual uint64 playOnlineMusic(
326 ::std::
string const& eventName,
327 ::WeakRef<::Audio::OnlineAudioStream> stream,
329 ::Audio::SoundStartOptions startOptions
332 virtual uint64 playOnlineMusic(
333 ::std::
string const& eventName,
334 ::SoundItem const& soundItem,
335 ::WeakRef<::Audio::OnlineAudioStream> stream,
336 ::Audio::SoundStartOptions startOptions
339 virtual uint64 playOnlineSound(
340 ::WeakRef<::Audio::OnlineAudioStream> stream,
343 ::Audio::SoundStartOptions startOptions
346 virtual uint64 playOnlineSound(
347 ::SoundEvent const& soundEvent,
348 ::SoundItem const& soundItem,
349 ::WeakRef<::Audio::OnlineAudioStream> stream,
350 ::PlaySoundOptions const& options,
351 ::Audio::SoundStartOptions startOptions
354 virtual uint64 createRawUISoundStream(
int bitDepth,
int channels,
float samplingRate) ;
356 virtual
void closeRawUISoundStream(uint64 handle) ;
358 virtual
void playRawUISoundStream(uint64 handle) ;
360 virtual
void pauseRawUISoundStream(uint64 handle) ;
362 virtual
void feedRawUISoundStream(uint64 handle,
int samples,
float** pcm,
int channels) ;
364 virtual
void endRawUISoundStream(uint64 handle) ;
366 virtual
void setRawUISoundStreamVolume(uint64 handle,
float volume) ;
368 virtual
void flushRawUISoundStreamData(uint64 handle) ;
370 virtual
bool _createSystem();
372 virtual
bool _initSystem();
374 virtual
void _updateSystem(
float elapsedTime);
376 virtual
void _destroySystem();
378 virtual
void _updateListenerAttributes();
380 virtual
void _setPositionalAttributes(
381 ::FMOD::Channel* channel,
382 ::FMOD::Sound* sound,
383 ::FMOD::Sound* soundToPlay,
394 MCNAPI SoundSystemFMOD(
396 ::
std::unique_ptr<::Audio::IAudioAssetProvider const> audioAssetProvider,
397 ::Core::
Path const& tempFolderPath,
398 ::Core::
Path const& dataUrl,
409 ::Core::
Path const& soundPath,
410 ::
std::unique_ptr<::Audio::IStreamableAudioAsset> streamableAudioAsset,
416 ::Core::
Path const& soundPath,
418 ::
std::
string const& eventName,
428 bool useLegacyMaxDistance,
438 ::
std::
string const& eventName,
447 ::
std::optional<
float> playbackPositionSeconds,
457 ::
std::unique_ptr<::Audio::IAudioAssetProvider const> audioAssetProvider,
458 ::Core::
Path const& tempFolderPath,
459 ::Core::
Path const& dataUrl,
496 ::Core::
Path const& soundPath,
500 int defaultfrequency,
528 MCNAPI
void $pause(uint64 soundHandle, ::SoundPauseSource source);
532 MCNAPI
void $resume(uint64 soundHandle, ::SoundPauseSource source);
542 MCNAPI
void $fadeOut(uint64 handle,
float duration) const;
548 ::
std::
string const& eventName,
562 ::
std::unique_ptr<::Audio::IStreamableAudioAsset> streamableAudioAsset,
568 ::
std::
string const& eventName,
573 ::Core::
Path const& soundPath,
575 ::
std::
string const& eventName,
585 bool useLegacyMaxDistance,
595 ::
std::
string const& eventName,
597 ::
std::unique_ptr<::Audio::IStreamableAudioAsset> streamableAudioAsset
628 ::FMOD::ChannelGroup* channelGroup,
629 ::FMOD::Channel*& channel,
630 ::FMOD::
Sound*& soundToPlay,
634 bool useLegacyMaxDistance,
653 ::
std::
string const& eventName,
655 float fadeInDuration,
656 float fadeOutDuration
673 ::
std::
string const& eventName,
674 ::
WeakRef<::Audio::OnlineAudioStream> stream,
676 ::Audio::SoundStartOptions startOptions
680 ::
std::
string const& eventName,
682 ::
WeakRef<::Audio::OnlineAudioStream> stream,
683 ::Audio::SoundStartOptions startOptions
687 ::
WeakRef<::Audio::OnlineAudioStream> stream,
690 ::Audio::SoundStartOptions startOptions
696 ::
WeakRef<::Audio::OnlineAudioStream> stream,
698 ::Audio::SoundStartOptions startOptions
728 ::FMOD::Channel* channel,
729 ::FMOD::
Sound* sound,
730 ::FMOD::
Sound* soundToPlay,
Definition IAudioAssetProvider.h:7
Definition IStreamableAudioAsset.h:10
Definition OnlineAudioStream.h:7
Definition SoundStartOptions.h:7
Definition DiskSoundSourceFMOD.h:5
Definition FMODSoundReleaseQueue.h:5
Definition ChannelGroup.h:7
Definition ResourceLoader.h:16
Definition ServerSoundHandle.h:5
Definition SoundCacheFMOD.h:5
Definition SoundCacheKeyFMOD.h:5
Definition SoundEvent.h:10
Definition SoundSystemBase.h:31
Definition SoundSystemFMOD.h:5
MCAPI void $pauseMusic(bool paused)
MCAPI void $_setPositionalAttributes(::FMOD::Channel *channel, ::FMOD::Sound *sound, ::FMOD::Sound *soundToPlay, float x, float y, float z, float volume)
MCAPI void $removeListener(int const handle)
MCAPI uint64 $playEvent(::SoundEvent const &soundEvent, ::std::string const &eventName, float volume, float pitch)
MCAPI void $displayDebugStats(::std::string &debugOutputFormat) const
MCAPI void $enable(bool status)
MCAPI void $closeRawUISoundStream(uint64 handle)
MCAPI ::std::optional<::PlayingSoundAttributes > $tryGetPlayingSoundAttributes(uint64 handle) const
MCAPI void $playRawUISoundStream(uint64 handle)
MCAPI::Core::PathView $getCurrentlyPlayingMusicPath() const
MCAPI void $setPitch(::ServerSoundHandle serverSoundHandle, float pitch)
MCAPI bool $isMusicChannelPlaying() const
MCAPI uint64 $playStreamableMusic(::std::string const &eventName, ::SoundItem const &soundItem, ::std::unique_ptr<::Audio::IStreamableAudioAsset > streamableAudioAsset)
MCAPI void $setSoundVolume(float vol)
MCAPI void $fade(::ServerSoundHandle serverSoundHandle, float duration, float targetVolume)
MCAPI uint64 _playAt(::Core::Path const &soundPath, ::SoundEvent const *soundEvent, ::std::string const &eventName, uint64 soundHandle, float x, float y, float z, float volume, float pitch, bool is3D, float minDistance, float maxDistance, bool useLegacyMaxDistance, bool isTTS, ::std::optional<::ServerSoundHandle > serverSoundHandle, int loopCount, float volumeBase, int channelPriority)
MCAPI void $pauseAllPlayingSounds(::SoundPauseSource source)
MCAPI bool $_createSystem()
MCAPI void $setOutputDevice(::SoundSystemGUID &outputDevice)
MCAPI uint64 $playEventAt(::SoundEvent const &soundEvent, ::std::string const &eventName, float x, float y, float z, float volume, float pitch, ::std::optional<::ServerSoundHandle > serverSoundHandle)
MCAPI bool $isSoundActive(uint64 handle) const
MCAPI bool $isPlayingSound(uint64 handle) const
MCAPI void $pauseRawUISoundStream(uint64 handle)
MCAPI void $unregisterLoop(uint64 handle, bool hard)
MCAPI bool $loadFromMemory(::Core::Path const &soundPath, char const *data, uint64 dataSize)
MCAPI::FMOD::Sound * $getFirstSubSound(::std::shared_ptr<::FMOD::Sound > const &sound) const
MCAPI void $_destroySystem()
MCAPI bool $wasSoundStoppedExplicitly(::ServerSoundHandle serverSoundHandle) const
MCAPI void $stop(::std::string const &eventName)
MCAPI void $fadeOut(uint64 handle, float duration) const
MCAPI void $flushRawUISoundStreamData(uint64 handle)
MCAPI uint64 _playEvent(::SoundEvent const &soundEvent, ::std::string const &eventName, float volumeScalar, float pitchScalar, bool is2D, float x, float y, float z, ::std::optional<::ServerSoundHandle > serverSoundHandle, int loopCount, ::std::optional< float > playbackPositionSeconds, int channelPriority)
MCAPI void $signalStart(uint64 soundHandle)
MCAPI bool $isLoadingMusic() const
MCAPI void $setVolume(::ServerSoundHandle serverSoundHandle, float volume)
MCAPI void $setRawUISoundStreamVolume(uint64 handle, float volume)
MCAPI void $cancelLoadMusic()
MCAPI void $setMainVolume(float vol)
MCAPI void $setTTSVolume(float vol)
MCAPI uint64 $getNewSoundHandle()
MCAPI void $mute(bool muted)
MCAPI void $_updateListenerAttributes()
MCAPI bool $loadRawFromMemory(::Core::Path const &soundPath, char const *data, uint64 dataSize, int numchannels, int defaultfrequency, ::SoundFormat format)
MCAPI ::std::optional<::LoopingSoundAttributes > $tryGetLoopingSoundAttributes(uint64 handle) const
MCAPI::std::string $getCurrentlyPlayingEventName() const
MCAPI void $playMusic(::PlayMusicOptions options, ::SoundItem const &soundItem)
MCAPI void _loadSoundAsync(::SoundItem const &soundItem, ::SoundCacheKeyFMOD soundCacheKey, ::std::weak_ptr<::DiskSoundSourceFMOD > weakSoundSource)
MCAPI void $resume(::ServerSoundHandle serverSoundHandle, ::SoundPauseSource source)
MCAPI bool $isPlayingMusicEvent(::std::string const &eventName) const
MCAPI void $fadeMusicOut(float time)
MCAPI void $endRawUISoundStream(uint64 handle)
MCAPI void $stopAllSounds()
MCAPI void $feedRawUISoundStream(uint64 handle, int samples, float **pcm, int channels)
MCAPI void $setSoundCategoryVolume(::std::string const &category, float vol)
MCAPI void $update(float elapsedTime)
MCAPI uint64 $playOnlineSound(::WeakRef<::Audio::OnlineAudioStream > stream, float volume, float pitch, ::Audio::SoundStartOptions startOptions)
MCAPI uint64 $playEventAttached(::SoundEvent const &soundEvent, ::std::string const &eventName, ::std::function< void(::SoundInstanceProperties &)> &&getSoundProperties)
MCAPI uint64 $registerLoop(::SoundItem const &soundItem, ::std::weak_ptr<::SoundEvent > const soundEvent, ::std::string const &eventName, ::std::function< void(::LoopingSoundState &)> getSoundState, float fadeInDuration, float fadeOutDuration)
MCAPI uint64 $playStreamableEventAt(::SoundEvent const &soundEvent, ::SoundItem const &soundItem, ::std::unique_ptr<::Audio::IStreamableAudioAsset > streamableAudioAsset, ::PlaySoundOptions const &options)
MCAPI void * $ctor(::ResourceLoader &resourceLoader, ::std::unique_ptr<::Audio::IAudioAssetProvider const > audioAssetProvider, ::Core::Path const &tempFolderPath, ::Core::Path const &dataUrl, uint64 threadMask)
MCAPI bool $addListener(int const handle)
MCAPI void $pause(::ServerSoundHandle serverSoundHandle, ::SoundPauseSource source)
MCAPI void $unloadAllExcept(::std::vector<::Core::PathBuffer<::std::string > > const &exceptions)
MCAPI void $setMusicVolume(float vol)
MCAPI void $setAsyncLoadFunction(::std::function< void(::SoundLoadTask)> asyncLoad)
MCAPI bool $isPlayingMusic(::Core::PathView soundPath) const
MCAPI void $_updateSystem(float elapsedTime)
MCAPI void $resumeAllPreviouslyPlayingSounds(::SoundPauseSource source)
MCAPI void $setPlaybackPosition(::ServerSoundHandle serverSoundHandle, float seconds)
MCAPI uint64 $createRawUISoundStream(int bitDepth, int channels, float samplingRate)
MCAPI bool $_initSystem()
MCAPI uint64 $playAt(::Core::Path const &soundPath, ::SoundEvent const *soundEvent, ::std::string const &eventName, uint64 soundHandle, float x, float y, float z, float volume, float pitch, bool is3D, float minDistance, float maxDistance, bool useLegacyMaxDistance, bool isTTS, ::std::optional<::ServerSoundHandle > serverSoundHandle, int loopCount, float volumeBase)
MCAPI void $unload(::Core::Path const &soundPath)
MCAPI void $playSound(float x, float y, float z, float volume, float pitch, ::FMOD::ChannelGroup *channelGroup, ::FMOD::Channel *&channel, ::FMOD::Sound *&soundToPlay, bool is3D, float minDistance, float maxDistance, bool useLegacyMaxDistance, int loopCount)
MCAPI uint64 $playOnlineMusic(::std::string const &eventName, ::WeakRef<::Audio::OnlineAudioStream > stream, float volume, ::Audio::SoundStartOptions startOptions)
Definition LoopingSoundAttributes.h:8
Definition LoopingSoundState.h:5
Definition PlayMusicOptions.h:5
Definition PlaySoundOptions.h:10
Definition PlayingSoundAttributes.h:5
Definition SoundInstanceProperties.h:5
Definition SoundLoadTask.h:5
Definition SoundSystemFMOD.h:13
Definition SoundSystemGUID.h:5