src/gba/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 GBA_AUDIO_H
7#define GBA_AUDIO_H
8
9#include "util/common.h"
10
11CXX_GUARD_START
12
13#include "core/log.h"
14#include "gb/audio.h"
15#include "util/circle-buffer.h"
16
17mLOG_DECLARE_CATEGORY(GBA_AUDIO);
18
19struct GBADMA;
20
21extern const unsigned GBA_AUDIO_SAMPLES;
22extern const int GBA_AUDIO_VOLUME_MAX;
23
24struct GBAAudioFIFO {
25 struct CircleBuffer fifo;
26 int dmaSource;
27 int8_t sample;
28};
29
30DECL_BITFIELD(GBARegisterSOUNDCNT_HI, uint16_t);
31DECL_BITS(GBARegisterSOUNDCNT_HI, Volume, 0, 2);
32DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChA, 2);
33DECL_BIT(GBARegisterSOUNDCNT_HI, VolumeChB, 3);
34DECL_BIT(GBARegisterSOUNDCNT_HI, ChARight, 8);
35DECL_BIT(GBARegisterSOUNDCNT_HI, ChALeft, 9);
36DECL_BIT(GBARegisterSOUNDCNT_HI, ChATimer, 10);
37DECL_BIT(GBARegisterSOUNDCNT_HI, ChAReset, 11);
38DECL_BIT(GBARegisterSOUNDCNT_HI, ChBRight, 12);
39DECL_BIT(GBARegisterSOUNDCNT_HI, ChBLeft, 13);
40DECL_BIT(GBARegisterSOUNDCNT_HI, ChBTimer, 14);
41DECL_BIT(GBARegisterSOUNDCNT_HI, ChBReset, 15);
42
43DECL_BITFIELD(GBARegisterSOUNDBIAS, uint16_t);
44DECL_BITS(GBARegisterSOUNDBIAS, Bias, 0, 10);
45DECL_BITS(GBARegisterSOUNDBIAS, Resolution, 14, 2);
46
47struct GBAAudio {
48 struct GBA* p;
49
50 struct GBAudio psg;
51 struct GBAAudioFIFO chA;
52 struct GBAAudioFIFO chB;
53
54 int16_t lastLeft;
55 int16_t lastRight;
56 int clock;
57
58 uint8_t volume;
59 bool volumeChA;
60 bool volumeChB;
61 bool chARight;
62 bool chALeft;
63 bool chATimer;
64 bool chBRight;
65 bool chBLeft;
66 bool chBTimer;
67 bool enable;
68
69 size_t samples;
70 unsigned sampleRate;
71
72 GBARegisterSOUNDBIAS soundbias;
73
74 int32_t sampleInterval;
75
76 bool forceDisableChA;
77 bool forceDisableChB;
78 int masterVolume;
79
80 struct mTimingEvent sampleEvent;
81};
82
83struct GBAStereoSample {
84 int16_t left;
85 int16_t right;
86};
87
88void GBAAudioInit(struct GBAAudio* audio, size_t samples);
89void GBAAudioReset(struct GBAAudio* audio);
90void GBAAudioDeinit(struct GBAAudio* audio);
91
92void GBAAudioResizeBuffer(struct GBAAudio* audio, size_t samples);
93
94void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info);
95
96void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
97void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
98void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
99void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
100void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
101void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
102void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
103void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
104void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
105void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
106void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
107void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
108void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
109void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value);
110
111void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
112void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
113void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId, int32_t cycles);
114
115struct GBASerializedState;
116void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* state);
117void GBAAudioDeserialize(struct GBAAudio* audio, const struct GBASerializedState* state);
118
119float GBAAudioCalculateRatio(float inputSampleRate, float desiredFPS, float desiredSampleRatio);
120
121CXX_GUARD_END
122
123#endif