diff --git a/src/gba/audio.c b/src/gba/audio.c index 74d1e5946..d225d5937 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -131,17 +131,24 @@ void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* mLOG(GBA_AUDIO, GAME_ERROR, "Invalid FIFO destination: 0x%08X", info->dest); return; } - uint32_t source = info->source; - uint32_t magic[2] = { - audio->p->cpu->memory.load32(audio->p->cpu, source - 0x350, NULL), - audio->p->cpu->memory.load32(audio->p->cpu, source - 0x980, NULL) - }; if (audio->mixer) { - if (magic[0] - MP2K_MAGIC <= MP2K_LOCK_MAX) { - audio->mixer->engage(audio->mixer, source - 0x350); - } else if (magic[1] - MP2K_MAGIC <= MP2K_LOCK_MAX) { - audio->mixer->engage(audio->mixer, source - 0x980); - } else { + uint32_t source = info->source; + uint32_t offsets[] = { 0x350, 0x980 }; + size_t i; + for (i = 0; i < sizeof(offsets) / sizeof(*offsets); ++i) { + if (source < BASE_WORKING_RAM + offsets[i]) { + continue; + } + if (source >= BASE_IO + offsets[i]) { + continue; + } + uint32_t value = GBALoad32(audio->p->cpu, source - offsets[i], NULL); + if (value - MP2K_MAGIC <= MP2K_LOCK_MAX) { + audio->mixer->engage(audio->mixer, source - offsets[i]); + break; + } + } + if (i == sizeof(offsets) / sizeof(*offsets)) { audio->externalMixing = false; } } diff --git a/src/gba/extra/audio-mixer.c b/src/gba/extra/audio-mixer.c index 503fdc8ad..2a14f1ce6 100644 --- a/src/gba/extra/audio-mixer.c +++ b/src/gba/extra/audio-mixer.c @@ -245,9 +245,6 @@ static void _mp2kReload(struct GBAAudioMixer* mixer) { } bool _mp2kEngage(struct GBAAudioMixer* mixer, uint32_t address) { - if (address < BASE_WORKING_RAM) { - return false; - } if (address != mixer->contextAddress) { mixer->contextAddress = address; mixer->p->externalMixing = true;