From c37aca70a7c335f42b76ea70d644ccac564a40c4 Mon Sep 17 00:00:00 2001 From: fkane Date: Mon, 27 Oct 2014 09:37:17 -0400 Subject: [PATCH] Make expansion interface interrupt updates thread-safe (fixes loss of audio in Super Mario Sunshine on lower-end systems.) --- Source/Core/Core/HW/EXI.cpp | 7 +++++++ Source/Core/Core/HW/EXI.h | 1 + 2 files changed, 8 insertions(+) diff --git a/Source/Core/Core/HW/EXI.cpp b/Source/Core/Core/HW/EXI.cpp index bf07b3c6a1..8680b94e7c 100644 --- a/Source/Core/Core/HW/EXI.cpp +++ b/Source/Core/Core/HW/EXI.cpp @@ -20,6 +20,7 @@ namespace ExpansionInterface { static int changeDevice; +static int updateInterrupts; static CEXIChannel *g_Channels[MAX_EXI_CHANNELS]; void Init() @@ -43,6 +44,7 @@ void Init() g_Channels[2]->AddDevice(EXIDEVICE_AD16, 0); changeDevice = CoreTiming::RegisterEvent("ChangeEXIDevice", ChangeDeviceCallback); + updateInterrupts = CoreTiming::RegisterEvent("EXIUpdateInterrupts", UpdateInterruptsCallback); } void Shutdown() @@ -114,6 +116,11 @@ IEXIDevice* FindDevice(TEXIDevices device_type, int customIndex) } void UpdateInterrupts() +{ + CoreTiming::ScheduleEvent_Threadsafe(0, updateInterrupts, 0); +} + +void UpdateInterruptsCallback(u64 userdata, int cyclesLate) { // Interrupts are mapped a bit strangely: // Channel 0 Device 0 generates interrupt on channel 0 diff --git a/Source/Core/Core/HW/EXI.h b/Source/Core/Core/HW/EXI.h index c54118716e..7ab87fbf74 100644 --- a/Source/Core/Core/HW/EXI.h +++ b/Source/Core/Core/HW/EXI.h @@ -27,6 +27,7 @@ void PauseAndLock(bool doLock, bool unpauseOnUnlock); void RegisterMMIO(MMIO::Mapping* mmio, u32 base); +void UpdateInterruptsCallback(u64 userdata, int cyclesLate); void UpdateInterrupts(); void ChangeDeviceCallback(u64 userdata, int cyclesLate);