src/gba/gba-audio.h (view raw)
1#ifndef GBA_AUDIO_H
2#define GBA_AUDIO_H
3
4#include "common.h"
5
6#include "util/circle-buffer.h"
7
8struct GBADMA;
9
10extern const unsigned GBA_AUDIO_SAMPLES;
11
12DECL_BITFIELD(GBAAudioRegisterEnvelope, uint16_t);
13DECL_BITS(GBAAudioRegisterEnvelope, Length, 0, 6);
14DECL_BITS(GBAAudioRegisterEnvelope, Duty, 6, 2);
15DECL_BITS(GBAAudioRegisterEnvelope, StepTime, 8, 3);
16DECL_BIT(GBAAudioRegisterEnvelope, Direction, 11);
17DECL_BITS(GBAAudioRegisterEnvelope, InitialVolume, 12, 4);
18
19DECL_BITFIELD(GBAAudioRegisterControl, uint16_t);
20DECL_BITS(GBAAudioRegisterControl, Rate, 0, 11);
21DECL_BITS(GBAAudioRegisterControl, Frequency, 0, 11);
22DECL_BIT(GBAAudioRegisterControl, Stop, 14);
23DECL_BIT(GBAAudioRegisterControl, Restart, 15);
24
25DECL_BITFIELD(GBAAudioRegisterSquareSweep, uint16_t);
26DECL_BITS(GBAAudioRegisterSquareSweep, Shift, 0, 3);
27DECL_BIT(GBAAudioRegisterSquareSweep, Direction, 3);
28DECL_BITS(GBAAudioRegisterSquareSweep, Time, 4, 3);
29
30DECL_BITFIELD(GBAAudioRegisterBank, uint16_t);
31DECL_BIT(GBAAudioRegisterBank, Size, 5);
32DECL_BIT(GBAAudioRegisterBank, Bank, 6);
33DECL_BIT(GBAAudioRegisterBank, Enable, 7);
34
35DECL_BITFIELD(GBAAudioRegisterBankWave, uint16_t);
36DECL_BITS(GBAAudioRegisterBankWave, Length, 0, 8);
37DECL_BITS(GBAAudioRegisterBankWave, Volume, 13, 3);
38
39DECL_BITFIELD(GBAAudioRegisterCh4Control, uint16_t);
40DECL_BITS(GBAAudioRegisterCh4Control, Ratio, 0, 3);
41DECL_BIT(GBAAudioRegisterCh4Control, Power, 3);
42DECL_BITS(GBAAudioRegisterCh4Control, Frequency, 4, 4);
43DECL_BIT(GBAAudioRegisterCh4Control, Stop, 14);
44DECL_BIT(GBAAudioRegisterCh4Control, Restart, 15);
45
46struct GBAAudioEnvelope {
47 uint8_t length;
48 uint8_t duty;
49 uint8_t stepTime;
50 uint8_t initialVolume;
51 bool direction;
52 int currentVolume;
53 int dead;
54 int32_t nextStep;
55};
56
57struct GBAAudioSquareControl {
58 uint16_t frequency;
59 bool stop;
60 int hi;
61 int32_t nextStep;
62 int32_t endTime;
63};
64
65struct GBAAudioChannel1 {
66 struct GBAAudioSquareSweep {
67 uint8_t shift;
68 uint8_t time;
69 bool direction;
70 } sweep;
71 int32_t nextSweep;
72
73 struct GBAAudioEnvelope envelope;
74 struct GBAAudioSquareControl control;
75 int8_t sample;
76};
77
78struct GBAAudioChannel2 {
79 struct GBAAudioEnvelope envelope;
80 struct GBAAudioSquareControl control;
81 int8_t sample;
82};
83
84struct GBAAudioChannel3 {
85 struct {
86 bool size;
87 bool bank;
88 bool enable;
89 } bank;
90
91 struct {
92 uint8_t length;
93 uint8_t volume;
94 } wave;
95
96 struct {
97 uint16_t rate;
98 bool stop;
99 int32_t endTime;
100 } control;
101
102 uint32_t wavedata[8];
103 int8_t sample;
104};
105
106struct GBAAudioChannel4 {
107 struct GBAAudioEnvelope envelope;
108
109 struct {
110 uint8_t ratio;
111 uint8_t frequency;
112 bool power;
113 bool stop;
114 int32_t endTime;
115 } control;
116
117 unsigned lfsr;
118 int8_t sample;
119};
120
121struct GBAAudioFIFO {
122 struct CircleBuffer fifo;
123 int dmaSource;
124 int8_t sample;
125};
126
127DECL_BITFIELD(GBARegisterSOUNDCNT_LO, uint16_t);
128DECL_BITS(GBARegisterSOUNDCNT_LO, VolumeRight, 0, 3);
129DECL_BITS(GBARegisterSOUNDCNT_LO, VolumeLeft, 4, 3);
130DECL_BIT(GBARegisterSOUNDCNT_LO, Ch1Right, 8);
131DECL_BIT(GBARegisterSOUNDCNT_LO, Ch2Right, 9);
132DECL_BIT(GBARegisterSOUNDCNT_LO, Ch3Right, 10);
133DECL_BIT(GBARegisterSOUNDCNT_LO, Ch4Right, 11);
134DECL_BIT(GBARegisterSOUNDCNT_LO, Ch1Left, 12);
135DECL_BIT(GBARegisterSOUNDCNT_LO, Ch2Left, 13);
136DECL_BIT(GBARegisterSOUNDCNT_LO, Ch3Left, 14);
137DECL_BIT(GBARegisterSOUNDCNT_LO, Ch4Left, 15);
138
139DECL_BITFIELD(GBARegisterSOUNDCNT_HI, uint16_t);
140DECL_BITS(GBARegisterSOUNDCNT_HI, Volume, 0, 2);
141DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChA, 2);
142DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChB, 3);
143DECL_BIT(GBARegisterSOUNDCNT_HI, ChARight, 8);
144DECL_BIT(GBARegisterSOUNDCNT_HI, ChALeft, 9);
145DECL_BIT(GBARegisterSOUNDCNT_HI, ChATimer, 10);
146DECL_BIT(GBARegisterSOUNDCNT_HI, ChAReset, 11);
147DECL_BIT(GBARegisterSOUNDCNT_HI, ChBRight, 12);
148DECL_BIT(GBARegisterSOUNDCNT_HI, ChBLeft, 13);
149DECL_BIT(GBARegisterSOUNDCNT_HI, ChBTimer, 14);
150DECL_BIT(GBARegisterSOUNDCNT_HI, ChBReset, 15);
151
152DECL_BITFIELD(GBARegisterSOUNDCNT_X, uint16_t);
153DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh1, 0);
154DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh2, 1);
155DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh3, 2);
156DECL_BIT(GBARegisterSOUNDCNT_X, PlayingCh4, 3);
157DECL_BIT(GBARegisterSOUNDCNT_X, Enable, 7);
158
159struct GBAAudio {
160 struct GBA* p;
161
162 struct GBAAudioChannel1 ch1;
163 struct GBAAudioChannel2 ch2;
164 struct GBAAudioChannel3 ch3;
165 struct GBAAudioChannel4 ch4;
166
167 struct GBAAudioFIFO chA;
168 struct GBAAudioFIFO chB;
169
170 struct CircleBuffer left;
171 struct CircleBuffer right;
172
173 uint8_t volumeRight;
174 uint8_t volumeLeft;
175 bool ch1Right;
176 bool ch2Right;
177 bool ch3Right;
178 bool ch4Right;
179 bool ch1Left;
180 bool ch2Left;
181 bool ch3Left;
182 bool ch4Left;
183
184 uint8_t volume;
185 bool volumeChA;
186 bool volumeChB;
187 bool chARight;
188 bool chALeft;
189 bool chATimer;
190 bool chBRight;
191 bool chBLeft;
192 bool chBTimer;
193
194 bool playingCh1;
195 bool playingCh2;
196 bool playingCh3;
197 bool playingCh4;
198 bool enable;
199
200 unsigned sampleRate;
201
202 union {
203 struct {
204 unsigned bias : 10;
205 unsigned : 4;
206 unsigned resolution : 2;
207 };
208 uint16_t soundbias;
209 };
210
211 int32_t nextEvent;
212 int32_t eventDiff;
213 int32_t nextCh1;
214 int32_t nextCh2;
215 int32_t nextCh3;
216 int32_t nextCh4;
217 int32_t nextSample;
218
219 int32_t sampleInterval;
220};
221
222struct GBAStereoSample {
223 int16_t left;
224 int16_t right;
225};
226
227void GBAAudioInit(struct GBAAudio* audio, size_t samples);
228void GBAAudioReset(struct GBAAudio* audio);
229void GBAAudioDeinit(struct GBAAudio* audio);
230
231void GBAAudioResizeBuffer(struct GBAAudio* audio, size_t samples);
232
233int32_t GBAAudioProcessEvents(struct GBAAudio* audio, int32_t cycles);
234void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info);
235
236void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
237void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
238void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
239void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
240void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
241void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
242void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
243void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
244void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
245void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
246void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
247void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
248void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
249void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value);
250
251void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
252void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
253void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId, int32_t cycles);
254
255unsigned GBAAudioCopy(struct GBAAudio* audio, void* left, void* right, unsigned nSamples);
256unsigned GBAAudioResampleNN(struct GBAAudio*, float ratio, float* drift, struct GBAStereoSample* output, unsigned nSamples);
257
258struct GBASerializedState;
259void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* state);
260void GBAAudioDeserialize(struct GBAAudio* audio, const struct GBASerializedState* state);
261
262float GBAAudioCalculateRatio(struct GBAAudio* audio, float desiredFPS, float desiredSampleRatio);
263
264#endif