diff --git a/include/kernel/kernel.hpp b/include/kernel/kernel.hpp index 5e27e911..0b97b6c1 100644 --- a/include/kernel/kernel.hpp +++ b/include/kernel/kernel.hpp @@ -191,4 +191,5 @@ public: } void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); } + void signalDSPEvents() { serviceManager.signalDSPEvents(); } }; \ No newline at end of file diff --git a/include/services/dsp.hpp b/include/services/dsp.hpp index f3e4d51f..5fe42a89 100644 --- a/include/services/dsp.hpp +++ b/include/services/dsp.hpp @@ -93,4 +93,6 @@ public: Stereo = 1, Surround = 2 }; + + void signalEvents(); }; \ No newline at end of file diff --git a/include/services/service_manager.hpp b/include/services/service_manager.hpp index 8751de66..10d816c1 100644 --- a/include/services/service_manager.hpp +++ b/include/services/service_manager.hpp @@ -80,4 +80,6 @@ public: void requestGPUInterrupt(GPUInterrupt type) { gsp_gpu.requestInterrupt(type); } void setGSPSharedMem(u8* ptr) { gsp_gpu.setSharedMem(ptr); } void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); } + + void signalDSPEvents() { dsp.signalEvents(); } }; \ No newline at end of file diff --git a/src/core/services/dsp.cpp b/src/core/services/dsp.cpp index 7309463f..f672dde2 100644 --- a/src/core/services/dsp.cpp +++ b/src/core/services/dsp.cpp @@ -215,4 +215,14 @@ void DSPService::invalidateDCache(u32 messagePointer) { log("DSP::InvalidateDataCache (addr = %08X, size = %08X, process = %X)\n", address, size, process); mem.write32(messagePointer, IPC::responseHeader(0x14, 1, 0)); mem.write32(messagePointer + 4, Result::Success); +} + +void DSPService::signalEvents() { + for (const DSPEvent& e : pipeEvents) { + if (e.has_value()) { kernel.signalEvent(e.value()); } + } + + if (semaphoreEvent.has_value()) { kernel.signalEvent(semaphoreEvent.value()); } + if (interrupt0.has_value()) { kernel.signalEvent(interrupt0.value()); } + if (interrupt1.has_value()) { kernel.signalEvent(interrupt1.value()); } } \ No newline at end of file