all repos — mgba @ 71ec6162f11ab51bb159af78a9a3a84538189cb6

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 "circle-buffer.h"
  5
  6#include <stdint.h>
  7
  8struct GBADMA;
  9
 10union GBAAudioWave {
 11	struct {
 12		unsigned length : 6;
 13		unsigned duty : 2;
 14		unsigned stepTime : 3;
 15		unsigned direction : 1;
 16		unsigned initialVolume : 4;
 17	};
 18	uint16_t packed;
 19};
 20
 21union GBAAudioSquareControl {
 22	struct {
 23		unsigned frequency : 11;
 24		unsigned : 3;
 25		unsigned stop : 1;
 26		unsigned restart : 1;
 27	};
 28	uint16_t packed;
 29};
 30
 31struct GBAAudioChannel1 {
 32	union GBAAudioSquareSweep {
 33		struct {
 34			unsigned shift : 3;
 35			unsigned direction : 1;
 36			unsigned time : 3;
 37			unsigned : 9;
 38		};
 39		uint16_t packed;
 40	} sweep;
 41
 42	union GBAAudioWave wave;
 43	union GBAAudioSquareControl control;
 44};
 45
 46struct GBAAudioChannel2 {
 47	union GBAAudioWave wave;
 48	union GBAAudioSquareControl control;
 49};
 50
 51struct GBAAudioChannel3 {
 52	union {
 53		struct {
 54			unsigned : 5;
 55			unsigned size : 1;
 56			unsigned bank : 1;
 57			unsigned disable : 1;
 58			unsigned : 7;
 59		};
 60		uint16_t packed;
 61	} bank;
 62
 63	union {
 64		struct {
 65			unsigned length : 8;
 66			unsigned : 5;
 67			unsigned volume : 3;
 68			unsigned disable : 1;
 69			unsigned : 7;
 70		};
 71		uint16_t packed;
 72	} wave;
 73
 74	union {
 75		struct {
 76			unsigned rate : 11;
 77			unsigned : 3;
 78			unsigned stop : 1;
 79			unsigned restart : 1;
 80		};
 81		uint16_t packed;
 82	} control;
 83};
 84
 85struct GBAAudioChannel4 {
 86	union GBAAudioWave wave;
 87	union {
 88		struct {
 89			unsigned ratio : 3;
 90			unsigned power : 1;
 91			unsigned frequency : 4;
 92			unsigned : 6;
 93			unsigned stop : 1;
 94			unsigned restart : 1;
 95		};
 96		uint16_t packed;
 97	} control;
 98};
 99
100struct GBAAudioFIFO {
101	struct CircleBuffer fifo;
102	int dmaSource;
103	int32_t sample;
104};
105
106struct GBAAudio {
107	struct GBA* p;
108
109	struct GBAAudioChannel1 ch1;
110	struct GBAAudioChannel2 ch2;
111	struct GBAAudioChannel3 ch3;
112	struct GBAAudioChannel4 ch4;
113
114	struct GBAAudioFIFO chA;
115	struct GBAAudioFIFO chB;
116
117	struct CircleBuffer left;
118	struct CircleBuffer right;
119
120	union {
121		struct {
122			unsigned volumeRight : 3;
123			unsigned : 1;
124			unsigned volumeLeft : 3;
125			unsigned : 1;
126			unsigned ch1Right : 1;
127			unsigned ch2Right : 1;
128			unsigned ch3Right : 1;
129			unsigned ch4Right : 1;
130			unsigned ch1Left : 1;
131			unsigned ch2Left : 1;
132			unsigned ch3Left : 1;
133			unsigned ch4Left : 1;
134		};
135		uint16_t soundcntLo;
136	};
137
138	union {
139		struct {
140			unsigned volume : 2;
141			unsigned volumeDmaA : 1;
142			unsigned volumeDmaB : 1;
143			unsigned : 4;
144			unsigned dmaARight : 1;
145			unsigned dmaALeft : 1;
146			unsigned dmaATimer : 1;
147			unsigned dmaAReset : 1;
148			unsigned dmaBRight : 1;
149			unsigned dmaBLeft : 1;
150			unsigned dmaBTimer : 1;
151			unsigned dmaBReset : 1;
152		};
153		uint16_t soundcntHi;
154	};
155
156	union {
157		struct {
158			unsigned playingCh1 : 1;
159			unsigned playingCh2 : 1;
160			unsigned playingCh3 : 1;
161			unsigned playingCh4 : 1;
162			unsigned : 3;
163			unsigned enable : 1;
164			unsigned : 8;
165		};
166		uint16_t soundcntX;
167	};
168
169	unsigned sampleRate;
170
171	int32_t nextEvent;
172	int32_t eventDiff;
173	int32_t nextSample;
174
175	int32_t sampleInterval;
176};
177
178void GBAAudioInit(struct GBAAudio* audio);
179void GBAAudioDeinit(struct GBAAudio* audio);
180
181int32_t GBAAudioProcessEvents(struct GBAAudio* audio, int32_t cycles);
182void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info);
183
184void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
185void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
186void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
187void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
188void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
189void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
190void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
191void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
192void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
193void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
194void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
195void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
196void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
197
198void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
199void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
200void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId);
201
202#endif