diff --git a/src/gba/gba-audio.c b/src/gba/gba-audio.c index cc7acebb7..67ff89c33 100644 --- a/src/gba/gba-audio.c +++ b/src/gba/gba-audio.c @@ -25,6 +25,8 @@ void GBAAudioInit(struct GBAAudio* audio) { audio->eventDiff = 0; audio->nextSample = 0; audio->sampleRate = 0x8000; + audio->soundcntLo = 0; + audio->soundcntHi = 0; audio->sampleInterval = GBA_ARM7TDMI_FREQUENCY / audio->sampleRate; CircleBufferInit(&audio->left, GBA_AUDIO_SAMPLES * sizeof(int32_t)); @@ -107,7 +109,7 @@ void GBAAudioWriteSOUND1CNT_LO(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteSOUND1CNT_HI(struct GBAAudio* audio, uint16_t value) { - audio->ch1.wave.packed = value; + audio->ch1.envelope.packed = value; } void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value) { @@ -115,7 +117,7 @@ void GBAAudioWriteSOUND1CNT_X(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteSOUND2CNT_LO(struct GBAAudio* audio, uint16_t value) { - audio->ch2.wave.packed = value; + audio->ch2.envelope.packed = value; } void GBAAudioWriteSOUND2CNT_HI(struct GBAAudio* audio, uint16_t value) { @@ -135,7 +137,7 @@ void GBAAudioWriteSOUND3CNT_X(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteSOUND4CNT_LO(struct GBAAudio* audio, uint16_t value) { - audio->ch4.wave.packed = value; + audio->ch4.envelope.packed = value; } void GBAAudioWriteSOUND4CNT_HI(struct GBAAudio* audio, uint16_t value) { diff --git a/src/gba/gba-audio.h b/src/gba/gba-audio.h index 8e20582de..819b716de 100644 --- a/src/gba/gba-audio.h +++ b/src/gba/gba-audio.h @@ -10,15 +10,19 @@ struct GBADMA; const unsigned GBA_AUDIO_SAMPLES; -union GBAAudioWave { - struct { - unsigned length : 6; - unsigned duty : 2; - unsigned stepTime : 3; - unsigned direction : 1; - unsigned initialVolume : 4; +struct GBAAudioEnvelope { + union { + struct { + unsigned length : 6; + unsigned duty : 2; + unsigned stepTime : 3; + unsigned direction : 1; + unsigned initialVolume : 4; + }; + uint16_t packed; }; - uint16_t packed; + int currentVolume; + int32_t nextStep; }; union GBAAudioSquareControl { @@ -42,12 +46,12 @@ struct GBAAudioChannel1 { uint16_t packed; } sweep; - union GBAAudioWave wave; + struct GBAAudioEnvelope envelope; union GBAAudioSquareControl control; }; struct GBAAudioChannel2 { - union GBAAudioWave wave; + struct GBAAudioEnvelope envelope; union GBAAudioSquareControl control; }; @@ -86,7 +90,7 @@ struct GBAAudioChannel3 { }; struct GBAAudioChannel4 { - union GBAAudioWave wave; + struct GBAAudioEnvelope envelope; union { struct { unsigned ratio : 3;