From 3c2cf79675795208e11a3a8daddf4a8bf751b7f4 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 6 Apr 2022 00:17:22 +0200 Subject: [PATCH] cellSysutilAvc2: more stubs and errors --- rpcs3/Emu/Cell/Modules/cellSysutilAvc2.cpp | 251 ++++++++++++++++++++- rpcs3/Emu/Cell/Modules/cellSysutilAvc2.h | 2 +- 2 files changed, 243 insertions(+), 10 deletions(-) diff --git a/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.cpp b/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.cpp index 485f3b1400..1d5e116ddf 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.cpp +++ b/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.cpp @@ -42,6 +42,8 @@ error_code cellSysutilAvc2GetPlayerInfo(vm::cptr pla { cellSysutilAvc2.todo("cellSysutilAvc2GetPlayerInfo(player_id=*0x%x, player_info=*0x%x)", player_id, player_info); + // TODO: check arguments ? + player_info->connected = 1; player_info->joined = 1; player_info->mic_attached = 0; @@ -50,9 +52,12 @@ error_code cellSysutilAvc2GetPlayerInfo(vm::cptr pla return CELL_OK; } -error_code cellSysutilAvc2JoinChat(vm::cptr room_id) +error_code cellSysutilAvc2JoinChat(vm::cptr room_id, vm::ptr eventId, vm::ptr eventParam) { - cellSysutilAvc2.todo("cellSysutilAvc2JoinChat(room_id=*0x%x)", room_id); + cellSysutilAvc2.todo("cellSysutilAvc2JoinChat(room_id=*0x%x, eventId=*0x%x, eventParam=*0x%x)", room_id, eventId, eventParam); + + // TODO: check arguments ? + return CELL_OK; } @@ -78,6 +83,9 @@ error_code cellSysutilAvc2GetVideoMuting(vm::ptr muting) { cellSysutilAvc2.todo("cellSysutilAvc2GetVideoMuting(muting=*0x%x)", muting); + if (!muting) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + *muting = 1; return CELL_OK; @@ -86,12 +94,40 @@ error_code cellSysutilAvc2GetVideoMuting(vm::ptr muting) error_code cellSysutilAvc2GetWindowAttribute(SceNpMatching2RoomMemberId member_id, vm::ptr attr) { cellSysutilAvc2.todo("cellSysutilAvc2GetWindowAttribute(member_id=0x%x, attr=*0x%x)", member_id, attr); + + if (!attr) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (attr->attr_id) + { + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ALPHA: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_TRANSITION_TYPE: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_TRANSITION_DURATION: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_STRING_VISIBLE: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ROTATION: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ZORDER: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_SURFACE: + break; + default: + break; + } + return CELL_OK; } error_code cellSysutilAvc2StopStreaming2(u32 mediaType) { cellSysutilAvc2.todo("cellSysutilAvc2StopStreaming2(mediaType=0x%x)", mediaType); + + if (mediaType != CELL_SYSUTIL_AVC2_VOICE_CHAT) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -132,6 +168,38 @@ error_code cellSysutilAvc2StopVoiceDetection() error_code cellSysutilAvc2GetAttribute(vm::ptr attr) { cellSysutilAvc2.todo("cellSysutilAvc2GetAttribute(attr=*0x%x)", attr); + + if (!attr) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (attr->attr_id) + { + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_EVENT_TYPE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_INTERVAL_TIME: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_SIGNAL_LEVEL: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_MAX_BITRATE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DATA_FEC: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_PACKET_CONTENTION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DTX_MODE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_MIC_STATUS_DETECTION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_MIC_SETTING_NOTIFICATION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_MUTING_NOTIFICATION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_CAMERA_STATUS_DETECTION: + break; + default: + break; + } + return CELL_OK; } @@ -139,6 +207,21 @@ error_code cellSysutilAvc2LoadAsync(SceNpMatching2ContextId ctx_id, u32 containe { cellSysutilAvc2.warning("cellSysutilAvc2LoadAsync(ctx_id=0x%x, container=0x%x, callback_func=*0x%x, user_data=*0x%x, init_param=*0x%x)", ctx_id, container, callback_func, user_data, init_param); + if (!init_param) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (init_param->avc_init_param_version) + { + case 100: + case 110: + case 120: + case 130: + case 140: + break; + default: + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + } + avc2_cb = callback_func; avc2_cb_arg = user_data; @@ -163,6 +246,10 @@ error_code cellSysutilAvc2SetSpeakerVolumeLevel(f32 level) error_code cellSysutilAvc2SetWindowString(SceNpMatching2RoomMemberId member_id, vm::cptr string) { cellSysutilAvc2.todo("cellSysutilAvc2SetWindowString(member_id=0x%x, string=%s)", member_id, string); + + if (!string) // TODO something > 0x3F (63) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -175,6 +262,10 @@ error_code cellSysutilAvc2EstimateMemoryContainerSize(vm::cptr 1) // Weird check, lol + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -184,15 +275,22 @@ error_code cellSysutilAvc2SetPlayerVoiceMuting(SceNpMatching2RoomMemberId member return CELL_OK; } -error_code cellSysutilAvc2SetStreamingTarget() +error_code cellSysutilAvc2SetStreamingTarget(vm::cptr target) { - UNIMPLEMENTED_FUNC(cellSysutilAvc2); + cellSysutilAvc2.todo("cellSysutilAvc2SetStreamingTarget(target=*0x%x)", target); + + // target should never be null + ensure(!!target); + return CELL_OK; } error_code cellSysutilAvc2Unload() { cellSysutilAvc2.todo("cellSysutilAvc2Unload()"); + + // TODO: CELL_AVC2_ERROR_NOT_INITIALIZED + return CELL_OK; } @@ -211,6 +309,12 @@ error_code cellSysutilAvc2SetWindowPosition(SceNpMatching2RoomMemberId member_id error_code cellSysutilAvc2GetSpeakerVolumeLevel(vm::ptr level) { cellSysutilAvc2.todo("cellSysutilAvc2GetSpeakerVolumeLevel(level=*0x%x)", level); + + if (!level) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + *level = 100; + return CELL_OK; } @@ -218,6 +322,9 @@ error_code cellSysutilAvc2IsCameraAttached(vm::ptr status) { cellSysutilAvc2.todo("cellSysutilAvc2IsCameraAttached(status=*0x%x)", status); + if (!status) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + *status = CELL_AVC2_CAMERA_STATUS_DETACHED; return CELL_OK; @@ -226,12 +333,21 @@ error_code cellSysutilAvc2IsCameraAttached(vm::ptr status) error_code cellSysutilAvc2MicRead(vm::ptr ptr, vm::ptr pSize) { cellSysutilAvc2.todo("cellSysutilAvc2MicRead(ptr=*0x%x, pSize=*0x%x)", ptr, pSize); + + // TODO: check arguments ? + return CELL_OK; } error_code cellSysutilAvc2GetPlayerVoiceMuting(SceNpMatching2RoomMemberId member_id, vm::ptr muting) { cellSysutilAvc2.todo("cellSysutilAvc2GetPlayerVoiceMuting(member_id=0x%x, muting=*0x%x)", member_id, muting); + + if (!muting) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + *muting = 0; + return CELL_OK; } @@ -239,6 +355,8 @@ error_code cellSysutilAvc2JoinChatRequest(vm::cptr room_id { cellSysutilAvc2.warning("cellSysutilAvc2JoinChatRequest(room_id=*0x%x)", room_id); + // NOTE: room_id should be null if the current mode is Direct WAN/LAN + if (avc2_cb) { sysutil_register_cb([=](ppu_thread& cb_ppu) -> s32 @@ -260,26 +378,65 @@ error_code cellSysutilAvc2StartStreaming() error_code cellSysutilAvc2SetWindowAttribute(SceNpMatching2RoomMemberId member_id, vm::cptr attr) { cellSysutilAvc2.todo("cellSysutilAvc2SetWindowAttribute(member_id=0x%x, attr=*0x%x)", member_id, attr); + + if (!attr) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (attr->attr_id) + { + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ALPHA: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_TRANSITION_TYPE: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_TRANSITION_DURATION: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_STRING_VISIBLE: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ROTATION: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_ZORDER: + break; + case CELL_SYSUTIL_AVC2_WINDOW_ATTRIBUTE_SURFACE: + break; + default: + break; + } + return CELL_OK; } error_code cellSysutilAvc2GetWindowShowStatus(SceNpMatching2RoomMemberId member_id, vm::ptr visible) { cellSysutilAvc2.todo("cellSysutilAvc2GetWindowShowStatus(member_id=0x%x, visible=*0x%x)", member_id, visible); + + if (!visible) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + *visible = 0; + return CELL_OK; } error_code cellSysutilAvc2InitParam(u16 version, vm::ptr option) { - cellSysutilAvc2.warning("cellSysutilAvc2InitParam(version=%d, option=*0x%x)", version, option); + cellSysutilAvc2.todo("cellSysutilAvc2InitParam(version=%d, option=*0x%x)", version, option); - if (version >= 110) + if (!option) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (version) + { + case 100: + case 110: + case 120: + case 130: + case 140: { // Notify the user that, a version different from the one, that we know the constants for, is used. // Other versions shouldn't differ by too much, if at all - they most likely differ in other functions. if (version != 140) { - cellSysutilAvc2.todo("cellSysutilAvc2InitParam(): Older/newer version %d used, might cause problems.", version); + cellSysutilAvc2.warning("cellSysutilAvc2InitParam(): Older/newer version %d used, might cause problems.", version); } option->avc_init_param_version = version; @@ -307,10 +464,12 @@ error_code cellSysutilAvc2InitParam(u16 version, vm::ptrmedia_type); } + break; } - else + default: { - cellSysutilAvc2.error("cellSysutilAvc2InitParam(): Unknown version %d used, please report this to a developer.", version); + return { CELL_AVC2_ERROR_INVALID_ARGUMENT, version }; + } } return CELL_OK; @@ -319,6 +478,10 @@ error_code cellSysutilAvc2InitParam(u16 version, vm::ptr width, vm::ptr height) { cellSysutilAvc2.todo("cellSysutilAvc2GetWindowSize(member_id=0x%x, width=*0x%x, height=*0x%x)", member_id, width, height); + + if (!width || !height) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -348,6 +511,8 @@ error_code cellSysutilAvc2IsMicAttached(vm::ptr status) { cellSysutilAvc2.todo("cellSysutilAvc2IsMicAttached(status=*0x%x)", status); + ensure(!!status); // I couldn't find any error value for this (should be CELL_AVC2_ERROR_INVALID_ARGUMENT if anything) + *status = CELL_AVC2_MIC_STATUS_DETACHED; return CELL_OK; @@ -362,7 +527,12 @@ error_code cellSysutilAvc2CreateWindow(SceNpMatching2RoomMemberId member_id) error_code cellSysutilAvc2GetSpeakerMuting(vm::ptr muting) { cellSysutilAvc2.todo("cellSysutilAvc2GetSpeakerMuting(muting=*0x%x)", muting); + + if (!muting) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + *muting = 1; + return CELL_OK; } @@ -382,6 +552,8 @@ error_code cellSysutilAvc2EnumPlayers(vm::ptr players_num, vm::ptr players_num, vm::ptr string, vm::ptr len) { cellSysutilAvc2.todo("cellSysutilAvc2GetWindowString(member_id=0x%x, string=*0x%x, len=*0x%x)", member_id, string, len); + + if (!string || !len) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -418,18 +594,58 @@ error_code cellSysutilAvc2Load(SceNpMatching2ContextId ctx_id, u32 container, vm error_code cellSysutilAvc2SetAttribute(vm::cptr attr) { cellSysutilAvc2.todo("cellSysutilAvc2SetAttribute(attr=*0x%x)", attr); + + if (!attr) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + switch (attr->attr_id) + { + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_EVENT_TYPE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_INTERVAL_TIME: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DETECT_SIGNAL_LEVEL: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_MAX_BITRATE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DATA_FEC: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_PACKET_CONTENTION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_DTX_MODE: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_MIC_STATUS_DETECTION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_MIC_SETTING_NOTIFICATION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_VOICE_MUTING_NOTIFICATION: + break; + case CELL_SYSUTIL_AVC2_ATTRIBUTE_CAMERA_STATUS_DETECTION: + break; + default: + break; + } + return CELL_OK; } error_code cellSysutilAvc2UnloadAsync2(u32 mediaType) { cellSysutilAvc2.todo("cellSysutilAvc2UnloadAsync2(mediaType=0x%x)", mediaType); + + if (mediaType != CELL_SYSUTIL_AVC2_VOICE_CHAT) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } error_code cellSysutilAvc2StartStreaming2(u32 mediaType) { cellSysutilAvc2.todo("cellSysutilAvc2StartStreaming2(mediaType=0x%x)", mediaType); + + if (mediaType != CELL_SYSUTIL_AVC2_VOICE_CHAT) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } @@ -449,6 +665,9 @@ error_code cellSysutilAvc2GetVoiceMuting(vm::ptr muting) { cellSysutilAvc2.todo("cellSysutilAvc2GetVoiceMuting(muting=*0x%x)", muting); + if (!muting) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + *muting = 1; return CELL_OK; @@ -457,18 +676,32 @@ error_code cellSysutilAvc2GetVoiceMuting(vm::ptr muting) error_code cellSysutilAvc2GetScreenShowStatus(vm::ptr visible) { cellSysutilAvc2.todo("cellSysutilAvc2GetScreenShowStatus(visible=*0x%x)", visible); + + if (!visible) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + + *visible = 0; + return CELL_OK; } error_code cellSysutilAvc2Unload2(u32 mediaType) { cellSysutilAvc2.todo("cellSysutilAvc2Unload2(mediaType=0x%x)", mediaType); + + if (mediaType != CELL_SYSUTIL_AVC2_VOICE_CHAT) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } error_code cellSysutilAvc2GetWindowPosition(SceNpMatching2RoomMemberId member_id, vm::ptr x, vm::ptr y, vm::ptr z) { cellSysutilAvc2.todo("cellSysutilAvc2GetWindowPosition(member_id=0x%x, x=*0x%x, y=*0x%x, z=*0x%x)", member_id, x, y, z); + + if (!x || !y || !z) + return CELL_AVC2_ERROR_INVALID_ARGUMENT; + return CELL_OK; } diff --git a/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.h b/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.h index bb01355f42..b5fea38123 100644 --- a/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.h +++ b/rpcs3/Emu/Cell/Modules/cellSysutilAvc2.h @@ -181,7 +181,7 @@ enum enum { - CELL_SYSUTIL_AVC2_INIT_PARAM_VERSION = 140 // Older versions may be 110, 120, 130 + CELL_SYSUTIL_AVC2_INIT_PARAM_VERSION = 140 // Older versions may be 100, 110, 120, 130 }; enum