mirror of https://github.com/RPCS3/rpcs3.git
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 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue