From f78f6b7105f59538822c80f4e7abdff260ba3a31 Mon Sep 17 00:00:00 2001 From: Clownacy Date: Sat, 18 Apr 2020 00:54:24 +0100 Subject: [PATCH] Split Organya callback data The function pointer only ever needs to be set once, unlike the timer. This should avoid any scary race-conditions. --- src/Backends/Audio.h | 3 ++- src/Backends/Audio/WiiU.cpp | 10 ++++++++-- src/Organya.cpp | 8 +++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/Backends/Audio.h b/src/Backends/Audio.h index 8ae67411..86ad6563 100644 --- a/src/Backends/Audio.h +++ b/src/Backends/Audio.h @@ -18,4 +18,5 @@ void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int freq void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume); void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan); -void AudioBackend_SetOrganyaCallback(void (*callback)(void), unsigned int milliseconds); +void AudioBackend_SetOrganyaCallback(void (*callback)(void)); +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds); diff --git a/src/Backends/Audio/WiiU.cpp b/src/Backends/Audio/WiiU.cpp index 27c4f64e..62ca0858 100644 --- a/src/Backends/Audio/WiiU.cpp +++ b/src/Backends/Audio/WiiU.cpp @@ -338,11 +338,17 @@ void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan) OSUnlockMutex(&sound_list_mutex); } -void AudioBackend_SetOrganyaCallback(void (*callback)(void), unsigned int milliseconds) +void AudioBackend_SetOrganyaCallback(void (*callback)(void)) +{ + // As far as thread-safety goes - this is guarded by + // `organya_milliseconds`, which is guarded by `organya_mutex`. + organya_callback = callback; +} + +void AudioBackend_SetOrganyaTimer(unsigned int milliseconds) { OSLockMutex(&organya_mutex); - organya_callback = callback; organya_milliseconds = milliseconds; OSUnlockMutex(&organya_mutex); diff --git a/src/Organya.cpp b/src/Organya.cpp index d7a5cae1..00fd7d73 100644 --- a/src/Organya.cpp +++ b/src/Organya.cpp @@ -790,6 +790,8 @@ BOOL StartOrganya(const char *path_wave) // The argument is ignored for some rea org_data.InitOrgData(); + AudioBackend_SetOrganyaCallback(OrganyaCallback); + return TRUE; } @@ -835,7 +837,7 @@ void PlayOrganyaMusic(void) if (!audio_backend_initialised) return; - AudioBackend_SetOrganyaCallback(OrganyaCallback, org_data.info.wait); + AudioBackend_SetOrganyaTimer(org_data.info.wait); } BOOL ChangeOrganyaVolume(signed int volume) @@ -855,7 +857,7 @@ void StopOrganyaMusic(void) if (!audio_backend_initialised) return; - AudioBackend_SetOrganyaCallback(NULL, 0); + AudioBackend_SetOrganyaTimer(0); // Stop notes for (int i = 0; i < MAXMELODY; i++) @@ -878,7 +880,7 @@ void EndOrganya(void) if (!audio_backend_initialised) return; - AudioBackend_SetOrganyaCallback(NULL, 0); + AudioBackend_SetOrganyaTimer(0); // Release everything related to org org_data.ReleaseNote();