all repos — mgba @ a834f8b1f69bc62fb8f56dc529860ed8c7f5bd54

mGBA Game Boy Advance Emulator

Sample FIFOs with sound DMA timer
Jeffrey Pfau jeffrey@endrift.com
Wed, 02 Oct 2013 00:46:51 -0700
commit

a834f8b1f69bc62fb8f56dc529860ed8c7f5bd54

parent

71ec6162f11ab51bb159af78a9a3a84538189cb6

3 files changed, 31 insertions(+), 13 deletions(-)

jump to
M src/gba/gba-audio.hsrc/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.csrc/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.csrc/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) {