summaryrefslogtreecommitdiff
path: root/arm7/lib/src/SND_main.c
blob: 96dcdc78bf9f576047cd60773c279dd7e3287a3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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();
    }
}