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

#include "JSystem/JAudio/JASDriverIF.h"
#include "JSystem/JAudio/JASOscillator.h"
#include "JSystem/JSupport/JSUList.h"

namespace JASystem {
    class TChannelMgr;
    class TDSPChannel;
    namespace Driver {
        struct Wave_;
    }

    class TChannel {
    public:
        enum CalcType {
            // NB: haven't seen others used, add from calc_sw_table in JASChannel.cpp if needed
            CALC_None           = 0,
            CALC_AddChannelOnly = 1,
            CALC_AddAll         = 13,
            CALC_WeightAll      = 26,
        };

        union MixConfig {
            u16 mWhole;
            struct {
                u8 u;
                u8 l0 : 4;
                u8 l1 : 4;
            } mParts;
        };

        TChannel() : field_0x4(NULL), field_0x8(NULL), field_0x20(NULL), field_0x24(NULL), field_0xd8(this) {
            for (int i = 0; i < 4; i++) {
                osc[i] = NULL;
            }
        }
        ~TChannel() {}
        void init();
        void setOscillator(u32, TOscillator*);
        void setOscInit(u32, const TOscillator::Osc_*);
        bool forceStopOsc(u32);
        bool releaseOsc(u32);
        void directReleaseOsc(u32, u16);
        f32 bankOscToOfs(u32);
        void effectOsc(u32, f32);
        u8 getOscState(u32) const;
        BOOL isOsc(u32);
        void copyOsc(u32, TOscillator::Osc_*);
        void overwriteOsc(u32, TOscillator::Osc_*);
        void setKeySweepTarget(u8, u32);
        void setPauseFlag(u8);
        void setPauseFlagReq(u8);
        void setPanPower(f32, f32, f32, f32);
        BOOL checkLogicalChannel();
        BOOL play(u32);
        void stop(u16);
        void updateJcToDSP();
        bool forceStopLogicalChannel();
        BOOL stopLogicalChannel();
        BOOL playLogicalChannel();
        void updateEffectorParam();
        static void killBrokenLogicalChannels(TDSPChannel*);
        static int updatecallDSPChannel(TDSPChannel*, u32);
        static f32 calcEffect(const Driver::PanMatrix_*, const Driver::PanMatrix_*, u8);
        static f32 calcPan(const Driver::PanMatrix_*, const Driver::PanMatrix_*, u8);
        void updateJcToDSPInit();
        void updateAutoMixer(f32, f32, f32, f32);
        void updateMixer(f32, f32, f32, f32);
        static u32 extraUpdate(TChannel*, u32);
        static BOOL updatecallLogicalChannel(TChannel*, u32);

        u8 getNoteOnPriority() const { return field_0x48; }
        u8 getReleasePriority() const { return field_0x48 >> 8; }
        u8 getLifeTimePriority() const { return field_0x48 >> 0x10; }

        // TODO
        void setSkipSamples(u32) {}

        /* 0x00 */ u8 field_0x0;
        /* 0x01 */ u8 field_0x1;
        /* 0x02 */ u8 mPauseFlag;
        /* 0x03 */ u8 field_0x3;
        /* 0x04 */ TChannelMgr* field_0x4;
        /* 0x08 */ TChannel** field_0x8;
        /* 0x0C */ u8 field_0xc;
        /* 0x10 */ Driver::Wave_* field_0x10;
        /* 0x14 */ int field_0x14;
        /* 0x18 */ int field_0x18;
        /* 0x1C */ int field_0x1c;
        /* 0x20 */ TDSPChannel* field_0x20;
        /* 0x24 */ TChannel* field_0x24;
        /* 0x28 */ BOOL (*field_0x28)(TChannel*, u32);
        /* 0x2C */ u32 (*field_0x2c)(TChannel*, u32);
        /* 0x30 */ int field_0x30;
        /* 0x34 */ s32 field_0x34;
        /* 0x38 */ TOscillator* osc[4];
        /* 0x48 */ u32 field_0x48;
        /* 0x4C */ u16 field_0x4c;
        /* 0x50 */ f32 field_0x50;
        /* 0x54 */ f32 field_0x54;
        /* 0x58 */ f32 field_0x58;
        /* 0x5C */ f32 field_0x5c;
        /* 0x60 */ u8 mCalcTypes[3]; // Pan, FxMix, ?
        /* 0x64 */ Driver::PanMatrix_ mPanPower;
        /* 0x70 */ Driver::PanMatrix_ mPanVec;
        /* 0x7C */ Driver::PanMatrix_ mFxmixVec;
        /* 0x88 */ Driver::PanMatrix_ mDolbyVec;
        /* 0x94 */ f32 field_0x94;
        /* 0x98 */ f32 field_0x98;
        /* 0x9C */ f32 field_0x9c;
        /* 0xA0 */ u16 mPitch;
        /* 0xA2 */ u16 field_0xa2;
        /* 0xA4 */ TChannelMgr* field_0xa4;
        /* 0xA8 */ f32 field_0xa8;
        /* 0xAC */ f32 field_0xac;
        /* 0xB0 */ MixConfig mMixConfigs[6];
        /* 0xBC */ u16 field_0xbc[6];
        /* 0xC8 */ u16 field_0xc8;
        /* 0xCC */ int field_0xcc;
        /* 0xD0 */ int field_0xd0;
        /* 0xD4 */ int field_0xd4;
        /* 0xD8 */ JSULink<TChannel> field_0xd8;
        /* 0xE8 */ u32 field_0xe8;
    };
}

#endif /* JASCHANNEL_H */