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