summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio2/JASAudioThread.cpp
blob: 56218bc254e405e1894eb7e2a1ff93ae2a281f03 (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
115
116
117
118
119
120
121
122
123
124
125
126
//
// Generated By: dol2asm
// Translation Unit: JASAudioThread
//

#include "JSystem/JSystem.h" // IWYU pragma: keep

#include "JSystem/JAudio2/JASAudioThread.h"
#include "JSystem/JAudio2/JASAiCtrl.h"
#include "JSystem/JAudio2/JASDriverIF.h"
#include "JSystem/JAudio2/JASDSPChannel.h"
#include "JSystem/JAudio2/JASDSPInterface.h"
#include "JSystem/JAudio2/JASHeapCtrl.h"
#include "JSystem/JAudio2/JASProbe.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dolphin/dsp.h"

/* 8029CCDC-8029CD4C 29761C 0070+00 1/1 0/0 0/0 .text            __ct__14JASAudioThreadFiiUl */
JASAudioThread::JASAudioThread(int stackSize, int msgCount, u32 threadPriority)
    : 
    JKRThread(JASDram, threadPriority, msgCount, stackSize),
    JASGlobalInstance<JASAudioThread>(true)
{
    sbPauseFlag = false;
    OSInitThreadQueue(&sThreadQueue);
}

/* 8029CD4C-8029CDC0 29768C 0074+00 0/0 1/1 0/0 .text            create__14JASAudioThreadFl */
void JASAudioThread::create(long threadPriority) {
	JASAudioThread* sAudioThread = new (JASDram, 0) JASAudioThread(threadPriority, 0x10, 0x1400);
    sAudioThread->setCurrentHeap(JKRGetSystemHeap());
	sAudioThread->resume();
}

/* 8029CDC0-8029CDEC 297700 002C+00 0/0 1/1 0/0 .text            stop__14JASAudioThreadFv */
void JASAudioThread::stop() {
    jamMessageBlock((void*)2);
}

/* 804512D8-804512E0 0007D8 0004+04 1/1 2/2 0/0 .sbss            snIntCount__14JASAudioThread */
volatile int JASAudioThread::snIntCount;

class Lock {
public:
    Lock() {
        mInterrupts = OSDisableInterrupts();
    }
    ~Lock() {
        OSRestoreInterrupts(mInterrupts);
    }
private:
    BOOL mInterrupts;
};

class JASChannel {
    u8 filler[0x108];
};

/* 8029CDEC-8029CF68 29772C 017C+00 1/0 0/0 0/0 .text            run__14JASAudioThreadFv */
// NONMATCHING location of JASPoolAllocObject_MultiThreaded<JASChannel>
void* JASAudioThread::run() {
    OSInitFastCast();
    JASDriver::initAI(DMACallback);
    JASDsp::boot(DSPCallback);
    JASDsp::initBuffer();
    JASDSPChannel::initAll();

    JASPoolAllocObject_MultiThreaded<JASChannel>::newMemPool(0x48);
    JASDriver::startDMA();

    while (true) {
        OSMessage msg = waitMessageBlock();
        switch ((int)msg) {
        case AUDIOMSG_DMA:
            if (sbPauseFlag) {
                JASDriver::stopDMA();
                OSSleepThread(&sThreadQueue);
            }
            JASDriver::updateDac();
            JASDriver::updateDacCallback();
            break;

        case AUDIOMSG_DSP:
            snIntCount--;
            if (snIntCount == 0) {
                JASProbe::stop(7);
                JASDriver::finishDSPFrame();
            } else {
                JASProbe::start(2, "SFR_DSP");
                JASDriver::updateDSP();
                JASProbe::stop(2);
            }
            break;

        case AUDIOMSG_STOP:
            JASDriver::stopDMA();
            OSExitThread(NULL);
            break;
        }
    }
}

/* 8029CF68-8029CFBC 2978A8 0054+00 1/1 0/0 0/0 .text            DMACallback__14JASAudioThreadFv */
void JASAudioThread::DMACallback() {
    JASAudioThread* thread = getInstance();
	JASProbe::stop(4);
	JASProbe::start(4, "UPDATE-DAC");
	thread->sendMessage((void*)AUDIOMSG_DMA);
}

/* 8029CFBC-8029D028 2978FC 006C+00 1/1 0/0 0/0 .text            DSPCallback__14JASAudioThreadFPv */
void JASAudioThread::DSPCallback(void*) {
    JASAudioThread* thread = getInstance();
	while (DSPCheckMailFromDSP() == 0) { }

	u32 mail = DSPReadMailFromDSP();
	if (mail >> 0x10 == 0xF355) {
		if ((mail & 0xFF00) == 0xFF00) {
            thread->sendMessage((void*)AUDIOMSG_DSP);
		} else {
			JASDsp::finishWork(mail);
		}
	}
}

/* 8039B338-8039B338 027998 0000+00 0/0 0/0 0/0 .rodata          @stringBase0 */