all repos — mgba @ 4a0a46267318e19e747674695f04b759a2dda752

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