diff --git a/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp b/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp index e98d895a..cd04f841 100644 --- a/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp +++ b/SHADE_Engine/src/AudioSystem/SHAudioSystem.cpp @@ -325,27 +325,70 @@ namespace SHADE return std::nullopt; } - AudioClip* SHAudioSystem::CreateAudioClip(const char* path) + Handle SHAudioSystem::CreateAudioClip(const char* path) { - AudioClipID newID{}; - AudioClip* clip = nullptr; - auto it = eventMap.find(path); - if (it != eventMap.end()) + Handle audioClipHandle{}; + + if(auto it = eventMap.find(path); it != eventMap.end()) { - FMOD::Studio::EventInstance* event = nullptr; - it->second->createInstance(&event); - if (event) - { - //event->start(); - newID = clipID; - clipID++; - eventInstances.emplace(newID, AudioClip(newID, event)); - clip = &eventInstances[newID]; - } + audioClipHandle = audioClipLibrary.Create(); + it->second->createInstance(&audioClipHandle->instance); } - return clip; + + return audioClipHandle; } + void SHAudioSystem::AddAudioClipToBGMChannelGroup(Handle handle) + { + if(!handle->instance) + return; + FMOD::ChannelGroup* channelGroup; + handle->instance->getChannelGroup(&channelGroup); + + if(!channelGroup) + { + SHLOG_ERROR("Event instance has no channel group") + return; + } + bgmChannelGroup->addGroup(channelGroup); + } + + void SHAudioSystem::AddAudioClipToSFXChannelGroup(Handle handle) + { + if (!handle->instance) + return; + FMOD::ChannelGroup* channelGroup; + handle->instance->getChannelGroup(&channelGroup); + + if (!channelGroup) + { + SHLOG_ERROR("Event instance has no channel group") + return; + } + sfxChannelGroup->addGroup(channelGroup); + } + + //AudioClip* SHAudioSystem::CreateAudioClip(const char* path) + //{ + // AudioClipID newID{}; + // AudioClip* clip = nullptr; + // auto it = eventMap.find(path); + // if (it != eventMap.end()) + // { + // FMOD::Studio::EventInstance* event = nullptr; + // it->second->createInstance(&event); + // if (event) + // { + // //event->start(); + // newID = clipID; + // clipID++; + // eventInstances.emplace(newID, AudioClip(newID, event)); + // clip = &eventInstances[newID]; + // } + // } + // return clip; + //} + //std::vector SHAudioSystem::GetAllEvents() //{ // int count{}; @@ -489,41 +532,39 @@ namespace SHADE } } - AudioClip::AudioClip(AudioClipID clipID, FMOD::Studio::EventInstance* inst) - :instance(inst), id(clipID) + void AudioClip::Play() { - } - - AudioClip::~AudioClip() - { - } - - void AudioClip::Play(bool isSfx) - { - if (!instance) + if(!instance) return; instance->start(); - auto audioSystem = SHSystemManager::GetSystem(); - instance->setVolume(audioSystem->GetMasterVolume() * (isSfx ? audioSystem->GetSfxVolume() : audioSystem->GetBgmVolume())); } - void AudioClip::Play(SHVec3 position, bool isSfx) - { - if (!instance) - return; - instance->start(); - FMOD_3D_ATTRIBUTES attributes{ {} }; - attributes.forward.z = 1.0f; - attributes.up.y = 1.0f; + //void AudioClip::Play(bool isSfx) + //{ + // if (!instance) + // return; + // instance->start(); + // auto audioSystem = SHSystemManager::GetSystem(); + // instance->setVolume(audioSystem->GetMasterVolume() * (isSfx ? audioSystem->GetSfxVolume() : audioSystem->GetBgmVolume())); + //} - auto audioSystem = SHSystemManager::GetSystem(); - SHVec3 listenerPos = audioSystem->GetListenerPosition(); - attributes.position.x = position[0]; - attributes.position.y = position[1]; - attributes.position.z = listenerPos[2]; - instance->set3DAttributes(&attributes); - instance->setVolume(audioSystem->GetMasterVolume() * (isSfx ? audioSystem->GetSfxVolume() : audioSystem->GetBgmVolume())); - } + //void AudioClip::Play(SHVec3 position, bool isSfx) + //{ + // if (!instance) + // return; + // instance->start(); + // FMOD_3D_ATTRIBUTES attributes{ {} }; + // attributes.forward.z = 1.0f; + // attributes.up.y = 1.0f; + + // auto audioSystem = SHSystemManager::GetSystem(); + // SHVec3 listenerPos = audioSystem->GetListenerPosition(); + // attributes.position.x = position[0]; + // attributes.position.y = position[1]; + // attributes.position.z = listenerPos[2]; + // instance->set3DAttributes(&attributes); + // instance->setVolume(audioSystem->GetMasterVolume() * (isSfx ? audioSystem->GetSfxVolume() : audioSystem->GetBgmVolume())); + //} void AudioClip::Stop(bool fadeOut) { @@ -557,12 +598,12 @@ namespace SHADE instance->setParameterByName(paramName, value); } - void AudioClip::SetParameterLabel(const char* paramName, const char* label) - { - if (!instance) - return; - instance->setParameterByNameWithLabel(paramName, label); - } + //void AudioClip::SetParameterLabel(const char* paramName, const char* label) + //{ + // if (!instance) + // return; + // instance->setParameterByNameWithLabel(paramName, label); + //} float AudioClip::GetParameterValue(const char* paramName) { diff --git a/SHADE_Engine/src/AudioSystem/SHAudioSystem.h b/SHADE_Engine/src/AudioSystem/SHAudioSystem.h index 777334e6..08505ea9 100644 --- a/SHADE_Engine/src/AudioSystem/SHAudioSystem.h +++ b/SHADE_Engine/src/AudioSystem/SHAudioSystem.h @@ -13,6 +13,7 @@ #include "Events/SHEvent.h" #include "SH_API.h" +#include #define AUDIO_SYS_MAX_CHANNELS 1024 namespace SHADE @@ -22,27 +23,22 @@ namespace SHADE class SHAudioListenerComponent; - typedef uint64_t AudioClipID; - class AudioClip { public: - AudioClip() = default; - AudioClip(AudioClipID clipID, FMOD::Studio::EventInstance* inst); - ~AudioClip(); - void Play(bool isSfx = true); - void Play(SHVec3 position, bool isSfx = true); + void Play(); + //void Play(SHVec3 position); void Stop(bool fadeOut = true); void SetPause(bool pause); bool IsPaused(); void SetParameter(const char* paramName, float value); - void SetParameterLabel(const char* paramName, const char* label); + //void SetParameterLabel(const char* paramName, const char* label); float GetParameterValue(const char* paramName); friend class SHAudioSystem; private: - FMOD::Studio::EventInstance* instance; - AudioClipID id; + FMOD::Studio::EventInstance* instance = nullptr; + //SHTransformComponent* transformRef; }; class SH_API SHAudioSystem : public SHSystem @@ -62,7 +58,7 @@ namespace SHADE void Exit(); int GetAvailableChannelIndex(); - /*std::vector::size_type CreateSound(const char* filepath, bool loop = false);*/ + void PlaySFX(EntityID id, EntityID eid, const bool& loop, const bool& spatial, float min = 5.0f, float max = 1000.0f); void PlayBGM(EntityID id, EntityID eid, const bool& loop, const bool& spatial, float min = 5.0f, float max = 1000.0f); void PlayEventOnce(const char* path, bool isSFX = true, EntityID eid = MAX_EID, bool spatial = false); @@ -71,8 +67,10 @@ namespace SHADE void StopAllSounds(); std::optional GetEventGUID(const char* path); - AudioClip* CreateAudioClip(const char* path); - //std::vector GetAllEvents(); + //AudioClip* CreateAudioClip(const char* path); + Handle CreateAudioClip(const char* path); + void AddAudioClipToBGMChannelGroup(Handle handle); + void AddAudioClipToSFXChannelGroup(Handle handle); float GetBgmVolume(); float GetSfxVolume(); @@ -84,6 +82,7 @@ namespace SHADE bool GetPaused() const; SHVec3 GetListenerPosition(); void LoadBank(const char* path); + private: FMOD::Studio::System* fmodStudioSystem; FMOD::System* fmodSystem; @@ -95,7 +94,9 @@ namespace SHADE //std::unordered_map bankMap; std::unordered_map bankMap; std::unordered_map eventMap; - std::unordered_map eventInstances; + //std::unordered_map eventInstances; + SHResourceLibrary audioClipLibrary{}; + FMOD::ChannelGroup* bgmChannelGroup, * sfxChannelGroup, * masterGroup; FMOD::Channel* audioChannels[AUDIO_SYS_MAX_CHANNELS]; FMOD_RESULT result; @@ -105,7 +106,6 @@ namespace SHADE SHBank masterBank, stringsBank, musicBank, sfxBank; //To do: change to map of banks loaded by resource manager std::vector* denseListener; - AudioClipID clipID = 0; SHEventHandle onPlay(SHEventPtr onStopEvent); SHEventHandle onStop(SHEventPtr onStopEvent);