mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-02-22 12:47:14 +01:00
stuttering observed, move to jthread
This commit is contained in:
parent
4ac7cb9f62
commit
91c5a01dbc
@ -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();
|
|
@ -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();
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user