From 05a6b15eebf8a70ea232c6a07b9974551d6dab7d Mon Sep 17 00:00:00 2001 From: fallenoak Date: Tue, 25 Nov 2025 19:53:31 -0600 Subject: [PATCH] feat(sound): link ready SEDiskSounds to ready list for processing --- src/sound/SESound.cpp | 20 +++++++++++++++++--- src/sound/SESound.hpp | 1 + src/sound/SESoundInternal.hpp | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/sound/SESound.cpp b/src/sound/SESound.cpp index 181dc18..841c62e 100644 --- a/src/sound/SESound.cpp +++ b/src/sound/SESound.cpp @@ -17,6 +17,7 @@ TSHashTable SESound::s_InternalLookupTable; HASHKEY_NONE SESound::s_InternalLookupKey; SCritSect SESound::s_LoadingCritSect; FMOD::System* SESound::s_pGameSystem; +STORM_EXPLICIT_LIST(SEDiskSound, m_readyLink) SESound::s_ReadyDiskSounds; uint32_t SESound::s_UniqueID; void* FSoundAllocCallback(uint32_t size, FMOD_MEMORY_TYPE type, const char* sourcestr) { @@ -31,14 +32,14 @@ void FSoundFreeCallback(void* ptr, FMOD_MEMORY_TYPE type, const char *sourcestr) SMemFree(ptr, "FMod", 0, 0x0); } -FMOD_RESULT DoneLoadingCallback(FMOD_SOUND* sound, FMOD_RESULT callbackResult) { +FMOD_RESULT DoneLoadingCallback(FMOD_SOUND* fmodSound, FMOD_RESULT callbackResult) { FMOD_RESULT result; // Get hash value void* userData = nullptr; - result = FMOD_Sound_GetUserData(sound, &userData); + result = FMOD_Sound_GetUserData(fmodSound, &userData); if (result != FMOD_OK && result != FMOD_ERR_CHANNEL_STOLEN && result != FMOD_ERR_INVALID_HANDLE && result != FMOD_ERR_OUTPUT_DRIVERCALL) { LOG_WRITE(result, ""); @@ -68,12 +69,24 @@ FMOD_RESULT DoneLoadingCallback(FMOD_SOUND* sound, FMOD_RESULT callbackResult) { return callbackResult; } - // TODO pending load list + // Add to ready list (processed by SESound::Heartbeat) + + for (auto existing = SESound::s_InternalList.Head(); existing; existing = SESound::s_InternalList.Link(internal)->Next()) { + auto pendingLoad = internal->m_type == 1 + && static_cast(existing)->m_fmodSound == reinterpret_cast(fmodSound) + && !existing->m_fmodChannel; + + if (pendingLoad) { + SESound::s_ReadyDiskSounds.LinkToTail(static_cast(existing)); + } + } SESound::s_InternalCritSect.Leave(); SESound::s_LoadingCritSect.Enter(); + // Mark cache sound node as loaded + if (internal->m_useCache) { internal->m_cacheNode->loaded = 1; } @@ -439,6 +452,7 @@ int32_t SESound::LoadDiskSound(FMOD::System* fmodSystem, const char* filename, F // TODO + // Used to permit instant playback of cached sounds internal->m_nonblockingReady = nonblockingReady; s_LoadingCritSect.Leave(); diff --git a/src/sound/SESound.hpp b/src/sound/SESound.hpp index 7fa9fd2..7b2a8bc 100644 --- a/src/sound/SESound.hpp +++ b/src/sound/SESound.hpp @@ -22,6 +22,7 @@ class SESound { static HASHKEY_NONE s_InternalLookupKey; static SCritSect s_LoadingCritSect; static FMOD::System* s_pGameSystem; + static STORM_EXPLICIT_LIST(SEDiskSound, m_readyLink) s_ReadyDiskSounds; static uint32_t s_UniqueID; // Public static functions diff --git a/src/sound/SESoundInternal.hpp b/src/sound/SESoundInternal.hpp index 10ea470..e3304c1 100644 --- a/src/sound/SESoundInternal.hpp +++ b/src/sound/SESoundInternal.hpp @@ -45,6 +45,7 @@ class SEDiskSound : public SESoundInternal { public: // Member variables // TODO + TSLink m_readyLink; SFile* m_file = nullptr; // TODO FMOD::Sound* m_fmodSound = nullptr;