summaryrefslogtreecommitdiff
path: root/arm7/lib
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/lib')
-rw-r--r--arm7/lib/include/SND.h10
-rw-r--r--arm7/lib/include/SND_command.h7
-rw-r--r--arm7/lib/include/SND_exChannel.h5
-rw-r--r--arm7/lib/include/SND_main.h16
-rw-r--r--arm7/lib/include/SND_seq.h7
-rw-r--r--arm7/lib/include/SND_util.h8
-rw-r--r--arm7/lib/src/SND_main.c114
7 files changed, 166 insertions, 1 deletions
diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h
new file mode 100644
index 00000000..69db1a16
--- /dev/null
+++ b/arm7/lib/include/SND.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_SND_H
+#define GUARD_SND_H
+
+#include "nitro/types.h"
+
+void SND_Enable(void);
+void SND_SetOutputSelector(u8 leftOutputFrom, u8 rightOutputFrom, u8 outputCh1ToMixer, u8 outputCh3ToMixer);
+void SND_SetMasterVolume(u8 vol);
+
+#endif //GUARD_SND_H
diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h
new file mode 100644
index 00000000..ea5452b9
--- /dev/null
+++ b/arm7/lib/include/SND_command.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_SND_COMMAND_H
+#define GUARD_SND_COMMAND_H
+
+void SND_CommandInit(void);
+void SND_CommandProc(void);
+
+#endif //GUARD_SND_COMMAND_H
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h
index b9545435..976d2786 100644
--- a/arm7/lib/include/SND_exChannel.h
+++ b/arm7/lib/include/SND_exChannel.h
@@ -1,8 +1,11 @@
#ifndef GUARD_SND_EXCHANNEL_H
#define GUARD_SND_EXCHANNEL_H
-#include "global.h"
+#include "nitro/types.h"
+void SND_ExChannelInit(void);
BOOL SND_IsChannelActive(s32 idx);
+void SND_UpdateExChannel(void);
+void SND_ExChannelMain(BOOL update);
#endif //GUARD_SND_EXCHANNEL_H
diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h
new file mode 100644
index 00000000..eba3ff44
--- /dev/null
+++ b/arm7/lib/include/SND_main.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_SND_MAIN_H
+#define GUARD_SND_MAIN_H
+
+#include "nitro/types.h"
+
+void SND_Init(u32 priority);
+void SND_CreateThread(u32 priority);
+void SND_InitIntervalTimer(void);
+void SND_StartIntervalTimer(void);
+void SND_StopIntervalTimer(void);
+u32 SND_WaitForIntervalTimer(void);
+void SND_SendWakeupMessage(void);
+void SNDi_LockMutex(void);
+void SNDi_UnlockMutex(void);
+
+#endif //GUARD_SND_MAIN_H
diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h
new file mode 100644
index 00000000..642cff3e
--- /dev/null
+++ b/arm7/lib/include/SND_seq.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_SND_SEQ_H
+#define GUARD_SND_SEQ_H
+
+void SND_SeqInit(void);
+void SND_SeqMain(BOOL update);
+
+#endif //GUARD_SND_SEQ_H
diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h
new file mode 100644
index 00000000..babf2a87
--- /dev/null
+++ b/arm7/lib/include/SND_util.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_SND_UTIL_H
+#define GUARD_SND_UTIL_H
+
+#include "nitro/types.h"
+
+u32 SND_CalcRandom(void);
+
+#endif //GUARD_SND_UTIL_H
diff --git a/arm7/lib/src/SND_main.c b/arm7/lib/src/SND_main.c
new file mode 100644
index 00000000..96dcdc78
--- /dev/null
+++ b/arm7/lib/src/SND_main.c
@@ -0,0 +1,114 @@
+#include "SND_main.h"
+
+#include "global.h"
+
+#include "SND.h"
+#include "SND_alarm.h"
+#include "SND_capture.h"
+#include "SND_command.h"
+#include "SND_exChannel.h"
+#include "SND_seq.h"
+#include "SND_util.h"
+#include "SND_work.h"
+
+#include "OS_alarm.h"
+#include "OS_thread.h"
+#include "OS_message.h"
+#include "OS_tick.h"
+
+static void FUN_037fc330(void *);
+static void SndThread(void *);
+
+u8 sThreadStack[0x400];
+OSThread sThread;
+OSAlarm sAlarm;
+OSMessageQueue sMessageQueue;
+OSMessage sMessageArray[8];
+u32 sInitialized = 0;
+
+void SND_Init(u32 priority) {
+ if (sInitialized == 0) {
+ sInitialized = 1;
+ SND_CommandInit();
+ SND_CreateThread(priority);
+ }
+}
+
+void SND_CreateThread(u32 priority) {
+ OS_CreateThread(&sThread, SndThread, NULL, &sThreadStack[sizeof(sThreadStack)], sizeof(sThreadStack), priority);
+ OS_WakeupThreadDirect(&sThread);
+}
+
+void SND_InitIntervalTimer(void) {
+ OS_InitMessageQueue(&sMessageQueue, sMessageArray, 8);
+ OS_CreateAlarm(&sAlarm);
+}
+
+void SND_StartIntervalTimer(void) {
+ OSTick tick = OS_GetTick();
+ OS_SetPeriodicAlarm(&sAlarm, tick + 0x10000, 2728, FUN_037fc330, NULL);
+}
+
+void SND_StopIntervalTimer(void) {
+ OS_CancelAlarm(&sAlarm);
+}
+
+u32 SND_WaitForIntervalTimer(void) {
+ OSMessage result;
+ (void)OS_ReceiveMessage(&sMessageQueue, &result, 1);
+ return (u32)result;
+}
+
+void SND_SendWakeupMessage(void) {
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)2, 0);
+}
+
+void SNDi_LockMutex(void) {
+ // nothing
+}
+
+void SNDi_UnlockMutex(void) {
+ // nothing
+}
+
+static void FUN_037fc330(void *arg) {
+ (void)arg;
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)1, 0);
+}
+
+static void SndThread(void *arg) {
+ (void)arg;
+
+ SND_InitIntervalTimer();
+ SND_ExChannelInit();
+ SND_SeqInit();
+ SND_AlarmInit();
+ SND_Enable();
+ SND_SetOutputSelector(0, 0, 0, 0);
+ SND_SetMasterVolume(0x7F);
+ SND_StartIntervalTimer();
+
+ while (1) {
+ BOOL update = FALSE;
+
+ u32 result = SND_WaitForIntervalTimer();
+
+ switch (result) {
+ case 2:
+ update = FALSE;
+ break;
+ case 1:
+ update = TRUE;
+ break;
+ }
+
+ SND_UpdateExChannel();
+ SND_CommandProc();
+
+ SND_SeqMain(update);
+ SND_ExChannelMain(update);
+
+ SND_UpdateSharedWork();
+ (void)SND_CalcRandom();
+ }
+}