all repos — mgba @ 4d839d03b46918ae0db7cc7f0c7f04e8e6f2c62a

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#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