all repos — mgba @ 1dff579ad4a6e5ccb1152b8cddd74975b970b0b3

mGBA Game Boy Advance Emulator

src/gb/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 GB_AUDIO_H
  7#define GB_AUDIO_H
  8
  9#include "util/common.h"
 10
 11#include "core/timing.h"
 12#include "third-party/blip_buf/blip_buf.h"
 13
 14DECL_BITFIELD(GBAudioRegisterDuty, uint8_t);
 15DECL_BITS(GBAudioRegisterDuty, Length, 0, 6);
 16DECL_BITS(GBAudioRegisterDuty, Duty, 6, 2);
 17
 18DECL_BITFIELD(GBAudioRegisterSweep, uint8_t);
 19DECL_BITS(GBAudioRegisterSweep, StepTime, 0, 3);
 20DECL_BIT(GBAudioRegisterSweep, Direction, 3);
 21DECL_BITS(GBAudioRegisterSweep, InitialVolume, 4, 4);
 22
 23DECL_BITFIELD(GBAudioRegisterControl, uint16_t);
 24DECL_BITS(GBAudioRegisterControl, Rate, 0, 11);
 25DECL_BITS(GBAudioRegisterControl, Frequency, 0, 11);
 26DECL_BIT(GBAudioRegisterControl, Stop, 14);
 27DECL_BIT(GBAudioRegisterControl, Restart, 15);
 28
 29DECL_BITFIELD(GBAudioRegisterSquareSweep, uint8_t);
 30DECL_BITS(GBAudioRegisterSquareSweep, Shift, 0, 3);
 31DECL_BIT(GBAudioRegisterSquareSweep, Direction, 3);
 32DECL_BITS(GBAudioRegisterSquareSweep, Time, 4, 3);
 33
 34DECL_BITFIELD(GBAudioRegisterBank, uint8_t);
 35DECL_BIT(GBAudioRegisterBank, Size, 5);
 36DECL_BIT(GBAudioRegisterBank, Bank, 6);
 37DECL_BIT(GBAudioRegisterBank, Enable, 7);
 38
 39DECL_BITFIELD(GBAudioRegisterBankVolume, uint8_t);
 40DECL_BITS(GBAudioRegisterBankVolume, VolumeGB, 5, 2);
 41DECL_BITS(GBAudioRegisterBankVolume, VolumeGBA, 5, 3);
 42
 43DECL_BITFIELD(GBAudioRegisterNoiseFeedback, uint8_t);
 44DECL_BITS(GBAudioRegisterNoiseFeedback, Ratio, 0, 3);
 45DECL_BIT(GBAudioRegisterNoiseFeedback, Power, 3);
 46DECL_BITS(GBAudioRegisterNoiseFeedback, Frequency, 4, 4);
 47
 48DECL_BITFIELD(GBAudioRegisterNoiseControl, uint8_t);
 49DECL_BIT(GBAudioRegisterNoiseControl, Stop, 6);
 50DECL_BIT(GBAudioRegisterNoiseControl, Restart, 7);
 51
 52DECL_BITFIELD(GBRegisterNR50, uint8_t);
 53DECL_BITS(GBRegisterNR50, VolumeRight, 0, 3);
 54DECL_BITS(GBRegisterNR50, VolumeLeft, 4, 3);
 55
 56DECL_BITFIELD(GBRegisterNR51, uint8_t);
 57DECL_BIT(GBRegisterNR51, Ch1Right, 0);
 58DECL_BIT(GBRegisterNR51, Ch2Right, 1);
 59DECL_BIT(GBRegisterNR51, Ch3Right, 2);
 60DECL_BIT(GBRegisterNR51, Ch4Right, 3);
 61DECL_BIT(GBRegisterNR51, Ch1Left, 4);
 62DECL_BIT(GBRegisterNR51, Ch2Left, 5);
 63DECL_BIT(GBRegisterNR51, Ch3Left, 6);
 64DECL_BIT(GBRegisterNR51, Ch4Left, 7);
 65
 66DECL_BITFIELD(GBAudioEnable, uint8_t);
 67DECL_BIT(GBAudioEnable, PlayingCh1, 0);
 68DECL_BIT(GBAudioEnable, PlayingCh2, 1);
 69DECL_BIT(GBAudioEnable, PlayingCh3, 2);
 70DECL_BIT(GBAudioEnable, PlayingCh4, 3);
 71DECL_BIT(GBAudioEnable, Enable, 7);
 72
 73struct GB;
 74struct GBAudioEnvelope {
 75	int length;
 76	int duty;
 77	int stepTime;
 78	int initialVolume;
 79	int currentVolume;
 80	bool direction;
 81	int dead;
 82	int nextStep;
 83};
 84
 85struct GBAudioSquareControl {
 86	int frequency;
 87	int length;
 88	bool stop;
 89	int hi;
 90};
 91
 92struct GBAudioSweep {
 93	int shift;
 94	int time;
 95	int step;
 96	bool direction;
 97	bool enable;
 98	bool occurred;
 99	int realFrequency;
100};
101
102struct GBAudioSquareChannel {
103	struct GBAudioSweep sweep;
104	struct GBAudioEnvelope envelope;
105	struct GBAudioSquareControl control;
106	int8_t sample;
107};
108
109struct GBAudioWaveChannel {
110	bool size;
111	bool bank;
112	bool enable;
113
114	unsigned length;
115	int volume;
116
117	int rate;
118	bool stop;
119
120	int window;
121	bool readable;
122	union {
123		uint32_t wavedata32[8];
124		uint8_t wavedata8[16];
125	};
126	int8_t sample;
127};
128
129struct GBAudioNoiseChannel {
130	struct GBAudioEnvelope envelope;
131
132	int ratio;
133	int frequency;
134	bool power;
135	bool stop;
136	int length;
137
138	uint32_t lfsr;
139	int8_t sample;
140};
141
142enum GBAudioStyle {
143	GB_AUDIO_DMG,
144	GB_AUDIO_CGB,
145	GB_AUDIO_AGB, // GB in GBA
146	GB_AUDIO_GBA, // GBA PSG
147};
148
149struct GBAudio {
150	struct GB* p;
151	struct mTiming* timing;
152	unsigned timingFactor;
153	struct GBAudioSquareChannel ch1;
154	struct GBAudioSquareChannel ch2;
155	struct GBAudioWaveChannel ch3;
156	struct GBAudioNoiseChannel ch4;
157
158	blip_t* left;
159	blip_t* right;
160	int16_t lastLeft;
161	int16_t lastRight;
162	int clock;
163	int32_t clockRate;
164
165	uint8_t volumeRight;
166	uint8_t volumeLeft;
167	bool ch1Right;
168	bool ch2Right;
169	bool ch3Right;
170	bool ch4Right;
171	bool ch1Left;
172	bool ch2Left;
173	bool ch3Left;
174	bool ch4Left;
175
176	bool playingCh1;
177	bool playingCh2;
178	bool playingCh3;
179	bool playingCh4;
180	uint8_t* nr52;
181
182	int frame;
183
184	int32_t sampleInterval;
185	enum GBAudioStyle style;
186
187	struct mTimingEvent frameEvent;
188	struct mTimingEvent ch1Event;
189	struct mTimingEvent ch2Event;
190	struct mTimingEvent ch3Event;
191	struct mTimingEvent ch3Fade;
192	struct mTimingEvent ch4Event;
193	struct mTimingEvent sampleEvent;
194	bool enable;
195
196	size_t samples;
197	bool forceDisableCh[4];
198	int masterVolume;
199};
200
201void GBAudioInit(struct GBAudio* audio, size_t samples, uint8_t* nr52, enum GBAudioStyle style);
202void GBAudioDeinit(struct GBAudio* audio);
203void GBAudioReset(struct GBAudio* audio);
204
205void GBAudioResizeBuffer(struct GBAudio* audio, size_t samples);
206
207void GBAudioWriteNR10(struct GBAudio* audio, uint8_t);
208void GBAudioWriteNR11(struct GBAudio* audio, uint8_t);
209void GBAudioWriteNR12(struct GBAudio* audio, uint8_t);
210void GBAudioWriteNR13(struct GBAudio* audio, uint8_t);
211void GBAudioWriteNR14(struct GBAudio* audio, uint8_t);
212
213void GBAudioWriteNR21(struct GBAudio* audio, uint8_t);
214void GBAudioWriteNR22(struct GBAudio* audio, uint8_t);
215void GBAudioWriteNR23(struct GBAudio* audio, uint8_t);
216void GBAudioWriteNR24(struct GBAudio* audio, uint8_t);
217
218void GBAudioWriteNR30(struct GBAudio* audio, uint8_t);
219void GBAudioWriteNR31(struct GBAudio* audio, uint8_t);
220void GBAudioWriteNR32(struct GBAudio* audio, uint8_t);
221void GBAudioWriteNR33(struct GBAudio* audio, uint8_t);
222void GBAudioWriteNR34(struct GBAudio* audio, uint8_t);
223
224void GBAudioWriteNR41(struct GBAudio* audio, uint8_t);
225void GBAudioWriteNR42(struct GBAudio* audio, uint8_t);
226void GBAudioWriteNR43(struct GBAudio* audio, uint8_t);
227void GBAudioWriteNR44(struct GBAudio* audio, uint8_t);
228
229void GBAudioWriteNR50(struct GBAudio* audio, uint8_t);
230void GBAudioWriteNR51(struct GBAudio* audio, uint8_t);
231void GBAudioWriteNR52(struct GBAudio* audio, uint8_t);
232
233void GBAudioSamplePSG(struct GBAudio* audio, int16_t* left, int16_t* right);
234
235struct GBSerializedPSGState;
236void GBAudioPSGSerialize(const struct GBAudio* audio, struct GBSerializedPSGState* state, uint32_t* flagsOut);
237void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGState* state, const uint32_t* flagsIn);
238
239struct GBSerializedState;
240void GBAudioSerialize(const struct GBAudio* audio, struct GBSerializedState* state);
241void GBAudioDeserialize(struct GBAudio* audio, const struct GBSerializedState* state);
242
243#endif