all repos — mgba @ be36c1b5d66095dd33d635a4761ab9c589c545c6

mGBA Game Boy Advance Emulator

src/gba/gba-audio.h (view raw)

  1#ifndef GBA_AUDIO_H
  2#define GBA_AUDIO_H
  3
  4#include <stdint.h>
  5
  6union GBAAudioWave {
  7	struct {
  8		unsigned length : 6;
  9		unsigned duty : 2;
 10		unsigned stepTime : 3;
 11		unsigned direction : 1;
 12		unsigned initialVolume : 4;
 13	};
 14	uint16_t packed;
 15};
 16
 17union GBAAudioSquareControl {
 18	struct {
 19		unsigned frequency : 11;
 20		unsigned : 3;
 21		unsigned stop : 1;
 22		unsigned restart : 1;
 23	};
 24	uint16_t packed;
 25};
 26
 27struct GBAAudioChannel1 {
 28	union GBAAudioSquareSweep {
 29		struct {
 30			unsigned shift : 3;
 31			unsigned direction : 1;
 32			unsigned time : 3;
 33			unsigned : 9;
 34		};
 35		uint16_t packed;
 36	} sweep;
 37
 38	union GBAAudioWave wave;
 39	union GBAAudioSquareControl control;
 40};
 41
 42struct GBAAudioChannel2 {
 43	union GBAAudioWave wave;
 44	union GBAAudioSquareControl control;
 45};
 46
 47struct GBAAudioChannel3 {
 48	union {
 49		struct {
 50			unsigned : 5;
 51			unsigned size : 1;
 52			unsigned bank : 1;
 53			unsigned disable : 1;
 54			unsigned : 7;
 55		};
 56		uint16_t packed;
 57	} bank;
 58
 59	union {
 60		struct {
 61			unsigned length : 8;
 62			unsigned : 5;
 63			unsigned volume : 3;
 64			unsigned disable : 1;
 65			unsigned : 7;
 66		};
 67		uint16_t packed;
 68	} wave;
 69
 70	union {
 71		struct {
 72			unsigned rate : 11;
 73			unsigned : 3;
 74			unsigned stop : 1;
 75			unsigned restart : 1;
 76		};
 77		uint16_t packed;
 78	} control;
 79};
 80
 81struct GBAAudioChannel4 {
 82	union GBAAudioWave wave;
 83	union {
 84		struct {
 85			unsigned ratio : 3;
 86			unsigned power : 1;
 87			unsigned frequency : 4;
 88			unsigned : 6;
 89			unsigned stop : 1;
 90			unsigned restart : 1;
 91		};
 92		uint16_t packed;
 93	} control;
 94};
 95
 96struct GBAAudioFIFO {
 97
 98};
 99
100struct GBAAudio {
101	struct GBA* p;
102
103	struct GBAAudioChannel1 ch1;
104	struct GBAAudioChannel2 ch2;
105	struct GBAAudioChannel3 ch3;
106	struct GBAAudioChannel4 ch4;
107
108	struct GBAAudioFIFO chA;
109	struct GBAAudioFIFO chB;
110};
111
112void GBAAudioInit(struct GBAAudio* audio);
113void GBAAudioDeinit(struct GBAAudio* audio);
114
115void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value);
116void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value);
117void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value);
118void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value);
119void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value);
120void GBAAudioWriteSOUND3CNT_LO(struct GBAAudio* audio, uint16_t value);
121void GBAAudioWriteSOUND3CNT_HI(struct GBAAudio* audio, uint16_t value);
122void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value);
123void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value);
124void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value);
125void GBAAudioWriteSOUNDCNT_LO(struct GBAAudio* audio, uint16_t value);
126void GBAAudioWriteSOUNDCNT_HI(struct GBAAudio* audio, uint16_t value);
127void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value);
128
129void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value);
130void GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value);
131
132#endif