ref: f55450d14180a201eed910c04602605531f876d8
parent: 5cc1d5ac018d4c00f11cb31a9ab6fdc6a0a4b3f4
author: Clownacy <Clownacy@users.noreply.github.com>
date: Tue Apr 21 10:27:15 EDT 2020
Rename WiiU.cpp to WiiU-Hardware.cpp
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -334,7 +334,7 @@
target_link_libraries(CSE2 PRIVATE ${CMAKE_DL_LIBS})
elseif(BACKEND_AUDIO MATCHES "WiiU-Hardware")
target_sources(CSE2 PRIVATE
- "src/Backends/Audio/WiiU.cpp"
+ "src/Backends/Audio/WiiU-Hardware.cpp"
)
elseif(BACKEND_AUDIO MATCHES "WiiU-Software")
target_sources(CSE2 PRIVATE
--- /dev/null
+++ b/src/Backends/Audio/WiiU-Hardware.cpp
@@ -1,0 +1,417 @@
+#include "../Audio.h"
+
+#include <math.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <coreinit/cache.h>
+#include <coreinit/mutex.h>
+#include <coreinit/thread.h>
+#include <sndcore2/core.h>
+#include <sndcore2/voice.h>
+#include <sndcore2/drcvs.h>
+
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z))
+
+struct AudioBackend_Sound
+{
+ signed char *samples;
+ size_t length;
+ AXVoice *voice;
+ unsigned int frequency;
+ unsigned short volume;
+ unsigned short pan_l;
+ unsigned short pan_r;
+
+ struct AudioBackend_Sound *next;
+};
+
+static void (*organya_callback)(void);
+static unsigned int organya_milliseconds;
+
+static unsigned long ticks_per_second;
+
+static OSMutex sound_list_mutex;
+static OSMutex organya_mutex;
+
+static AudioBackend_Sound *sound_list_head;
+
+static void CullVoices(void)
+{
+ // Free any voices that aren't playing anymore
+ OSLockMutex(&sound_list_mutex);
+
+ for (AudioBackend_Sound *sound = sound_list_head; sound != NULL; sound = sound->next)
+ {
+ if (sound->voice != NULL)
+ {
+ if (!AXIsVoiceRunning(sound->voice))
+ {
+ AXVoiceBegin(sound->voice);
+ AXFreeVoice(sound->voice);
+ AXVoiceEnd(sound->voice);
+ sound->voice = NULL;
+ }
+ }
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+static double MillibelToScale(long volume)
+{
+ // Volume is in hundredths of a decibel, from 0 to -10000
+ volume = CLAMP(volume, -10000, 0);
+ return pow(10.0, volume / 2000.0);
+}
+
+static unsigned long GetTicksMilliseconds(void)
+{
+ static uint64_t accumulator;
+
+ static unsigned long last_tick;
+
+ unsigned long current_tick = OSGetTick();
+
+ accumulator += current_tick - last_tick;
+
+ last_tick = current_tick;
+
+ return (accumulator * 1000) / ticks_per_second;
+}
+
+static int ThreadFunction(int argc, const char *argv[])
+{
+ for (;;)
+ {
+ OSTestThreadCancel();
+
+ OSLockMutex(&organya_mutex);
+
+ if (organya_milliseconds == 0)
+ {
+ OSUnlockMutex(&organya_mutex);
+
+ // Do nothing
+ OSSleepTicks(ticks_per_second / 1000);
+ }
+ else
+ {
+ OSUnlockMutex(&organya_mutex);
+
+ // Update Organya
+ static unsigned long next_ticks;
+
+ for (;;)
+ {
+ unsigned long ticks = GetTicksMilliseconds();
+
+ if (ticks >= next_ticks)
+ break;
+
+ OSSleepTicks(ticks_per_second / 1000);
+ }
+
+ OSLockMutex(&organya_mutex);
+ next_ticks += organya_milliseconds;
+ OSUnlockMutex(&organya_mutex);
+
+ OSLockMutex(&sound_list_mutex);
+ organya_callback();
+ OSUnlockMutex(&sound_list_mutex);
+ }
+ }
+
+ return 0;
+}
+
+bool AudioBackend_Init(void)
+{
+ if (!AXIsInit())
+ {
+ AXInitParams initparams = {
+ .renderer = AX_INIT_RENDERER_48KHZ,
+ .pipeline = AX_INIT_PIPELINE_SINGLE,
+ };
+
+ AXInitWithParams(&initparams);
+ }
+
+ ticks_per_second = OSGetSystemInfo()->busClockSpeed / 4;
+
+ OSInitMutex(&sound_list_mutex);
+ OSInitMutex(&organya_mutex);
+
+ OSRunThread(OSGetDefaultThread(0), ThreadFunction, 0, NULL);
+
+ return true;
+}
+
+void AudioBackend_Deinit(void)
+{
+ OSCancelThread(OSGetDefaultThread(0));
+
+ OSJoinThread(OSGetDefaultThread(0), NULL);
+
+ AXQuit();
+}
+
+AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length)
+{
+ AudioBackend_Sound *sound = (AudioBackend_Sound*)malloc(sizeof(AudioBackend_Sound));
+
+ if (sound != NULL)
+ {
+ signed char *samples_copy = (signed char*)malloc(length);
+
+ if (samples_copy != NULL)
+ {
+ // Convert to signed
+ for (size_t i = 0; i < length; ++i)
+ samples_copy[i] = samples[i] - 0x80;
+
+ DCStoreRange(samples_copy, length);
+
+ sound->samples = samples_copy;
+ sound->length = length;
+ sound->voice = NULL;
+ sound->frequency = frequency;
+ sound->volume = 0x8000;
+ sound->pan_l = 0x8000;
+ sound->pan_r = 0x8000;
+
+ OSLockMutex(&sound_list_mutex);
+ sound->next = sound_list_head;
+ sound_list_head = sound;
+ OSUnlockMutex(&sound_list_mutex);
+
+ return sound;
+ }
+
+ free(sound);
+ }
+
+ return NULL;
+}
+
+void AudioBackend_DestroySound(AudioBackend_Sound *sound)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ // Unhook sound from the linked-list
+ for (AudioBackend_Sound **sound_pointer = &sound_list_head; *sound_pointer != NULL; sound_pointer = &(*sound_pointer)->next)
+ {
+ if (*sound_pointer == sound)
+ {
+ *sound_pointer = sound->next;
+ break;
+ }
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+ AXFreeVoice(sound->voice);
+ AXVoiceEnd(sound->voice);
+ }
+
+ free(sound->samples);
+ free(sound);
+}
+
+void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping)
+{
+ if (sound == NULL)
+ return;
+
+ CullVoices();
+
+ OSLockMutex(&sound_list_mutex);
+
+ if (sound->voice == NULL)
+ {
+ AXVoice *voice = AXAcquireVoice(31, NULL, NULL);
+
+ if (voice != NULL)
+ {
+ AXVoiceBegin(voice);
+
+ AXSetVoiceType(voice, 0);
+
+ AXVoiceVeData vol = {.volume = sound->volume};
+ AXSetVoiceVe(voice, &vol);
+
+ AXVoiceDeviceMixData mix_data[6];
+ memset(mix_data, 0, sizeof(mix_data));
+ mix_data[0].bus[0].volume = sound->pan_l;
+ mix_data[1].bus[0].volume = sound->pan_r;
+
+ AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_DRC, 0, mix_data);
+ AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_TV, 0, mix_data);
+
+ float srcratio = (float)sound->frequency / (float)AXGetInputSamplesPerSec();
+ AXSetVoiceSrcRatio(voice, srcratio);
+ AXSetVoiceSrcType(voice, AX_VOICE_SRC_TYPE_LINEAR);
+
+ AXVoiceOffsets offs;
+ offs.dataType = AX_VOICE_FORMAT_LPCM8;
+ offs.endOffset = sound->length;
+ offs.loopingEnabled = AX_VOICE_LOOP_DISABLED;
+ offs.loopOffset = 0;
+ offs.currentOffset = 0;
+ offs.data = sound->samples;
+ AXSetVoiceOffsets(voice, &offs);
+
+ AXVoiceEnd(voice);
+
+ sound->voice = voice;
+ }
+ }
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ AXSetVoiceLoop(sound->voice, looping ? AX_VOICE_LOOP_ENABLED : AX_VOICE_LOOP_DISABLED);
+ AXSetVoiceState(sound->voice, AX_VOICE_STATE_PLAYING);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+void AudioBackend_StopSound(AudioBackend_Sound *sound)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ AXSetVoiceState(sound->voice, AX_VOICE_STATE_STOPPED);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+void AudioBackend_RewindSound(AudioBackend_Sound *sound)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ AXSetVoiceCurrentOffset(sound->voice, 0);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ sound->frequency = frequency;
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ float srcratio = (float)frequency / (float)AXGetInputSamplesPerSec();
+ AXSetVoiceSrcRatio(sound->voice, srcratio);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ sound->volume = (unsigned short)(0x8000 * MillibelToScale(volume));
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ AXVoiceVeData vol = {.volume = sound->volume};
+
+ AXSetVoiceVe(sound->voice, &vol);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan)
+{
+ if (sound == NULL)
+ return;
+
+ OSLockMutex(&sound_list_mutex);
+
+ sound->pan_l = (unsigned short)(0x8000 * MillibelToScale(-pan));
+ sound->pan_r = (unsigned short)(0x8000 * MillibelToScale(pan));
+
+ if (sound->voice != NULL)
+ {
+ AXVoiceBegin(sound->voice);
+
+ AXVoiceDeviceMixData mix_data[6];
+ memset(mix_data, 0, sizeof(mix_data));
+ mix_data[0].bus[0].volume = sound->pan_l;
+ mix_data[1].bus[0].volume = sound->pan_r;
+
+ AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_DRC, 0, mix_data);
+ AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_TV, 0, mix_data);
+
+ AXVoiceEnd(sound->voice);
+ }
+
+ OSUnlockMutex(&sound_list_mutex);
+}
+
+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_milliseconds = milliseconds;
+
+ OSUnlockMutex(&organya_mutex);
+}
--- a/src/Backends/Audio/WiiU.cpp
+++ /dev/null
@@ -1,417 +1,0 @@
-#include "../Audio.h"
-
-#include <math.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <coreinit/cache.h>
-#include <coreinit/mutex.h>
-#include <coreinit/thread.h>
-#include <sndcore2/core.h>
-#include <sndcore2/voice.h>
-#include <sndcore2/drcvs.h>
-
-#define MIN(a, b) ((a) < (b) ? (a) : (b))
-#define MAX(a, b) ((a) > (b) ? (a) : (b))
-#define CLAMP(x, y, z) MIN(MAX((x), (y)), (z))
-
-struct AudioBackend_Sound
-{
- signed char *samples;
- size_t length;
- AXVoice *voice;
- unsigned int frequency;
- unsigned short volume;
- unsigned short pan_l;
- unsigned short pan_r;
-
- struct AudioBackend_Sound *next;
-};
-
-static void (*organya_callback)(void);
-static unsigned int organya_milliseconds;
-
-static unsigned long ticks_per_second;
-
-static OSMutex sound_list_mutex;
-static OSMutex organya_mutex;
-
-static AudioBackend_Sound *sound_list_head;
-
-static void CullVoices(void)
-{
- // Free any voices that aren't playing anymore
- OSLockMutex(&sound_list_mutex);
-
- for (AudioBackend_Sound *sound = sound_list_head; sound != NULL; sound = sound->next)
- {
- if (sound->voice != NULL)
- {
- if (!AXIsVoiceRunning(sound->voice))
- {
- AXVoiceBegin(sound->voice);
- AXFreeVoice(sound->voice);
- AXVoiceEnd(sound->voice);
- sound->voice = NULL;
- }
- }
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-static double MillibelToScale(long volume)
-{
- // Volume is in hundredths of a decibel, from 0 to -10000
- volume = CLAMP(volume, -10000, 0);
- return pow(10.0, volume / 2000.0);
-}
-
-static unsigned long GetTicksMilliseconds(void)
-{
- static uint64_t accumulator;
-
- static unsigned long last_tick;
-
- unsigned long current_tick = OSGetTick();
-
- accumulator += current_tick - last_tick;
-
- last_tick = current_tick;
-
- return (accumulator * 1000) / ticks_per_second;
-}
-
-static int ThreadFunction(int argc, const char *argv[])
-{
- for (;;)
- {
- OSTestThreadCancel();
-
- OSLockMutex(&organya_mutex);
-
- if (organya_milliseconds == 0)
- {
- OSUnlockMutex(&organya_mutex);
-
- // Do nothing
- OSSleepTicks(ticks_per_second / 1000);
- }
- else
- {
- OSUnlockMutex(&organya_mutex);
-
- // Update Organya
- static unsigned long next_ticks;
-
- for (;;)
- {
- unsigned long ticks = GetTicksMilliseconds();
-
- if (ticks >= next_ticks)
- break;
-
- OSSleepTicks(ticks_per_second / 1000);
- }
-
- OSLockMutex(&organya_mutex);
- next_ticks += organya_milliseconds;
- OSUnlockMutex(&organya_mutex);
-
- OSLockMutex(&sound_list_mutex);
- organya_callback();
- OSUnlockMutex(&sound_list_mutex);
- }
- }
-
- return 0;
-}
-
-bool AudioBackend_Init(void)
-{
- if (!AXIsInit())
- {
- AXInitParams initparams = {
- .renderer = AX_INIT_RENDERER_48KHZ,
- .pipeline = AX_INIT_PIPELINE_SINGLE,
- };
-
- AXInitWithParams(&initparams);
- }
-
- ticks_per_second = OSGetSystemInfo()->busClockSpeed / 4;
-
- OSInitMutex(&sound_list_mutex);
- OSInitMutex(&organya_mutex);
-
- OSRunThread(OSGetDefaultThread(0), ThreadFunction, 0, NULL);
-
- return true;
-}
-
-void AudioBackend_Deinit(void)
-{
- OSCancelThread(OSGetDefaultThread(0));
-
- OSJoinThread(OSGetDefaultThread(0), NULL);
-
- AXQuit();
-}
-
-AudioBackend_Sound* AudioBackend_CreateSound(unsigned int frequency, const unsigned char *samples, size_t length)
-{
- AudioBackend_Sound *sound = (AudioBackend_Sound*)malloc(sizeof(AudioBackend_Sound));
-
- if (sound != NULL)
- {
- signed char *samples_copy = (signed char*)malloc(length);
-
- if (samples_copy != NULL)
- {
- // Convert to signed
- for (size_t i = 0; i < length; ++i)
- samples_copy[i] = samples[i] - 0x80;
-
- DCStoreRange(samples_copy, length);
-
- sound->samples = samples_copy;
- sound->length = length;
- sound->voice = NULL;
- sound->frequency = frequency;
- sound->volume = 0x8000;
- sound->pan_l = 0x8000;
- sound->pan_r = 0x8000;
-
- OSLockMutex(&sound_list_mutex);
- sound->next = sound_list_head;
- sound_list_head = sound;
- OSUnlockMutex(&sound_list_mutex);
-
- return sound;
- }
-
- free(sound);
- }
-
- return NULL;
-}
-
-void AudioBackend_DestroySound(AudioBackend_Sound *sound)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- // Unhook sound from the linked-list
- for (AudioBackend_Sound **sound_pointer = &sound_list_head; *sound_pointer != NULL; sound_pointer = &(*sound_pointer)->next)
- {
- if (*sound_pointer == sound)
- {
- *sound_pointer = sound->next;
- break;
- }
- }
-
- OSUnlockMutex(&sound_list_mutex);
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
- AXFreeVoice(sound->voice);
- AXVoiceEnd(sound->voice);
- }
-
- free(sound->samples);
- free(sound);
-}
-
-void AudioBackend_PlaySound(AudioBackend_Sound *sound, bool looping)
-{
- if (sound == NULL)
- return;
-
- CullVoices();
-
- OSLockMutex(&sound_list_mutex);
-
- if (sound->voice == NULL)
- {
- AXVoice *voice = AXAcquireVoice(31, NULL, NULL);
-
- if (voice != NULL)
- {
- AXVoiceBegin(voice);
-
- AXSetVoiceType(voice, 0);
-
- AXVoiceVeData vol = {.volume = sound->volume};
- AXSetVoiceVe(voice, &vol);
-
- AXVoiceDeviceMixData mix_data[6];
- memset(mix_data, 0, sizeof(mix_data));
- mix_data[0].bus[0].volume = sound->pan_l;
- mix_data[1].bus[0].volume = sound->pan_r;
-
- AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_DRC, 0, mix_data);
- AXSetVoiceDeviceMix(voice, AX_DEVICE_TYPE_TV, 0, mix_data);
-
- float srcratio = (float)sound->frequency / (float)AXGetInputSamplesPerSec();
- AXSetVoiceSrcRatio(voice, srcratio);
- AXSetVoiceSrcType(voice, AX_VOICE_SRC_TYPE_LINEAR);
-
- AXVoiceOffsets offs;
- offs.dataType = AX_VOICE_FORMAT_LPCM8;
- offs.endOffset = sound->length;
- offs.loopingEnabled = AX_VOICE_LOOP_DISABLED;
- offs.loopOffset = 0;
- offs.currentOffset = 0;
- offs.data = sound->samples;
- AXSetVoiceOffsets(voice, &offs);
-
- AXVoiceEnd(voice);
-
- sound->voice = voice;
- }
- }
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- AXSetVoiceLoop(sound->voice, looping ? AX_VOICE_LOOP_ENABLED : AX_VOICE_LOOP_DISABLED);
- AXSetVoiceState(sound->voice, AX_VOICE_STATE_PLAYING);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-void AudioBackend_StopSound(AudioBackend_Sound *sound)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- AXSetVoiceState(sound->voice, AX_VOICE_STATE_STOPPED);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-void AudioBackend_RewindSound(AudioBackend_Sound *sound)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- AXSetVoiceCurrentOffset(sound->voice, 0);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-void AudioBackend_SetSoundFrequency(AudioBackend_Sound *sound, unsigned int frequency)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- sound->frequency = frequency;
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- float srcratio = (float)frequency / (float)AXGetInputSamplesPerSec();
- AXSetVoiceSrcRatio(sound->voice, srcratio);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-void AudioBackend_SetSoundVolume(AudioBackend_Sound *sound, long volume)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- sound->volume = (unsigned short)(0x8000 * MillibelToScale(volume));
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- AXVoiceVeData vol = {.volume = sound->volume};
-
- AXSetVoiceVe(sound->voice, &vol);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-void AudioBackend_SetSoundPan(AudioBackend_Sound *sound, long pan)
-{
- if (sound == NULL)
- return;
-
- OSLockMutex(&sound_list_mutex);
-
- sound->pan_l = (unsigned short)(0x8000 * MillibelToScale(-pan));
- sound->pan_r = (unsigned short)(0x8000 * MillibelToScale(pan));
-
- if (sound->voice != NULL)
- {
- AXVoiceBegin(sound->voice);
-
- AXVoiceDeviceMixData mix_data[6];
- memset(mix_data, 0, sizeof(mix_data));
- mix_data[0].bus[0].volume = sound->pan_l;
- mix_data[1].bus[0].volume = sound->pan_r;
-
- AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_DRC, 0, mix_data);
- AXSetVoiceDeviceMix(sound->voice, AX_DEVICE_TYPE_TV, 0, mix_data);
-
- AXVoiceEnd(sound->voice);
- }
-
- OSUnlockMutex(&sound_list_mutex);
-}
-
-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_milliseconds = milliseconds;
-
- OSUnlockMutex(&organya_mutex);
-}