stuttering observed, move to jthread

This commit is contained in:
goeiecool9999 2023-12-17 18:03:17 +01:00
parent 4ac7cb9f62
commit 91c5a01dbc
2 changed files with 34 additions and 26 deletions

View File

@ -126,8 +126,4 @@ void LatteShaderCache_writeSeparableGeometryShader(uint64 shaderBaseHash, uint64
void LatteShaderCache_writeSeparablePixelShader(uint64 shaderBaseHash, uint64 shaderAuxHash, uint8* pixelShader, uint32 pixelShaderSize, uint32* contextRegisters, bool usesGeometryShader); void LatteShaderCache_writeSeparablePixelShader(uint64 shaderBaseHash, uint64 shaderAuxHash, uint8* pixelShader, uint32 pixelShaderSize, uint32* contextRegisters, bool usesGeometryShader);
// todo - refactor this // todo - refactor this
sint32 LatteDecompiler_getTextureSamplerBaseIndex(LatteConst::ShaderType shaderType); sint32 LatteDecompiler_getTextureSamplerBaseIndex(LatteConst::ShaderType shaderType);
void LatteShaderCache_InitBootSound();
void LatteShaderCache_StreamBootSound();
void LatteShaderCache_ShutdownBootSound();

View File

@ -68,6 +68,9 @@ void LatteShaderCache_LoadVulkanPipelineCache(uint64 cacheTitleId);
bool LatteShaderCache_updatePipelineLoadingProgress(); bool LatteShaderCache_updatePipelineLoadingProgress();
void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateFunc, bool isPipelines); void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateFunc, bool isPipelines);
void LatteShaderCache_InitBootSound();
void LatteShaderCache_ShutdownBootSound();
void LatteShaderCache_handleDeprecatedCacheFiles(fs::path pathGeneric, fs::path pathGenericPre1_25_0, fs::path pathGenericPre1_16_0); void LatteShaderCache_handleDeprecatedCacheFiles(fs::path pathGeneric, fs::path pathGenericPre1_25_0, fs::path pathGenericPre1_16_0);
struct struct
@ -504,7 +507,6 @@ void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateF
// finish frame // finish frame
g_renderer->SwapBuffers(true, true); g_renderer->SwapBuffers(true, true);
LatteShaderCache_StreamBootSound();
} }
} }
@ -817,47 +819,57 @@ void LatteShaderCache_handleDeprecatedCacheFiles(fs::path pathGeneric, fs::path
} }
} }
static AudioAPIPtr g_BootSndAudioDev = nullptr; constexpr sint32 samplesPerBlock = 4800;
static std::unique_ptr<BootSoundReader> g_BootSndFileReader;
static FSCVirtualFile* g_bootSndFileHandle = 0;
void LatteShaderCache_InitBootSound() void LatteShaderCache_StreamBootSound(const std::stop_token& token)
{ {
const sint32 samplesPerBlock = 4800; AudioAPIPtr bootSndAudioDev;
std::unique_ptr<BootSoundReader> bootSndFileReader;
FSCVirtualFile* bootSndFileHandle = 0;
const sint32 audioBlockSize = samplesPerBlock * 2 * 2; const sint32 audioBlockSize = samplesPerBlock * 2 * 2;
try try
{ {
g_BootSndAudioDev = IAudioAPI::CreateDeviceFromConfig(true, 48000, 2, samplesPerBlock, 16); bootSndAudioDev = IAudioAPI::CreateDeviceFromConfig(true, 48000, 2, samplesPerBlock, 16);
} }
catch (const std::runtime_error& ex) catch (const std::runtime_error& ex)
{ {
cemuLog_log(LogType::Force, "Failed to initialise audio device for bootup sound"); cemuLog_log(LogType::Force, "Failed to initialise audio device for bootup sound");
return; return;
} }
g_BootSndAudioDev->Play(); bootSndAudioDev->Play();
std::string sndPath = fmt::format("{}/meta/{}", CafeSystem::GetMlcStoragePath(CafeSystem::GetForegroundTitleId()), "bootSound.btsnd"); std::string sndPath = fmt::format("{}/meta/{}", CafeSystem::GetMlcStoragePath(CafeSystem::GetForegroundTitleId()), "bootSound.btsnd");
sint32 fscStatus = FSC_STATUS_UNDEFINED; sint32 fscStatus = FSC_STATUS_UNDEFINED;
g_bootSndFileHandle = fsc_open(sndPath.c_str(), FSC_ACCESS_FLAG::OPEN_FILE | FSC_ACCESS_FLAG::READ_PERMISSION, &fscStatus); bootSndFileHandle = fsc_open(sndPath.c_str(), FSC_ACCESS_FLAG::OPEN_FILE | FSC_ACCESS_FLAG::READ_PERMISSION, &fscStatus);
if(!g_bootSndFileHandle) if(!bootSndFileHandle)
return; return;
g_BootSndFileReader = std::make_unique<BootSoundReader>(g_bootSndFileHandle, audioBlockSize); bootSndFileReader = std::make_unique<BootSoundReader>(bootSndFileHandle, audioBlockSize);
if(bootSndAudioDev && bootSndFileHandle && bootSndFileReader)
{
while(!token.stop_requested())
{
if (bootSndAudioDev->NeedAdditionalBlocks())
bootSndAudioDev->FeedBlock(bootSndFileReader->getSamples());
// sleep for half the duration of a single block
std::this_thread::sleep_for(std::chrono::milliseconds(samplesPerBlock / (48'000/ 1'000) / 2));
}
}
if(bootSndFileHandle)
fsc_close(bootSndFileHandle);
} }
void LatteShaderCache_StreamBootSound() static std::jthread g_bootSndPlayThread;
void LatteShaderCache_InitBootSound()
{ {
if(g_BootSndAudioDev && g_bootSndFileHandle && g_BootSndFileReader) if(!g_bootSndPlayThread.joinable())
{ g_bootSndPlayThread = std::jthread{LatteShaderCache_StreamBootSound};
if (g_BootSndAudioDev->NeedAdditionalBlocks())
g_BootSndAudioDev->FeedBlock(g_BootSndFileReader->getSamples());
}
} }
void LatteShaderCache_ShutdownBootSound() void LatteShaderCache_ShutdownBootSound()
{ {
g_BootSndFileReader.reset(); g_bootSndPlayThread = {};
if(g_bootSndFileHandle)
fsc_close(g_bootSndFileHandle);
g_BootSndAudioDev.reset();
} }