cellSysutil: implement some bgm fxo stuff

This commit is contained in:
Megamouse 2022-06-14 23:31:59 +02:00
parent cbf12bb54b
commit bfe029bb0c
2 changed files with 130 additions and 21 deletions

View file

@ -37,6 +37,26 @@ void fmt_class_string<CellSysutilError>::format(std::string& out, u64 arg)
});
}
template<>
void fmt_class_string<CellBgmplaybackError>::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<bgm_manager>();
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::ptr<CellSysutilBgmPlaybackExtraPar
{
cellSysutil.warning("cellSysutilEnableBgmPlaybackEx(param=*0x%x)", param);
// TODO
g_bgm_playback_enabled = true;
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<bgm_manager>();
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<bgm_manager>();
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::ptr<CellSysutilBgmPlaybackExtraPa
{
cellSysutil.warning("cellSysutilDisableBgmPlaybackEx(param=*0x%x)", param);
// TODO
g_bgm_playback_enabled = false;
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<bgm_manager>();
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<CellSysutilBgmPlaybackStatus>
{
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<bgm_manager>();
std::lock_guard lock(bgm.mtx);
*status = bgm.status;
return CELL_OK;
}
@ -558,16 +625,41 @@ error_code cellSysutilGetBgmPlaybackStatus2(vm::ptr<CellSysutilBgmPlaybackStatus
{
cellSysutil.trace("cellSysutilGetBgmPlaybackStatus2(status2=*0x%x)", status2);
// TODO
status2->playerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP;
if (!status2)
{
return CELL_SYSUTIL_BGMPLAYBACK_EX_ERROR_PARAM;
}
auto& bgm = g_fxo->get<bgm_manager>();
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<CellSysutilBgmPlaybackExtraParam> 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<bgm_manager>();
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;
}