mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-19 12:40:29 +00:00
cellSysutil: implement some bgm fxo stuff
This commit is contained in:
parent
cbf12bb54b
commit
bfe029bb0c
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user