Sample FIFOs with sound DMA timer
Jeffrey Pfau jeffrey@endrift.com
Wed, 02 Oct 2013 00:46:51 -0700
3 files changed,
31 insertions(+),
13 deletions(-)
M
src/gba/gba-audio.h
→
src/gba/gba-audio.h
@@ -138,17 +138,17 @@
union { struct { unsigned volume : 2; - unsigned volumeDmaA : 1; - unsigned volumeDmaB : 1; + unsigned volumeChA : 1; + unsigned volumeChB : 1; unsigned : 4; - unsigned dmaARight : 1; - unsigned dmaALeft : 1; - unsigned dmaATimer : 1; - unsigned dmaAReset : 1; - unsigned dmaBRight : 1; - unsigned dmaBLeft : 1; - unsigned dmaBTimer : 1; - unsigned dmaBReset : 1; + unsigned chARight : 1; + unsigned chALeft : 1; + unsigned chATimer : 1; + unsigned chAReset : 1; + unsigned chBRight : 1; + unsigned chBLeft : 1; + unsigned chBTimer : 1; + unsigned chBReset : 1; }; uint16_t soundcntHi; };
M
src/gba/gba-io.c
→
src/gba/gba-io.c
@@ -209,10 +209,8 @@ case REG_WAVE_RAM3_LO:
GBAAudioWriteWaveRAM(&gba->audio, 3, value); break; case REG_FIFO_A_LO: - GBAAudioWriteFIFO(&gba->audio, 0, value); - break; case REG_FIFO_B_LO: - GBAAudioWriteFIFO(&gba->audio, 1, value); + GBAAudioWriteFIFO(&gba->audio, address, value); break; case REG_DMA0SAD_LO: GBAMemoryWriteDMASAD(&gba->memory, 0, value);
M
src/gba/gba.c
→
src/gba/gba.c
@@ -136,6 +136,16 @@ if (timer->doIrq) {
GBARaiseIRQ(gba, IRQ_TIMER0); } + if (gba->audio.enable) { + if ((gba->audio.chALeft || gba->audio.chARight) && gba->audio.chATimer == 0) { + GBAAudioSampleFIFO(&gba->audio, 0); + } + + if ((gba->audio.chBLeft || gba->audio.chBRight) && gba->audio.chBTimer == 0) { + GBAAudioSampleFIFO(&gba->audio, 1); + } + } + nextTimer = &gba->timers[1]; if (nextTimer->countUp) { ++gba->memory.io[REG_TM1CNT_LO >> 1];@@ -159,6 +169,16 @@ timer->oldReload = timer->reload;
if (timer->doIrq) { GBARaiseIRQ(gba, IRQ_TIMER1); + } + + if (gba->audio.enable) { + if ((gba->audio.chALeft || gba->audio.chARight) && gba->audio.chATimer == 1) { + GBAAudioSampleFIFO(&gba->audio, 0); + } + + if ((gba->audio.chBLeft || gba->audio.chBRight) && gba->audio.chBTimer == 1) { + GBAAudioSampleFIFO(&gba->audio, 1); + } } if (timer->countUp) {