summaryrefslogtreecommitdiff
path: root/include/JSystem/JAudio2/JASChannel.h
blob: 54e5201ab1d56327aea20f5cc9c55f2e8cec4f98 (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
#ifndef JASCHANNEL_H
#define JASCHANNEL_H

#include "JSystem/JAudio2/JASHeapCtrl.h"
#include "JSystem/JAudio2/JASLfo.h"
#include "JSystem/JAudio2/JASOscillator.h"
#include "JSystem/JAudio2/JASSoundParams.h"
#include "JSystem/JAudio2/JASWaveInfo.h"
#include "dolphin/os/OSMessage.h"

class JASDSPChannel;

namespace JASDsp {
    struct TChannel;
}

/**
 * @ingroup jsystem-jaudio
 * 
 */
class JASChannelParams {
public:
    JASChannelParams() {
        mVolume = 1.0f;
        mPitch = 1.0f;
        field_0x8 = 0.0f;
        mPan = 0.5f;
        mFxMix = 0.0f;
        mDolby = 0.0f;
    }
    void init() {
        mVolume = 1.0f;
        mPitch = 1.0f;
        field_0x8 = 0.0f;
        mPan = 0.5f;
        mFxMix = 0.0f;
        mDolby = 0.0f;
    }

    /* 0x00 */ f32 mVolume;
    /* 0x04 */ f32 mPitch;
    /* 0x08 */ f32 field_0x8;
    /* 0x0C */ f32 mPan;
    /* 0x10 */ f32 mFxMix;
    /* 0x14 */ f32 mDolby;
};

/**
 * @ingroup jsystem-jaudio
 * 
 */
class JASChannel : public JASPoolAllocObject_MultiThreaded<JASChannel> {
public:
    typedef void (*Callback)(u32, JASChannel*, JASDsp::TChannel*, void*);

    enum CallbackType {
        /* 0 */ CB_PLAY,
        /* 1 */ CB_START,
        /* 2 */ CB_STOP,
        /* 3 */ CB_TIMER,
    };

    enum Status {
        /* 0 */ STATUS_INACTIVE,
        /* 1 */ STATUS_ACTIVE,
        /* 2 */ STATUS_RELEASE,
    };

    struct PanVector {
        /* 0x0 */ f32 mSound;
        /* 0x4 */ f32 mEffect;
        /* 0x8 */ f32 mChannel;
    };

    union MixConfig {
        u16 whole;
        struct {
            u8 upper;
            u8 lower0 : 4;
            u8 lower1 : 4;
        } parts;
    };

    /* 8029A800 */ JASChannel(Callback, void*);
    /* 8029A918 */ ~JASChannel();
    /* 8029A9F0 */ int play();
    /* 8029AA60 */ int playForce();
    /* 8029AAD0 */ void release(u16);
    /* 8029AB64 */ void setOscInit(u32, JASOscillator::Data const*);
    /* 8029AB98 */ void setMixConfig(u32, u16);
    /* 8029ABA8 */ static f32 calcEffect(JASChannel::PanVector const*);
    /* 8029ABC0 */ static f32 calcPan(JASChannel::PanVector const*);
    /* 8029ABEC */ void effectOsc(u32, JASOscillator::EffectParams*);
    /* 8029ACD4 */ void setKeySweepTarget(s32, u32);
    /* 8029AD38 */ void updateEffectorParam(JASDsp::TChannel*, u16*,
                                            JASOscillator::EffectParams const&);
    /* 8029AF78 */ static s32 dspUpdateCallback(u32, JASDsp::TChannel*, void*);
    /* 8029B004 */ s32 initialUpdateDSPChannel(JASDsp::TChannel*);
    /* 8029B324 */ s32 updateDSPChannel(JASDsp::TChannel*);
    /* 8029B6A0 */ void updateAutoMixer(JASDsp::TChannel*, f32, f32, f32, f32);
    /* 8029B7D8 */ void updateMixer(f32, f32, f32, f32, u16*);
    /* 8029BBFC */ void free();
    /* 8029BC0C */ static void initBankDisposeMsgQueue();
    /* 8029BC48 */ static void receiveBankDisposeMsg();
    /* 8029BCC0 */ bool checkBankDispose() const;

    void setPauseFlag(bool param_0) { mPauseFlag = param_0; }
    void setUpdateTimer(u32 param_0) { mUpdateTimer = param_0; }
    void setBankDisposeID(const void* param_0) { mBankDisposeID = param_0; }
    void setDirectRelease(u16 param_0) { mOscillators[0].setDirectRelease(param_0); }
    void setVibrate(f32 param_0, f32 param_1) {
        mVibrate.setDepth(param_0);
        mVibrate.setPitch(param_1);
    }
    void setVibrateDelay(u16 param_0) { mVibrate.setDelay(param_0); }
    void setTremolo(f32 param_0, f32 param_1) {
        mTremolo.setDepth(param_0);
        mTremolo.setPitch(param_1);
    }
    void setTremoloDelay(u16 param_0) { mTremolo.setDelay(param_0); }
    void setPriority(u16 param_0) { mPriority = param_0; }
    void setParams(const JASChannelParams& param_0) { mParams = param_0; }
    void setInitVolume(f32 param_0) { mSoundParams.mVolume = param_0; }
    void setInitFxmix(f32 param_0) { mSoundParams.mFxMix = param_0; }
    void setInitPitch(f32 param_0) { mSoundParams.mPitch = param_0; }
    void setInitPan(f32 param_0) { mSoundParams.mPan = param_0; }
    void setInitDolby(f32 param_0) { mSoundParams.mDolby = param_0; }
    void setKey(s32 param_0) { mKey = param_0; }
    void setVelocity(u32 param_0) { mVelocity = param_0; }
    void setSkipSamples(u32 param_0) { mSkipSamples = param_0; }
    bool isDolbyMode() { return mMixConfig[0].whole == 0xffff; }

    /* 0x00 */ int mStatus;
    /* 0x04 */ bool mPauseFlag;
    /* 0x08 */ JASDSPChannel* mDspCh;
    /* 0x0C */ Callback mCallback;
    /* 0x10 */ void* mCallbackData;
    /* 0x14 */ u32 mUpdateTimer;
    /* 0x18 */ const void* mBankDisposeID;
    /* 0x1C */ JASOscillator mOscillators[2];
    /* 0x5C */ JASLfo mVibrate;
    /* 0x74 */ JASLfo mTremolo;
    /* 0x8C */ MixConfig mMixConfig[6];
    /* 0x98 */ u16 mPriority;
    /* 0x9C */ JASChannelParams mParams;
    /* 0xB4 */ JASSoundParams mSoundParams;
    /* 0xC8 */ s16 mKey;
    /* 0xCA */ u16 mVelocity;
    /* 0xCC */ f32 mKeySweep;
    /* 0xD0 */ f32 mKeySweepTarget;
    /* 0xD4 */ u32 mKeySweepCount;
    /* 0xD8 */ u32 mSkipSamples;
    struct {
        u32 field_0x0;
        JASWaveInfo field_0x4;
    } field_0xdc;
    int field_0x104;

    static OSMessageQueue sBankDisposeMsgQ;
    static OSMessage sBankDisposeMsg[16];
    static OSMessage sBankDisposeList[16];
    static int sBankDisposeListSize;
};

#endif /* JASCHANNEL_H */