all repos — mgba @ a9e0935af8815099b51c1b0933aacf1aa4ce8687

mGBA Game Boy Advance Emulator

include/mgba/internal/gba/audio.h (view raw)

  1/* Copyright (c) 2013-2016 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 <mgba-util/common.h>
 10
 11CXX_GUARD_START
 12
 13#include <mgba/core/cpu.h>
 14#include <mgba/core/log.h>
 15#include <mgba/internal/gb/audio.h>
 16#include <mgba-util/circle-buffer.h>
 17
 18#define MP2K_MAGIC 0x68736D53
 19#define MP2K_MAX_SOUND_CHANNELS 12
 20
 21mLOG_DECLARE_CATEGORY(GBA_AUDIO);
 22
 23struct GBADMA;
 24
 25extern const unsigned GBA_AUDIO_SAMPLES;
 26extern const int GBA_AUDIO_VOLUME_MAX;
 27
 28struct GBAAudioFIFO {
 29	struct CircleBuffer fifo;
 30	int dmaSource;
 31	int8_t sample;
 32};
 33
 34DECL_BITFIELD(GBARegisterSOUNDCNT_HI, uint16_t);
 35DECL_BITS(GBARegisterSOUNDCNT_HI, Volume, 0, 2);
 36DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChA, 2);
 37DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChB, 3);
 38DECL_BIT(GBARegisterSOUNDCNT_HI, ChARight, 8);
 39DECL_BIT(GBARegisterSOUNDCNT_HI, ChALeft, 9);
 40DECL_BIT(GBARegisterSOUNDCNT_HI, ChATimer, 10);
 41DECL_BIT(GBARegisterSOUNDCNT_HI, ChAReset, 11);
 42DECL_BIT(GBARegisterSOUNDCNT_HI, ChBRight, 12);
 43DECL_BIT(GBARegisterSOUNDCNT_HI, ChBLeft, 13);
 44DECL_BIT(GBARegisterSOUNDCNT_HI, ChBTimer, 14);
 45DECL_BIT(GBARegisterSOUNDCNT_HI, ChBReset, 15);
 46
 47DECL_BITFIELD(GBARegisterSOUNDBIAS, uint16_t);
 48DECL_BITS(GBARegisterSOUNDBIAS, Bias, 0, 10);
 49DECL_BITS(GBARegisterSOUNDBIAS, Resolution, 14, 2);
 50
 51struct GBAAudioMixer;
 52struct GBAAudio {
 53	struct GBA* p;
 54
 55	struct GBAudio psg;
 56	struct GBAAudioFIFO chA;
 57	struct GBAAudioFIFO chB;
 58
 59	int16_t lastLeft;
 60	int16_t lastRight;
 61	int clock;
 62
 63	uint8_t volume;
 64	bool volumeChA;
 65	bool volumeChB;
 66	bool chARight;
 67	bool chALeft;
 68	bool chATimer;
 69	bool chBRight;
 70	bool chBLeft;
 71	bool chBTimer;
 72	bool enable;
 73
 74	size_t samples;
 75	unsigned sampleRate;
 76
 77	GBARegisterSOUNDBIAS soundbias;
 78
 79	struct GBAAudioMixer* mixer;
 80	bool externalMixing;
 81	int32_t sampleInterval;
 82
 83	bool forceDisableChA;
 84	bool forceDisableChB;
 85	int masterVolume;
 86
 87	struct mTimingEvent sampleEvent;
 88};
 89
 90struct GBAStereoSample {
 91	int16_t left;
 92	int16_t right;
 93};
 94
 95struct GBAMP2kADSR {
 96	uint8_t attack;
 97	uint8_t decay;
 98	uint8_t sustain;
 99	uint8_t release;
100};
101
102struct GBAMP2kSoundChannel {
103	uint8_t status;
104	uint8_t type;
105	uint8_t rightVolume;
106	uint8_t leftVolume;
107	struct GBAMP2kADSR adsr;
108	uint8_t ky;
109	uint8_t envelopeV;
110	uint8_t envelopeRight;
111	uint8_t envelopeLeft;
112	uint8_t echoVolume;
113	uint8_t echoLength;
114	uint8_t d1;
115	uint8_t d2;
116	uint8_t gt;
117	uint8_t midiKey;
118	uint8_t ve;
119	uint8_t pr;
120	uint8_t rp;
121	uint8_t d3[3];
122	uint32_t ct;
123	uint32_t fw;
124	uint32_t freq;
125	uint32_t waveData;
126	uint32_t cp;
127	uint32_t track;
128	uint32_t pp;
129	uint32_t np;
130	uint32_t d4;
131	uint16_t xpi;
132	uint16_t xpc;
133};
134
135struct GBAMP2kContext {
136	uint32_t magic;
137	uint8_t pcmDmaCounter;
138	uint8_t reverb;
139	uint8_t maxChans;
140	uint8_t masterVolume;
141	uint8_t freq;
142	uint8_t mode;
143	uint8_t c15;
144	uint8_t pcmDmaPeriod;
145	uint8_t maxLines;
146	uint8_t gap[3];
147	int32_t pcmSamplesPerVBlank;
148	int32_t pcmFreq;
149	int32_t divFreq;
150	uint32_t cgbChans;
151	uint32_t func;
152	uint32_t intp;
153	uint32_t cgbSound;
154	uint32_t cgbOscOff;
155	uint32_t midiKeyToCgbFreq;
156	uint32_t mPlayJumpTable;
157	uint32_t plynote;
158	uint32_t extVolPit;
159	uint8_t gap2[16];
160	struct GBAMP2kSoundChannel chans[MP2K_MAX_SOUND_CHANNELS];
161};
162
163struct GBAMP2kMusicPlayerInfo {
164	uint32_t songHeader;
165	uint32_t status;
166	uint8_t trackCount;
167	uint8_t priority;
168	uint8_t cmd;
169	uint8_t unk_B;
170	uint32_t clock;
171	uint8_t gap[8];
172	uint32_t memAccArea;
173	uint16_t tempoD;
174	uint16_t tempoU;
175	uint16_t tempoI;
176	uint16_t tempoC;
177	uint16_t fadeOI;
178	uint16_t fadeOC;
179	uint16_t fadeOV;
180	uint32_t tracks;
181	uint32_t tone;
182	uint32_t magic;
183	uint32_t func;
184	uint32_t intp;
185};
186
187struct GBAMP2kInstrument {
188	uint8_t type;
189	uint8_t key;
190	uint8_t length;
191	union {
192		uint8_t pan;
193		uint8_t sweep;
194	} ps;
195	union {
196		uint32_t waveData;
197		uint32_t subTable;
198	} data;
199	union {
200		struct GBAMP2kADSR adsr;
201		uint32_t map;
202	} extInfo;
203};
204
205struct GBAMP2kMusicPlayerTrack {
206	uint8_t flags;
207	uint8_t wait;
208	uint8_t patternLevel;
209	uint8_t repN;
210	uint8_t gateTime;
211	uint8_t key;
212	uint8_t velocity;
213	uint8_t runningStatus;
214	uint8_t keyM;
215	uint8_t pitM;
216	int8_t keyShift;
217	int8_t keyShiftX;
218	int8_t tune;
219	uint8_t pitX;
220	int8_t bend;
221	uint8_t bendRange;
222	uint8_t volMR;
223	uint8_t volML;
224	uint8_t vol;
225	uint8_t volX;
226	int8_t pan;
227	int8_t panX;
228	int8_t modM;
229	uint8_t mod;
230	uint8_t modT;
231	uint8_t lfoSpeed;
232	uint8_t lfoSpeedC;
233	uint8_t lfoDelay;
234	uint8_t lfoDelayC;
235	uint8_t priority;
236	uint8_t echoVolume;
237	uint8_t echoLength;
238	uint32_t chan;
239	struct GBAMP2kInstrument instrument;
240	uint8_t gap[10];
241	uint16_t unk_3A;
242	uint32_t unk_3C;
243	uint32_t cmdPtr;
244	uint32_t patternStack[3];
245};
246
247struct GBAMP2kTrack {
248	struct GBAMP2kMusicPlayerTrack track;
249	struct GBAMP2kSoundChannel* channel;
250	uint8_t lastCommand;
251	struct CircleBuffer buffer;
252	uint32_t samplePlaying;
253	float currentOffset;
254	bool waiting;
255};
256
257struct GBAAudioMixer {
258	struct mCPUComponent d;
259	struct GBAAudio* p;
260
261	uint32_t contextAddress;
262
263	bool (*engage)(struct GBAAudioMixer* mixer, uint32_t address);
264	void (*vblank)(struct GBAAudioMixer* mixer);
265	void (*step)(struct GBAAudioMixer* mixer);
266
267	struct GBAMP2kContext context;
268	struct GBAMP2kMusicPlayerInfo player;
269	struct GBAMP2kTrack activeTracks[MP2K_MAX_SOUND_CHANNELS];
270
271	double tempo;
272	double frame;
273
274	struct GBAStereoSample last;
275};
276
277void GBAAudioInit(struct GBAAudio* audio, size_t samples);
278void GBAAudioReset(struct GBAAudio* audio);
279void GBAAudioDeinit(struct GBAAudio* audio);
280
281void GBAAudioResizeBuffer(struct GBAAudio* audio, size_t samples);
282
283void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info);
284
285void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
286void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
287void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
288void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
289void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
290void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
291void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
292void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
293void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
294void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
295void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
296void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
297void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
298void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value);
299
300void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
301void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
302void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId, int32_t cycles);
303
304struct GBASerializedState;
305void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* state);
306void GBAAudioDeserialize(struct GBAAudio* audio, const struct GBASerializedState* state);
307
308float GBAAudioCalculateRatio(float inputSampleRate, float desiredFPS, float desiredSampleRatio);
309
310CXX_GUARD_END
311
312#endif