summaryrefslogtreecommitdiff
path: root/src/JSystem/JAudio/JASDSPBuf.cpp
blob: 75679831afda7b0211402a78f3a7176803fa74da (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
//
// Generated by dtk
// Translation Unit: JASDSPBuf.cpp
//

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

#include "JSystem/JAudio/JASDSPBuf.h"
#include "JSystem/JAudio/JASAudioThread.h"
#include "JSystem/JAudio/JASCallback.h"
#include "JSystem/JAudio/JASDSPChannel.h"
#include "JSystem/JAudio/JASDSPInterface.h"
#include "JSystem/JAudio/JASProbe.h"
#include "JSystem/JAudio/JASRate.h"
#include "JSystem/JAudio/JASSystemHeap.h"
#include "JSystem/JAudio/osdsp_task.h"
#include "JSystem/JKernel/JKRSolidHeap.h"
#include "dolphin/os/OS.h"
#include "global.h"

u8 JASystem::TDSP_DACBuffer::numDSPBuf = 3;
int JASystem::TDSP_DACBuffer::isInit;
s16** JASystem::TDSP_DACBuffer::dsp_buf;
u8 JASystem::TDSP_DACBuffer::writeBuffer;
u8 JASystem::TDSP_DACBuffer::readBuffer;
u8 JASystem::TDSP_DACBuffer::dspStatus;

static void dummy() {
    OSReport("----- JASDSPBuf : DSP-DAC バッファの数を %d にしました\n");
}

/* 802892E0-802893E4       .text init__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::init() {
    if (!isInit) {
        u32 frameSamples = Kernel::getFrameSamples();
        writeBuffer = numDSPBuf - 1;
        readBuffer = 0;
        dsp_buf = new (JASDram, 0x20) s16*[numDSPBuf];
        for (int i = 0; i < numDSPBuf; i++) {
            dsp_buf[i] = new (JASDram, 0x20) s16[frameSamples * 2];
            for (u32 j = 0; j < frameSamples * 2; j++) {
                dsp_buf[i][j] = 0;
            }
            DCStoreRange(dsp_buf[i], frameSamples * 4);
        }
        OSReport("DSP_DAC buffer size : %d\n", frameSamples * 2);
        dspStatus = 0;
        isInit = 1;
    }
}

int JASystem::TDSP_DACBuffer::dacSyncCounter;

/* 802893E4-80289438       .text updateDSP__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::updateDSP() {
    dacSyncCounter++;
    Kernel::probeStart(3, "SFR-UPDATE");
    DSPInterface::invalChannelAll();
    Kernel::subframeCallback();
    TDSPChannel::updateAll();
    Kernel::aiCallback();
    Kernel::probeFinish(3);
}

/* 80289438-80289568       .text mixDSP__Q28JASystem14TDSP_DACBufferFl */
s16* JASystem::TDSP_DACBuffer::mixDSP(s32) {
    u8 var4 = readBuffer + 1;
    u32 frameSamples = Kernel::getFrameSamples();
    if (var4 == numDSPBuf) {
        var4 = 0;
    }
    if (var4 == writeBuffer && numDSPBuf >= 3) {
        s16 var1 = dsp_buf[readBuffer][frameSamples / 2 - 1];
        s16 var2 = dsp_buf[readBuffer][frameSamples - 1];
        for (u32 i = 0; i < frameSamples; i++) {
            dsp_buf[readBuffer][i] = var1;
        }
        for (u32 i = frameSamples; i < frameSamples * 2; i++) {
            dsp_buf[readBuffer][i] = var2;
        }
        if (dspStatus == 0) {
            OSReport("----- JASDSPBuf::process DACSYNC -- DSP Wait\n");
            finishDSPFrame();
        }
    } else {
        readBuffer = var4;
        DCInvalidateRange(dsp_buf[readBuffer], frameSamples * 4);
        if (dspStatus == 0) {
            finishDSPFrame();
        }
    }
    return dsp_buf[readBuffer];
}

void (*JASystem::TDSP_DACBuffer::callback)(s16*, u32);

/* 80289568-8028963C       .text finishDSPFrame__Q28JASystem14TDSP_DACBufferFv */
void JASystem::TDSP_DACBuffer::finishDSPFrame() {
    u8 var2 = writeBuffer + 1;
    u32 frameSamples = Kernel::getFrameSamples();
    if (var2 == numDSPBuf) {
        var2 = 0;
    }
    if (var2 == readBuffer) {
        dspStatus = 0;
        return;
    }
    writeBuffer = var2;
    TAudioThread::snIntCount = Kernel::getSubFrames();
    Kernel::probeStart(7, "DSP-MAIN");
    DsyncFrame2(Kernel::getSubFrames(), u32(dsp_buf[writeBuffer]), u32(&dsp_buf[writeBuffer][frameSamples]));
    dspStatus = 1;
    updateDSP();
    if (callback) {
        callback(dsp_buf[writeBuffer], frameSamples);
    }
}