cellCamera: Log error code

This commit is contained in:
Eladash 2019-10-11 20:21:12 +03:00 committed by Megamouse
parent 4d99169d51
commit 5cc12ef22e
2 changed files with 98 additions and 77 deletions

View file

@ -9,12 +9,38 @@
LOG_CHANNEL(cellCamera);
template <>
void fmt_class_string<CellCameraError>::format(std::string& out, u64 arg)
{
format_enum(out, arg, [](CellCameraError value)
{
switch (value)
{
STR_CASE(CELL_CAMERA_ERROR_ALREADY_INIT);
STR_CASE(CELL_CAMERA_ERROR_NOT_INIT);
STR_CASE(CELL_CAMERA_ERROR_PARAM);
STR_CASE(CELL_CAMERA_ERROR_ALREADY_OPEN);
STR_CASE(CELL_CAMERA_ERROR_NOT_OPEN);
STR_CASE(CELL_CAMERA_ERROR_DEVICE_NOT_FOUND);
STR_CASE(CELL_CAMERA_ERROR_DEVICE_DEACTIVATED);
STR_CASE(CELL_CAMERA_ERROR_NOT_STARTED);
STR_CASE(CELL_CAMERA_ERROR_FORMAT_UNKNOWN);
STR_CASE(CELL_CAMERA_ERROR_RESOLUTION_UNKNOWN);
STR_CASE(CELL_CAMERA_ERROR_BAD_FRAMERATE);
STR_CASE(CELL_CAMERA_ERROR_TIMEOUT);
STR_CASE(CELL_CAMERA_ERROR_FATAL);
}
return unknown;
});
}
// **************
// * Prototypes *
// **************
s32 cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2);
s32 cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read);
error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2);
error_code cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read);
// ************************
// * HLE helper functions *
@ -115,7 +141,7 @@ static bool check_dev_num(s32 dev_num)
return dev_num == 0;
}
static s32 check_camera_info(const CellCameraInfoEx& info)
static error_code check_camera_info(const CellCameraInfoEx& info)
{
// TODO: I managed to get 0x80990004 once. :thonkang:
@ -272,7 +298,7 @@ u32 get_video_buffer_size(const CellCameraInfoEx& info)
// * cellCamera functions *
// ************************
s32 cellCameraInit()
error_code cellCameraInit()
{
cellCamera.todo("cellCameraInit()");
@ -347,7 +373,7 @@ s32 cellCameraInit()
return CELL_OK;
}
s32 cellCameraEnd()
error_code cellCameraEnd()
{
cellCamera.todo("cellCameraEnd()");
@ -361,8 +387,7 @@ s32 cellCameraEnd()
}
// TODO: My tests hinted to this behavior, but I'm not sure, so I'll leave this commented
//s32 res = cellCameraClose(0);
//if (res != CELL_OK)
//if (auto res = cellCameraClose(0))
//{
// return res;
//}
@ -372,19 +397,19 @@ s32 cellCameraEnd()
return CELL_OK;
}
s32 cellCameraOpen() // seems unused
error_code cellCameraOpen() // seems unused
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraOpenAsync()
error_code cellCameraOpenAsync()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
error_code cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
{
cellCamera.todo("cellCameraOpenEx(dev_num=%d, type=*0x%x)", dev_num, info);
@ -397,19 +422,20 @@ s32 cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
return not_an_error(CELL_CAMERA_ERROR_DEVICE_NOT_FOUND);
}
s32 status;
if ((status = cellCameraSetAttribute(dev_num, CELL_CAMERA_READMODE, info->read_mode, 0)) != CELL_OK)
if (auto res = cellCameraSetAttribute(dev_num, CELL_CAMERA_READMODE, info->read_mode, 0))
{
return status;
return res;
}
if (info->read_mode == CELL_CAMERA_READ_DIRECT)
{
if ((status = cellCameraSetAttribute(dev_num, CELL_CAMERA_GAMEPID, status, 0)) != CELL_OK)
// Note: arg1 is the return value of previous SetAttribute
if (auto res = cellCameraSetAttribute(dev_num, CELL_CAMERA_GAMEPID, 0, 0))
{
return status;
return res;
}
}
@ -426,10 +452,9 @@ s32 cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return CELL_CAMERA_ERROR_ALREADY_OPEN;
}
status = check_camera_info(*info);
if (status < 0)
if (auto res = check_camera_info(*info))
{
return status;
return res;
}
// calls cellCameraGetAttribute(dev_num, CELL_CAMERA_PBUFFER) at some point
@ -452,13 +477,13 @@ s32 cellCameraOpenEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return CELL_OK;
}
s32 cellCameraOpenPost()
error_code cellCameraOpenPost()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraClose(s32 dev_num)
error_code cellCameraClose(s32 dev_num)
{
cellCamera.todo("cellCameraClose(dev_num=%d)", dev_num);
@ -476,7 +501,7 @@ s32 cellCameraClose(s32 dev_num)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
std::lock_guard lock(g_camera->mutex);
@ -492,19 +517,19 @@ s32 cellCameraClose(s32 dev_num)
return CELL_OK;
}
s32 cellCameraCloseAsync()
error_code cellCameraCloseAsync()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraClosePost()
error_code cellCameraClosePost()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraGetDeviceGUID(s32 dev_num, vm::ptr<u32> guid)
error_code cellCameraGetDeviceGUID(s32 dev_num, vm::ptr<u32> guid)
{
cellCamera.todo("cellCameraGetDeviceGUID(dev_num=%d, guid=*0x%x)", dev_num, guid);
@ -522,7 +547,7 @@ s32 cellCameraGetDeviceGUID(s32 dev_num, vm::ptr<u32> guid)
return CELL_OK;
}
s32 cellCameraGetType(s32 dev_num, vm::ptr<s32> type)
error_code cellCameraGetType(s32 dev_num, vm::ptr<s32> type)
{
cellCamera.todo("cellCameraGetType(dev_num=%d, type=*0x%x)", dev_num, type);
@ -535,7 +560,7 @@ s32 cellCameraGetType(s32 dev_num, vm::ptr<s32> type)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
return not_an_error(CELL_CAMERA_ERROR_DEVICE_NOT_FOUND);
}
if (!check_dev_num(dev_num) || !type )
@ -648,7 +673,7 @@ s32 cellCameraIsOpen(s32 dev_num)
return g_camera->is_open;
}
s32 cellCameraIsStarted(s32 dev_num)
error_code cellCameraIsStarted(s32 dev_num)
{
cellCamera.todo("cellCameraIsStarted(dev_num=%d)", dev_num);
@ -674,7 +699,7 @@ s32 cellCameraIsStarted(s32 dev_num)
return g_camera->is_streaming;
}
s32 cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr<u32> arg1, vm::ptr<u32> arg2)
error_code cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr<u32> arg1, vm::ptr<u32> arg2)
{
const auto attr_name = get_camera_attr_name(attrib);
cellCamera.todo("cellCameraGetAttribute(dev_num=%d, attrib=%d=%s, arg1=*0x%x, arg2=*0x%x)", dev_num, attrib, attr_name, arg1, arg2);
@ -688,7 +713,7 @@ s32 cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr<u32> arg1, vm::ptr<u
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
return not_an_error(CELL_CAMERA_ERROR_DEVICE_NOT_FOUND);
}
if (!check_dev_num(dev_num) || !attr_name || !arg1) // invalid attributes don't have a name and at least arg1 should not be NULL
@ -721,7 +746,7 @@ s32 cellCameraGetAttribute(s32 dev_num, s32 attrib, vm::ptr<u32> arg1, vm::ptr<u
return CELL_OK;
}
s32 cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2)
error_code cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2)
{
const auto attr_name = get_camera_attr_name(attrib);
cellCamera.todo("cellCameraSetAttribute(dev_num=%d, attrib=%d=%s, arg1=%d, arg2=%d)", dev_num, attrib, attr_name, arg1, arg2);
@ -735,7 +760,7 @@ s32 cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
if (!check_dev_num(dev_num) || !attr_name) // invalid attributes don't have a name
@ -754,13 +779,13 @@ s32 cellCameraSetAttribute(s32 dev_num, s32 attrib, u32 arg1, u32 arg2)
return CELL_OK;
}
s32 cellCameraResetAttribute()
error_code cellCameraResetAttribute()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
error_code cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
{
cellCamera.todo("cellCameraGetBufferSize(dev_num=%d, info=*0x%x)", dev_num, info);
@ -773,7 +798,7 @@ s32 cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
return not_an_error(CELL_CAMERA_ERROR_DEVICE_NOT_FOUND);
}
// the next few checks have a strange order, if I can trust the tests
@ -793,8 +818,7 @@ s32 cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return CELL_CAMERA_ERROR_PARAM;
}
s32 res = check_camera_info(*info);
if (res < 0)
if (auto res = check_camera_info(*info))
{
return res;
}
@ -804,8 +828,7 @@ s32 cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return CELL_CAMERA_ERROR_DEVICE_NOT_FOUND;
}
s32 status;
if ((status = cellCameraSetAttribute(dev_num, CELL_CAMERA_READMODE, info->read_mode, 0)) != CELL_OK)
if (auto status = cellCameraSetAttribute(dev_num, CELL_CAMERA_READMODE, info->read_mode, 0))
{
return status;
}
@ -818,7 +841,7 @@ s32 cellCameraGetBufferSize(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return info->bytesize;
}
s32 cellCameraGetBufferInfo()
error_code cellCameraGetBufferInfo()
{
UNIMPLEMENTED_FUNC(cellCamera);
@ -827,7 +850,7 @@ s32 cellCameraGetBufferInfo()
return CELL_OK;
}
s32 cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
error_code cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
{
cellCamera.todo("cellCameraGetBufferInfoEx(dev_num=%d, read=0x%x)", dev_num, info);
@ -842,7 +865,7 @@ s32 cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
if (!check_dev_num(dev_num))
@ -866,39 +889,39 @@ s32 cellCameraGetBufferInfoEx(s32 dev_num, vm::ptr<CellCameraInfoEx> info)
return CELL_OK;
}
s32 cellCameraPrepExtensionUnit(s32 dev_num, vm::ptr<u8> guidExtensionCode)
error_code cellCameraPrepExtensionUnit(s32 dev_num, vm::ptr<u8> guidExtensionCode)
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraCtrlExtensionUnit(s32 dev_num, u8 request, u16 value, u16 length, vm::ptr<u8> data)
error_code cellCameraCtrlExtensionUnit(s32 dev_num, u8 request, u16 value, u16 length, vm::ptr<u8> data)
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraGetExtensionUnit(s32 dev_num, u16 value, u16 length, vm::ptr<u8> data)
error_code cellCameraGetExtensionUnit(s32 dev_num, u16 value, u16 length, vm::ptr<u8> data)
{
cellCamera.todo("cellCameraGetExtensionUnit(dev_num=%d, value=%d, length=%d, data=*0x%x)", dev_num, value, length, data);
return cellCameraCtrlExtensionUnit(dev_num, GET_CUR, value, length, data);
}
s32 cellCameraSetExtensionUnit(s32 dev_num, u16 value, u16 length, vm::ptr<u8> data)
error_code cellCameraSetExtensionUnit(s32 dev_num, u16 value, u16 length, vm::ptr<u8> data)
{
cellCamera.todo("cellCameraSetExtensionUnit(dev_num=%d, value=%d, length=%d, data=*0x%x)", dev_num, value, length, data);
return cellCameraCtrlExtensionUnit(dev_num, SET_CUR, value, length, data);
}
s32 cellCameraSetContainer()
error_code cellCameraSetContainer()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraReset(s32 dev_num)
error_code cellCameraReset(s32 dev_num)
{
cellCamera.todo("cellCameraReset(dev_num=%d)", dev_num);
@ -916,7 +939,7 @@ s32 cellCameraReset(s32 dev_num)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
if (!g_camera->is_open)
@ -934,19 +957,19 @@ s32 cellCameraReset(s32 dev_num)
return CELL_OK;
}
s32 cellCameraResetAsync()
error_code cellCameraResetAsync()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraResetPost()
error_code cellCameraResetPost()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraStart(s32 dev_num)
error_code cellCameraStart(s32 dev_num)
{
cellCamera.todo("cellCameraStart(dev_num=%d)", dev_num);
@ -964,7 +987,7 @@ s32 cellCameraStart(s32 dev_num)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
std::lock_guard lock(g_camera->mutex);
@ -985,27 +1008,25 @@ s32 cellCameraStart(s32 dev_num)
return CELL_OK;
}
s32 cellCameraStartAsync()
error_code cellCameraStartAsync()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraStartPost()
error_code cellCameraStartPost()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraRead(s32 dev_num, vm::ptr<u32> frame_num, vm::ptr<u32> bytes_read)
error_code cellCameraRead(s32 dev_num, vm::ptr<u32> frame_num, vm::ptr<u32> bytes_read)
{
cellCamera.todo("cellCameraRead(dev_num=%d, frame_num=*0x%x, bytes_read=*0x%x)", dev_num, frame_num, bytes_read);
vm::ptr<CellCameraReadEx> read_ex = vm::make_var<CellCameraReadEx>({});
s32 res = cellCameraReadEx(dev_num, read_ex);
if (res != CELL_OK)
if (auto res = cellCameraReadEx(dev_num, read_ex))
{
return res;
}
@ -1023,13 +1044,13 @@ s32 cellCameraRead(s32 dev_num, vm::ptr<u32> frame_num, vm::ptr<u32> bytes_read)
return CELL_OK;
}
s32 cellCameraRead2()
error_code cellCameraRead2()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
error_code cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
{
cellCamera.todo("cellCameraReadEx(dev_num=%d, read=0x%x)", dev_num, read);
@ -1042,7 +1063,7 @@ s32 cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
if (!check_dev_num(dev_num))
@ -1083,14 +1104,14 @@ s32 cellCameraReadEx(s32 dev_num, vm::ptr<CellCameraReadEx> read)
return CELL_OK;
}
s32 cellCameraReadComplete(s32 dev_num, u32 bufnum, u32 arg2)
error_code cellCameraReadComplete(s32 dev_num, u32 bufnum, u32 arg2)
{
cellCamera.todo("cellCameraReadComplete(dev_num=%d, bufnum=%d, arg2=%d)", dev_num, bufnum, arg2);
return cellCameraSetAttribute(dev_num, CELL_CAMERA_READFINISH, bufnum, arg2);
}
s32 cellCameraStop(s32 dev_num)
error_code cellCameraStop(s32 dev_num)
{
cellCamera.todo("cellCameraStop(dev_num=%d)", dev_num);
@ -1108,7 +1129,7 @@ s32 cellCameraStop(s32 dev_num)
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_CAMERA_ERROR_NOT_OPEN;
return not_an_error(CELL_CAMERA_ERROR_NOT_OPEN);
}
if (!g_camera->is_open)
@ -1134,19 +1155,19 @@ s32 cellCameraStop(s32 dev_num)
return CELL_OK;
}
s32 cellCameraStopAsync()
error_code cellCameraStopAsync()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraStopPost()
error_code cellCameraStopPost()
{
UNIMPLEMENTED_FUNC(cellCamera);
return CELL_OK;
}
s32 cellCameraSetNotifyEventQueue(u64 key)
error_code cellCameraSetNotifyEventQueue(u64 key)
{
cellCamera.todo("cellCameraSetNotifyEventQueue(key=0x%x)", key);
@ -1167,15 +1188,10 @@ s32 cellCameraSetNotifyEventQueue(u64 key)
return CELL_OK;
}
s32 cellCameraRemoveNotifyEventQueue(u64 key)
error_code cellCameraRemoveNotifyEventQueue(u64 key)
{
cellCamera.todo("cellCameraRemoveNotifyEventQueue(key=0x%x)", key);
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_OK;
}
const auto g_camera = g_fxo->get<camera_thread>();
if (!g_camera->init)
@ -1183,12 +1199,17 @@ s32 cellCameraRemoveNotifyEventQueue(u64 key)
return CELL_CAMERA_ERROR_NOT_INIT;
}
if (g_cfg.io.camera == camera_handler::null)
{
return CELL_OK;
}
g_camera->remove_queue(key);
return CELL_OK;
}
s32 cellCameraSetNotifyEventQueue2(u64 key, u64 source, u64 flag)
error_code cellCameraSetNotifyEventQueue2(u64 key, u64 source, u64 flag)
{
cellCamera.todo("cellCameraSetNotifyEventQueue2(key=0x%x, source=%d, flag=%d)", key, source, flag);
@ -1209,7 +1230,7 @@ s32 cellCameraSetNotifyEventQueue2(u64 key, u64 source, u64 flag)
return CELL_OK;
}
s32 cellCameraRemoveNotifyEventQueue2(u64 key)
error_code cellCameraRemoveNotifyEventQueue2(u64 key)
{
cellCamera.todo("cellCameraRemoveNotifyEventQueue2(key=0x%x)", key);

View file

@ -8,7 +8,7 @@
// Error Codes
enum
enum CellCameraError : u32
{
CELL_CAMERA_ERROR_ALREADY_INIT = 0x80140801,
CELL_CAMERA_ERROR_NOT_INIT = 0x80140803,