diff --git a/src/Cafe/HW/Latte/Core/Latte.h b/src/Cafe/HW/Latte/Core/Latte.h index 09a152a3..dc3cbc91 100644 --- a/src/Cafe/HW/Latte/Core/Latte.h +++ b/src/Cafe/HW/Latte/Core/Latte.h @@ -178,8 +178,4 @@ void LatteRenderTarget_updateViewport(); void Latte_Start(); void Latte_Stop(); bool Latte_GetStopSignal(); // returns true if stop was requested or if in stopped state -void LatteThread_Exit(); - -void LatteThread_InitBootSound(); -void LatteThread_StreamBootSound(); -void LatteThread_ShutdownBootSound(); +void LatteThread_Exit(); \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteShader.h b/src/Cafe/HW/Latte/Core/LatteShader.h index f8dc6d1a..5e4fca03 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.h +++ b/src/Cafe/HW/Latte/Core/LatteShader.h @@ -126,4 +126,8 @@ void LatteShaderCache_writeSeparableGeometryShader(uint64 shaderBaseHash, uint64 void LatteShaderCache_writeSeparablePixelShader(uint64 shaderBaseHash, uint64 shaderAuxHash, uint8* pixelShader, uint32 pixelShaderSize, uint32* contextRegisters, bool usesGeometryShader); // todo - refactor this -sint32 LatteDecompiler_getTextureSamplerBaseIndex(LatteConst::ShaderType shaderType); \ No newline at end of file +sint32 LatteDecompiler_getTextureSamplerBaseIndex(LatteConst::ShaderType shaderType); + +void LatteShaderCache_InitBootSound(); +void LatteShaderCache_StreamBootSound(); +void LatteShaderCache_ShutdownBootSound(); \ No newline at end of file diff --git a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp index 827c7da9..a113d5f8 100644 --- a/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShaderCache.cpp @@ -301,6 +301,10 @@ void LatteShaderCache_Load() loadBackgroundTexture(true, g_shaderCacheLoaderState.textureTVId); loadBackgroundTexture(false, g_shaderCacheLoaderState.textureDRCId); + // initialise resources for playing bootup sound + if(GetConfig().play_boot_sound) + LatteShaderCache_InitBootSound(); + sint32 numLoadedShaders = 0; uint32 loadIndex = 0; @@ -367,6 +371,9 @@ void LatteShaderCache_Load() g_renderer->DeleteTexture(g_shaderCacheLoaderState.textureTVId); if (g_shaderCacheLoaderState.textureDRCId) g_renderer->DeleteTexture(g_shaderCacheLoaderState.textureDRCId); + + // free resources for playing boot sound + LatteShaderCache_ShutdownBootSound(); } void LatteShaderCache_ShowProgress(const std::function & loadUpdateFunc, bool isPipelines) @@ -497,7 +504,7 @@ void LatteShaderCache_ShowProgress(const std::function & loadUpdateF // finish frame g_renderer->SwapBuffers(true, true); - LatteThread_StreamBootSound(); + LatteShaderCache_StreamBootSound(); } } @@ -809,3 +816,48 @@ void LatteShaderCache_handleDeprecatedCacheFiles(fs::path pathGeneric, fs::path } } } + +AudioAPIPtr g_BootSndAudioDev = nullptr; +std::unique_ptr g_BootSndFileReader; +FSCVirtualFile* g_bootSndFileHandle = 0; + +void LatteShaderCache_InitBootSound() +{ + const sint32 samplesPerBlock = 4800; + const sint32 audioBlockSize = samplesPerBlock * 2 * 2; + try + { + g_BootSndAudioDev = IAudioAPI::CreateDeviceFromConfig(true, 48000, 2, samplesPerBlock, 16); + } + catch (const std::runtime_error& ex) + { + cemuLog_log(LogType::Force, "Failed to initialise audio device for bootup sound"); + return; + } + g_BootSndAudioDev->Play(); + + std::string sndPath = fmt::format("{}/meta/{}", CafeSystem::GetMlcStoragePath(CafeSystem::GetForegroundTitleId()), "bootSound.btsnd"); + sint32 fscStatus = FSC_STATUS_UNDEFINED; + g_bootSndFileHandle = fsc_open(sndPath.c_str(), FSC_ACCESS_FLAG::OPEN_FILE | FSC_ACCESS_FLAG::READ_PERMISSION, &fscStatus); + if(!g_bootSndFileHandle) + return; + + g_BootSndFileReader = std::make_unique(g_bootSndFileHandle, audioBlockSize); +} + +void LatteShaderCache_StreamBootSound() +{ + if(g_BootSndAudioDev && g_bootSndFileHandle && g_BootSndFileReader) + { + if (g_BootSndAudioDev->NeedAdditionalBlocks()) + g_BootSndAudioDev->FeedBlock(g_BootSndFileReader->getSamples()); + } +} + +void LatteShaderCache_ShutdownBootSound() +{ + g_BootSndFileReader.reset(); + if(g_bootSndFileHandle) + fsc_close(g_bootSndFileHandle); + g_BootSndAudioDev.reset(); +} diff --git a/src/Cafe/HW/Latte/Core/LatteThread.cpp b/src/Cafe/HW/Latte/Core/LatteThread.cpp index 9e79addc..60b32ec4 100644 --- a/src/Cafe/HW/Latte/Core/LatteThread.cpp +++ b/src/Cafe/HW/Latte/Core/LatteThread.cpp @@ -15,9 +15,6 @@ #include "util/helpers/helpers.h" #include -#include