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 sysutil_cb_manager
{ {
struct alignas(8) registered_cb struct alignas(8) registered_cb
@ -498,14 +518,26 @@ error_code cellSysutilUnregisterCallback(u32 slot)
return CELL_OK; 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() error_code cellSysutilEnableBgmPlayback()
{ {
cellSysutil.warning("cellSysutilEnableBgmPlayback()"); cellSysutil.warning("cellSysutilEnableBgmPlayback()");
// TODO auto& bgm = g_fxo->get<bgm_manager>();
g_bgm_playback_enabled = true; std::lock_guard lock(bgm.mtx);
bgm.status.enableState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_ENABLE;
return CELL_OK; return CELL_OK;
} }
@ -514,8 +546,22 @@ error_code cellSysutilEnableBgmPlaybackEx(vm::ptr<CellSysutilBgmPlaybackExtraPar
{ {
cellSysutil.warning("cellSysutilEnableBgmPlaybackEx(param=*0x%x)", param); cellSysutil.warning("cellSysutilEnableBgmPlaybackEx(param=*0x%x)", param);
// TODO if (!param ||
g_bgm_playback_enabled = true; 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; return CELL_OK;
} }
@ -524,8 +570,11 @@ error_code cellSysutilDisableBgmPlayback()
{ {
cellSysutil.warning("cellSysutilDisableBgmPlayback()"); cellSysutil.warning("cellSysutilDisableBgmPlayback()");
// TODO auto& bgm = g_fxo->get<bgm_manager>();
g_bgm_playback_enabled = false; 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; return CELL_OK;
} }
@ -534,8 +583,24 @@ error_code cellSysutilDisableBgmPlaybackEx(vm::ptr<CellSysutilBgmPlaybackExtraPa
{ {
cellSysutil.warning("cellSysutilDisableBgmPlaybackEx(param=*0x%x)", param); cellSysutil.warning("cellSysutilDisableBgmPlaybackEx(param=*0x%x)", param);
// TODO if (!param ||
g_bgm_playback_enabled = false; 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; return CELL_OK;
} }
@ -544,12 +609,14 @@ error_code cellSysutilGetBgmPlaybackStatus(vm::ptr<CellSysutilBgmPlaybackStatus>
{ {
cellSysutil.trace("cellSysutilGetBgmPlaybackStatus(status=*0x%x)", status); cellSysutil.trace("cellSysutilGetBgmPlaybackStatus(status=*0x%x)", status);
// TODO if (!status)
status->playerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP; {
status->enableState = g_bgm_playback_enabled ? CELL_SYSUTIL_BGMPLAYBACK_STATUS_ENABLE : CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE; return CELL_SYSUTIL_BGMPLAYBACK_ERROR_PARAM;
status->currentFadeRatio = 0; // current volume ratio (0%) }
memset(status->contentId, 0, sizeof(status->contentId));
memset(status->reserved, 0, sizeof(status->reserved)); auto& bgm = g_fxo->get<bgm_manager>();
std::lock_guard lock(bgm.mtx);
*status = bgm.status;
return CELL_OK; return CELL_OK;
} }
@ -558,16 +625,41 @@ error_code cellSysutilGetBgmPlaybackStatus2(vm::ptr<CellSysutilBgmPlaybackStatus
{ {
cellSysutil.trace("cellSysutilGetBgmPlaybackStatus2(status2=*0x%x)", status2); cellSysutil.trace("cellSysutilGetBgmPlaybackStatus2(status2=*0x%x)", status2);
// TODO if (!status2)
status2->playerState = CELL_SYSUTIL_BGMPLAYBACK_STATUS_STOP; {
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)); memset(status2->reserved, 0, sizeof(status2->reserved));
return CELL_OK; 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; return CELL_OK;
} }

View File

@ -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 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 enum CellSysutilBgmPlaybackStatusState
{ {
CELL_SYSUTIL_BGMPLAYBACK_STATUS_PLAY = 0, CELL_SYSUTIL_BGMPLAYBACK_STATUS_PLAY = 0,
@ -269,12 +281,17 @@ enum CellSysutilBgmPlaybackStatusEnabled
CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE = 1 CELL_SYSUTIL_BGMPLAYBACK_STATUS_DISABLE = 1
}; };
enum
{
CELL_SYSUTIL_BGMPLAYBACK_FADE_INVALID = -1
};
struct CellSysutilBgmPlaybackStatus struct CellSysutilBgmPlaybackStatus
{ {
u8 playerState; u8 playerState;
u8 enableState; u8 enableState;
char contentId[16]; char contentId[16]; // CellSearchContentId
u8 currentFadeRatio; u8 currentFadeRatio; // current volume ratio (0=0%, 255=100%)
char reserved[13]; char reserved[13];
}; };