all repos — mgba @ da3802765454719c0fed68ee04589db81ad2bb73

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