src/gba/gba-audio.h (view raw)
1#ifndef GBA_AUDIO_H
2#define GBA_AUDIO_H
3
4#include "circle-buffer.h"
5
6#include <stdint.h>
7
8struct GBADMA;
9
10const unsigned GBA_AUDIO_SAMPLES;
11
12union GBAAudioWave {
13 struct {
14 unsigned length : 6;
15 unsigned duty : 2;
16 unsigned stepTime : 3;
17 unsigned direction : 1;
18 unsigned initialVolume : 4;
19 };
20 uint16_t packed;
21};
22
23union GBAAudioSquareControl {
24 struct {
25 unsigned frequency : 11;
26 unsigned : 3;
27 unsigned stop : 1;
28 unsigned restart : 1;
29 };
30 uint16_t packed;
31};
32
33struct GBAAudioChannel1 {
34 union GBAAudioSquareSweep {
35 struct {
36 unsigned shift : 3;
37 unsigned direction : 1;
38 unsigned time : 3;
39 unsigned : 9;
40 };
41 uint16_t packed;
42 } sweep;
43
44 union GBAAudioWave wave;
45 union GBAAudioSquareControl control;
46};
47
48struct GBAAudioChannel2 {
49 union GBAAudioWave wave;
50 union GBAAudioSquareControl control;
51};
52
53struct GBAAudioChannel3 {
54 union {
55 struct {
56 unsigned : 5;
57 unsigned size : 1;
58 unsigned bank : 1;
59 unsigned disable : 1;
60 unsigned : 7;
61 };
62 uint16_t packed;
63 } bank;
64
65 union {
66 struct {
67 unsigned length : 8;
68 unsigned : 5;
69 unsigned volume : 3;
70 unsigned disable : 1;
71 unsigned : 7;
72 };
73 uint16_t packed;
74 } wave;
75
76 union {
77 struct {
78 unsigned rate : 11;
79 unsigned : 3;
80 unsigned stop : 1;
81 unsigned restart : 1;
82 };
83 uint16_t packed;
84 } control;
85};
86
87struct GBAAudioChannel4 {
88 union GBAAudioWave wave;
89 union {
90 struct {
91 unsigned ratio : 3;
92 unsigned power : 1;
93 unsigned frequency : 4;
94 unsigned : 6;
95 unsigned stop : 1;
96 unsigned restart : 1;
97 };
98 uint16_t packed;
99 } control;
100};
101
102struct GBAAudioFIFO {
103 struct CircleBuffer fifo;
104 int dmaSource;
105 int8_t sample;
106};
107
108struct GBAAudio {
109 struct GBA* p;
110
111 struct GBAAudioChannel1 ch1;
112 struct GBAAudioChannel2 ch2;
113 struct GBAAudioChannel3 ch3;
114 struct GBAAudioChannel4 ch4;
115
116 struct GBAAudioFIFO chA;
117 struct GBAAudioFIFO chB;
118
119 struct CircleBuffer left;
120 struct CircleBuffer right;
121
122 union {
123 struct {
124 unsigned volumeRight : 3;
125 unsigned : 1;
126 unsigned volumeLeft : 3;
127 unsigned : 1;
128 unsigned ch1Right : 1;
129 unsigned ch2Right : 1;
130 unsigned ch3Right : 1;
131 unsigned ch4Right : 1;
132 unsigned ch1Left : 1;
133 unsigned ch2Left : 1;
134 unsigned ch3Left : 1;
135 unsigned ch4Left : 1;
136 };
137 uint16_t soundcntLo;
138 };
139
140 union {
141 struct {
142 unsigned volume : 2;
143 unsigned volumeChA : 1;
144 unsigned volumeChB : 1;
145 unsigned : 4;
146 unsigned chARight : 1;
147 unsigned chALeft : 1;
148 unsigned chATimer : 1;
149 unsigned chAReset : 1;
150 unsigned chBRight : 1;
151 unsigned chBLeft : 1;
152 unsigned chBTimer : 1;
153 unsigned chBReset : 1;
154 };
155 uint16_t soundcntHi;
156 };
157
158 union {
159 struct {
160 unsigned playingCh1 : 1;
161 unsigned playingCh2 : 1;
162 unsigned playingCh3 : 1;
163 unsigned playingCh4 : 1;
164 unsigned : 3;
165 unsigned enable : 1;
166 unsigned : 8;
167 };
168 uint16_t soundcntX;
169 };
170
171 unsigned sampleRate;
172
173 int32_t nextEvent;
174 int32_t eventDiff;
175 int32_t nextSample;
176
177 int32_t sampleInterval;
178};
179
180void GBAAudioInit(struct GBAAudio* audio);
181void GBAAudioDeinit(struct GBAAudio* audio);
182
183int32_t GBAAudioProcessEvents(struct GBAAudio* audio, int32_t cycles);
184void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info);
185
186void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
187void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
188void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
189void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
190void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
191void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
192void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
193void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
194void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
195void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
196void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
197void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
198void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
199
200void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
201void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
202void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId);
203
204#endif