all repos — mgba @ 7149dd3102a6bbb7f73cae7da0c01dc784b0f601

mGBA Game Boy Advance Emulator

src/gba/audio.h (view raw)

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