summaryrefslogtreecommitdiff
path: root/include/JSystem/JAudio2/JASAramStream.h
blob: 5b9e0969d4307666126c7025c1b52269bab5a30c (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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#ifndef JASARAMSTREAM_H
#define JASARAMSTREAM_H

#include "JSystem/JAudio2/JASTaskThread.h"
#include "JSystem/JUtility/JUTAssert.h"
#include "dolphin/dvd.h"

class JASChannel;

namespace JASDsp {
    class TChannel;
}

#define CHANNEL_MAX 6

/**
 * @ingroup jsystem-jaudio
 * 
 */
class JASAramStream {
public:
    typedef void (*StreamCallback)(u32, JASAramStream*, void*);

    enum CallbackType {
        /* 0 */ CB_START,
        /* 1 */ CB_STOP,
    };

    // Used internally for passing data to task functions
    struct TaskData {
        /* 0x0 */ JASAramStream* stream;
        /* 0x4 */ u32 field_0x4;
        /* 0x8 */ int field_0x8;
    };

    struct Header {
        /* 0x00 */ u32 tag;
        /* 0x04 */ u8 field_0x4[5];
        /* 0x09 */ u8 format;
        /* 0x0A */ u8 bits;
        /* 0x0C */ u16 channels;
        /* 0x0E */ u16 loop;
        /* 0x10 */ int field_0x10;
        /* 0x14 */ u8 field_0x14[4];
        /* 0x18 */ int loop_start;
        /* 0x1C */ int loop_end;
        /* 0x20 */ u32 block_size;
        /* 0x24 */ u8 field_0x24[4];
        /* 0x28 */ u8 field_0x28;
        /* 0x29 */ u8 field_0x29[0x17];
    };  // Size: 0x40

    struct BlockHeader {
        /* 0x00 */ u32 tag;
        /* 0x04 */ u32 field_0x4;
        /* 0x08 */ struct {
            s16 field_0x0;
            s16 field_0x2;
        } field_0x8[6];
    };  // Size: 0x20

    /* 8029631C */ static void initSystem(u32, u32);
    /* 802963A8 */ JASAramStream();
    /* 8029649C */ void init(u32, u32, StreamCallback, void*);
    /* 8029655C */ bool prepare(s32, int);
    /* 80296618 */ bool start();
    /* 8029664C */ bool stop(u16);
    /* 80296684 */ bool pause(bool);
    /* 802966CC */ bool cancel();
    /* 80296710 */ u32 getBlockSamples() const;
    /* 8029673C */ static void headerLoadTask(void*);
    /* 8029676C */ static void firstLoadTask(void*);
    /* 80296848 */ static void loadToAramTask(void*);
    /* 80296868 */ static void finishTask(void*);
    /* 802968C8 */ static void prepareFinishTask(void*);
    /* 80296920 */ bool headerLoad(u32, int);
    /* 80296AE8 */ bool load();
    /* 80296D74 */ static s32 channelProcCallback(void*);
    /* 80296D94 */ static s32 dvdErrorCheck(void*);
    /* 80296DF0 */ static void channelCallback(u32, JASChannel*, JASDsp::TChannel*, void*);
    /* 80296E2C */ void updateChannel(u32, JASChannel*, JASDsp::TChannel*);
    /* 802974AC */ s32 channelProc();
    /* 80297658 */ void channelStart();
    /* 80297870 */ void channelStop(u16);

    void setPitch(f32 pitch) { mPitch = pitch; }
    void setVolume(f32 volume) { 
        for (int i = 0; i < 6; i++) {
            mChannelVolume[i] = volume; 
        }
    }

    void setPan(f32 pan) { 
        for (int i = 0; i < 6; i++) {
            mChannelPan[i] = pan; 
        }
    }

    void setFxmix(f32 fxMix) { 
        for (int i = 0; i < 6; i++) {
            mChannelFxMix[i] = fxMix; 
        }
    }

    void setDolby(f32 dolby) { 
        for (int i = 0; i < 6; i++) {
            mChannelDolby[i] = dolby; 
        }
    }

    void setChannelVolume(int channel, f32 volume) {
        JUT_ASSERT(290, channel < CHANNEL_MAX);
        mChannelVolume[channel] = volume;
    }

    void setChannelPan(int channel, f32 pan) {
        JUT_ASSERT(296, channel < CHANNEL_MAX);
        mChannelPan[channel] = pan;
    }

    void setChannelFxmix(int channel, f32 fxMix) {
        JUT_ASSERT(302, channel < CHANNEL_MAX);
        mChannelFxMix[channel] = fxMix;
    }

    void setChannelDolby(int channel, f32 dolby) {
        JUT_ASSERT(308, channel < CHANNEL_MAX);
        mChannelDolby[channel] = dolby;
    }

    static u32 getBlockSize() { return sBlockSize; }

    /* 0x000 */ OSMessageQueue field_0x000;
    /* 0x020 */ OSMessageQueue field_0x020;
    /* 0x040 */ void* field_0x040[16];
    /* 0x080 */ void* field_0x080[4];
    /* 0x090 */ JASChannel* mChannels[CHANNEL_MAX];
    /* 0x0A8 */ JASChannel* field_0x0a8;
    /* 0x0AC */ bool field_0x0ac;
    /* 0x0AD */ bool field_0x0ad;
    /* 0x0AE */ u8 field_0x0ae;
    /* 0x0B0 */ int field_0x0b0;
    /* 0x0B4 */ int field_0x0b4;
    /* 0x0B8 */ u32 field_0x0b8;
    /* 0x0BC */ int field_0x0bc;
    /* 0x0C0 */ bool field_0x0c0;
    /* 0x0C4 */ u32 field_0x0c4;
    /* 0x0C8 */ f32 field_0x0c8;
    /* 0x0CC */ DVDFileInfo mDvdFileInfo;
    /* 0x108 */ u32 field_0x108;
    /* 0x10C */ int field_0x10c;
    /* 0x110 */ u32 mBlock;
    /* 0x114 */ u8 field_0x114;
    /* 0x118 */ u32 field_0x118;
    /* 0x11C */ int field_0x11c;
    /* 0x120 */ int field_0x120;
    /* 0x124 */ int field_0x124;
    /* 0x128 */ u16 field_0x128;
    /* 0x12C */ int field_0x12c;
    /* 0x130 */ s16 field_0x130[CHANNEL_MAX];
    /* 0x13C */ s16 field_0x13c[CHANNEL_MAX];
    /* 0x148 */ int field_0x148;
    /* 0x14C */ u32 field_0x14c;
    /* 0x150 */ StreamCallback mCallback;
    /* 0x154 */ void* mCallbackData;
    /* 0x158 */ u16 field_0x158;
    /* 0x15A */ u16 mChannelNum;
    /* 0x15C */ u32 mBufCount;
    /* 0x160 */ u32 field_0x160;
    /* 0x164 */ u32 field_0x164;
    /* 0x168 */ bool mLoop;
    /* 0x16C */ u32 mLoopStart;
    /* 0x170 */ u32 mLoopEnd;
    /* 0x174 */ f32 mVolume;
    /* 0x178 */ f32 mPitch;
    /* 0x17C */ f32 mChannelVolume[CHANNEL_MAX];
    /* 0x194 */ f32 mChannelPan[CHANNEL_MAX];
    /* 0x1AC */ f32 mChannelFxMix[CHANNEL_MAX];
    /* 0x1C4 */ f32 mChannelDolby[CHANNEL_MAX];
    /* 0x1DC */ u16 field_0x1dc[CHANNEL_MAX];

    static JASTaskThread* sLoadThread;
    static u8* sReadBuffer;
    static u32 sBlockSize;
    static u32 sChannelMax;
};

#endif /* JASARAMSTREAM_H */