all repos — mgba @ 463ce997397850e6ea5ca27fb5c806e2edca4e89

mGBA Game Boy Advance Emulator

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