all repos — mgba @ f9e79a1a4280b99e3abf0a83de005fd33211a539

mGBA Game Boy Advance Emulator

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