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