From 54d77952117659dd8675b030ae9089c61503b78d Mon Sep 17 00:00:00 2001 From: capitalistspz Date: Wed, 15 Apr 2026 01:15:57 +0100 Subject: [PATCH] Small changes to worker thread func --- src/Cafe/OS/libs/camera/camera.cpp | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Cafe/OS/libs/camera/camera.cpp b/src/Cafe/OS/libs/camera/camera.cpp index fd6dce3d..d3618f12 100644 --- a/src/Cafe/OS/libs/camera/camera.cpp +++ b/src/Cafe/OS/libs/camera/camera.cpp @@ -113,7 +113,7 @@ namespace camera SysAllocator> s_cameraWorkerThreadNameBuffer; SysAllocator s_cameraOpenEvent; - void WorkerThread(PPCInterpreter_t*) + static void WorkerThreadFunc(PPCInterpreter_t*) { s_cameraEventData->type = CAMEventType::Decode; s_cameraEventData->channel = 0; @@ -126,18 +126,12 @@ namespace camera coreinit::OSWaitEvent(s_cameraOpenEvent); while (true) { - if (!s_instance.isOpen || s_instance.isExiting) - { - // Fill leftover buffers before stopping - if (!s_instance.inTargetBuffers.HasData()) - break; - } - s_cameraEventData->type = CAMEventType::Decode; - s_cameraEventData->channel = 0; - const auto surfaceBuffer = s_instance.inTargetBuffers.Pop(); - if (surfaceBuffer.IsNull()) + if (!surfaceBuffer) { + // Only exit when no buffers are left + if (!s_instance.isOpen || s_instance.isExiting) + break; s_cameraEventData->data = nullptr; s_cameraEventData->errored = true; } @@ -149,6 +143,8 @@ namespace camera s_cameraEventData->data = surfaceBuffer; s_cameraEventData->errored = false; } + s_cameraEventData->type = CAMEventType::Decode; + s_cameraEventData->channel = 0; PPCCoreCallback(s_instance.eventCallback, s_cameraEventData.GetMPTR()); coreinit::OSSleepTicks(Espresso::TIMER_CLOCK / (s_instance.fps - 1)); } @@ -202,7 +198,7 @@ namespace camera coreinit::OSEvent::EVENT_MODE::MODE_AUTO); coreinit::__OSCreateThreadType( - s_cameraWorkerThread, RPLLoader_MakePPCCallable(WorkerThread), 0, nullptr, + s_cameraWorkerThread, RPLLoader_MakePPCCallable(WorkerThreadFunc), 0, nullptr, s_cameraWorkerThreadStack.GetPtr() + s_cameraWorkerThreadStack.GetByteSize(), s_cameraWorkerThreadStack.GetByteSize(), 0x10, initInfo->threadFlags & 7, OSThread_t::THREAD_TYPE::TYPE_DRIVER);