diff options
Diffstat (limited to 'src/core/hle/service/cam/cam.cpp')
-rw-r--r-- | src/core/hle/service/cam/cam.cpp | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/src/core/hle/service/cam/cam.cpp b/src/core/hle/service/cam/cam.cpp index 342a0edeb..85af70a3f 100644 --- a/src/core/hle/service/cam/cam.cpp +++ b/src/core/hle/service/cam/cam.cpp @@ -398,6 +398,7 @@ void SetReceiving(Service::Interface* self) { rb.Push(RESULT_SUCCESS); rb.PushCopyHandles(Kernel::g_handle_table.Create(port.completion_event).MoveFrom()); } else { + LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); rb.Push(ERROR_INVALID_ENUM_VALUE); rb.PushCopyHandles(0); } @@ -413,8 +414,9 @@ void IsFinishedReceiving(Service::Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); if (port_select.IsSingle()) { int port = *port_select.begin(); + bool is_busy = ports[port].is_receiving || ports[port].is_pending_receiving; rb.Push(RESULT_SUCCESS); - rb.Push(ports[port].is_receiving || ports[port].is_pending_receiving); + rb.Push(!is_busy); } else { LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); rb.Push(ERROR_INVALID_ENUM_VALUE); @@ -508,7 +510,7 @@ void GetTransferBytes(Service::Interface* self) { IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); if (port_select.IsSingle()) { int port = *port_select.begin(); - rb.Push(RESULT_SUCCESS.raw); + rb.Push(RESULT_SUCCESS); rb.Push(ports[port].transfer_bytes); } else { LOG_ERROR(Service_CAM, "invalid port_select=%u", port_select.m_val); @@ -930,7 +932,6 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { PackageParameterWithoutContext package; rp.PopRaw(package); - rp.Skip(4, false); IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); rb.Push(RESULT_SUCCESS); @@ -938,18 +939,11 @@ void SetPackageParameterWithoutContext(Service::Interface* self) { LOG_WARNING(Service_CAM, "(STUBBED) called"); } -template <typename PackageParameterType, int command_id, int param_length> -static void SetPackageParameter() { - IPC::RequestParser rp(Kernel::GetCommandBuffer(), command_id, param_length, 0); - - PackageParameterType package; - rp.PopRaw(package); - rp.Skip(param_length - (sizeof(PackageParameterType) + 3) / 4, false); - +template <typename PackageParameterType> +static ResultCode SetPackageParameter(const PackageParameterType& package) { const CameraSet camera_select(package.camera_select); const ContextSet context_select(package.context_select); - IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); if (camera_select.IsValid() && context_select.IsValid()) { for (int camera_id : camera_select) { CameraConfig& camera = cameras[camera_id]; @@ -965,31 +959,47 @@ static void SetPackageParameter() { } } } - rb.Push(RESULT_SUCCESS); + return RESULT_SUCCESS; } else { LOG_ERROR(Service_CAM, "invalid camera_select=%u, context_select=%u", package.camera_select, package.context_select); - rb.Push(ERROR_INVALID_ENUM_VALUE); + return ERROR_INVALID_ENUM_VALUE; } - - LOG_DEBUG(Service_CAM, "called"); } -Resolution PackageParameterWithContext::GetResolution() { +Resolution PackageParameterWithContext::GetResolution() const { return PRESET_RESOLUTION[static_cast<int>(size)]; } void SetPackageParameterWithContext(Service::Interface* self) { - SetPackageParameter<PackageParameterWithContext, 0x34, 5>(); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x34, 5, 0); + + PackageParameterWithContext package; + rp.PopRaw(package); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + ResultCode result = SetPackageParameter(package); + rb.Push(result); + + LOG_DEBUG(Service_CAM, "called"); } void SetPackageParameterWithContextDetail(Service::Interface* self) { - SetPackageParameter<PackageParameterWithContextDetail, 0x35, 7>(); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x35, 7, 0); + + PackageParameterWithContextDetail package; + rp.PopRaw(package); + + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); + ResultCode result = SetPackageParameter(package); + rb.Push(result); + + LOG_DEBUG(Service_CAM, "called"); } void GetSuitableY2rStandardCoefficient(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x36, 0, 0).MakeBuilder(2, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x36, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); rb.Push(RESULT_SUCCESS); rb.Push<u32>(0); @@ -1007,8 +1017,8 @@ void PlayShutterSound(Service::Interface* self) { } void DriverInitialize(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x39, 0, 0).MakeBuilder(1, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x39, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); for (int camera_id = 0; camera_id < NumCameras; ++camera_id) { CameraConfig& camera = cameras[camera_id]; @@ -1040,8 +1050,8 @@ void DriverInitialize(Service::Interface* self) { } void DriverFinalize(Service::Interface* self) { - IPC::RequestBuilder rb = - IPC::RequestParser(Kernel::GetCommandBuffer(), 0x3A, 0, 0).MakeBuilder(1, 0); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x3A, 0, 0); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); CancelReceiving(0); CancelReceiving(1); |