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;
}

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
};
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];
};