Split Organya callback data

The function pointer only ever needs to be set once, unlike the
timer. This should avoid any scary race-conditions.
This commit is contained in:
Clownacy 2020-04-18 00:54:24 +01:00
parent 1ad6fdf539
commit f78f6b7105
3 changed files with 15 additions and 6 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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();