From bfe029bb0c87ad7e678b645dc1e1990f619b0690 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 14 Jun 2022 23:31:59 +0200 Subject: [PATCH] cellSysutil: implement some bgm fxo stuff --- rpcs3/Emu/Cell/Modules/cellSysutil.cpp | 130 +++++++++++++++++++++---- rpcs3/Emu/Cell/Modules/cellSysutil.h | 21 +++- 2 files changed, 130 insertions(+), 21 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp index 6e6377cf4e..bd58ad3c9f 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.cpp @@ -37,6 +37,26 @@ void fmt_class_string::format(std::string& out, u64 arg) }); } +template<> +void fmt_class_string::format(std::string& out, u64 arg) +{ + format_enum(out, arg, [](auto error) + { + switch (error) + { + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_ERROR_PARAM); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_ERROR_BUSY); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_ERROR_GENERIC); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_ALREADY_SETPARAM); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_DISABLE_SETPARAM); + STR_CASE(CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_GENERIC); + } + + return unknown; + }); +} + struct sysutil_cb_manager { struct alignas(8) registered_cb @@ -498,14 +518,26 @@ error_code cellSysutilUnregisterCallback(u32 slot) return CELL_OK; } -bool g_bgm_playback_enabled = true; +struct bgm_manager +{ + shared_mutex mtx; + CellSysutilBgmPlaybackExtraParam param{}; + CellSysutilBgmPlaybackStatus status{}; + + bgm_manager() + { + status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE; + status.playerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP; + } +}; error_code cellSysutilEnableBgmPlayback() { cellSysutil.warning("cellSysutilEnableBgmPlayback()"); - // TODO - g_bgm_playback_enabled = true; + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + bgm.status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_ENABLE; return CELL_OK; } @@ -514,8 +546,22 @@ error_code cellSysutilEnableBgmPlaybackEx(vm::ptrsystemBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeInTime > 60000 || + param->systemBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeOutTime > 60000 || + param->gameBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeInTime > 60000 || + param->gameBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeOutTime > 60000) + { + return CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM; + } + + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + bgm.param.systemBgmFadeInTime = param->systemBgmFadeInTime; + bgm.param.systemBgmFadeOutTime = param->systemBgmFadeOutTime; + bgm.param.gameBgmFadeInTime = param->gameBgmFadeInTime; + bgm.param.gameBgmFadeOutTime = param->gameBgmFadeOutTime; + bgm.status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_ENABLE; return CELL_OK; } @@ -524,8 +570,11 @@ error_code cellSysutilDisableBgmPlayback() { cellSysutil.warning("cellSysutilDisableBgmPlayback()"); - // TODO - g_bgm_playback_enabled = false; + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + bgm.status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE; + + // TODO: fade from system bgm to game bgm if necessary return CELL_OK; } @@ -534,8 +583,24 @@ error_code cellSysutilDisableBgmPlaybackEx(vm::ptrsystemBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeInTime > 60000 || + param->systemBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeOutTime > 60000 || + param->gameBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeInTime > 60000 || + param->gameBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeOutTime > 60000) + { + return CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM; + } + + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + bgm.param.systemBgmFadeInTime = param->systemBgmFadeInTime; + bgm.param.systemBgmFadeOutTime = param->systemBgmFadeOutTime; + bgm.param.gameBgmFadeInTime = param->gameBgmFadeInTime; + bgm.param.gameBgmFadeOutTime = param->gameBgmFadeOutTime; + bgm.status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE; + + // TODO: fade from system bgm to game bgm if necessary return CELL_OK; } @@ -544,12 +609,14 @@ error_code cellSysutilGetBgmPlaybackStatus(vm::ptr { cellSysutil.trace("cellSysutilGetBgmPlaybackStatus(status=*0x%x)", status); - // TODO - status->playerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP; - status->enableState = g_bgm_playback_enabled ? CELL_SYSUTIL_BGMPLAYBACK_STATUS_ENABLE : CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE; - status->currentFadeRatio = 0; // current volume ratio (0%) - memset(status->contentId, 0, sizeof(status->contentId)); - memset(status->reserved, 0, sizeof(status->reserved)); + if (!status) + { + return CELL_SYSUTIL_BGMPLAYBACK_ERROR_PARAM; + } + + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + *status = bgm.status; return CELL_OK; } @@ -558,16 +625,41 @@ error_code cellSysutilGetBgmPlaybackStatus2(vm::ptrplayerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP; + if (!status2) + { + return CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM; + } + + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + status2->playerState = bgm.status.playerState; memset(status2->reserved, 0, sizeof(status2->reserved)); return CELL_OK; } -error_code cellSysutilSetBgmPlaybackExtraParam() +error_code cellSysutilSetBgmPlaybackExtraParam(vm::ptr param) { - cellSysutil.todo("cellSysutilSetBgmPlaybackExtraParam()"); + cellSysutil.warning("cellSysutilSetBgmPlaybackExtraParam(param=*0x%x)", param); + + if (!param || + param->systemBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeInTime > 60000 || + param->systemBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->systemBgmFadeOutTime > 60000 || + param->gameBgmFadeInTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeInTime > 60000 || + param->gameBgmFadeOutTime < CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID || param->gameBgmFadeOutTime > 60000) + { + return CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM; + } + + auto& bgm = g_fxo->get(); + std::lock_guard lock(bgm.mtx); + bgm.param.systemBgmFadeInTime = param->systemBgmFadeInTime; + bgm.param.systemBgmFadeOutTime = param->systemBgmFadeOutTime; + bgm.param.gameBgmFadeInTime = param->gameBgmFadeInTime; + bgm.param.gameBgmFadeOutTime = param->gameBgmFadeOutTime; + + // TODO: apparently you are only able to set this only once and while bgm is enabled + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellSysutil.h b/rpcs3/Emu/Cell/Modules/cellSysutil.h index aa78c693fd..2a28d07f5e 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutil.h +++ b/rpcs3/Emu/Cell/Modules/cellSysutil.h @@ -257,6 +257,18 @@ enum CellSysCacheError : u32 CELL_SYSCACHE_ERROR_NOTMOUNTED = 0x8002bc04, // We don't really need to simulate the mounting, so this is probably useless }; +enum CellBgmplaybackError : u32 +{ + CELL_SYSUTIL_BGMPLAYBACK_ERROR_PARAM = 0x8002b101, + CELL_SYSUTIL_BGMPLAYBACK_ERROR_BUSY = 0x8002b102, + CELL_SYSUTIL_BGMPLAYBACK_ERROR_GENERIC = 0x8002b1FF, + + CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM = 0x8002d301, + CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_ALREADY_SETPARAM = 0x8002d302, + CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_DISABLE_SETPARAM = 0x8002d303, + CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_GENERIC = 0x8002d3FF, +}; + enum CellSysutilBgmPlaybackStatusState { CELL_SYSUTIL_BGMPLAYBACK_STATUS_PLAY = 0, @@ -269,12 +281,17 @@ enum CellSysutilBgmPlaybackStatusEnabled CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE = 1 }; +enum +{ + CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID = -1 +}; + struct CellSysutilBgmPlaybackStatus { u8 playerState; u8 enableState; - char contentId[16]; - u8 currentFadeRatio; + char contentId[16]; // CellSearchContentId + u8 currentFadeRatio; // current volume ratio (0=0%, 255=100%) char reserved[13]; };