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