diff --git a/desmume/src/SPU.cpp b/desmume/src/SPU.cpp index 3376ac494..263bcadfd 100644 --- a/desmume/src/SPU.cpp +++ b/desmume/src/SPU.cpp @@ -750,6 +750,8 @@ void SPU_struct::WriteByte(u32 addr, u8 val) u8 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; + //printf("SPU write08 channel%d, reg %04X, val %02X\n", chan_num, addr, val); + switch (addr & 0x000F) { case 0x0: thischan.vol = (val & 0x7F); break; @@ -844,6 +846,8 @@ void SPU_struct::WriteWord(u32 addr, u16 val) u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; + //printf("SPU write16 channel%d, reg %04X, val %04X\n", chan_num, addr, val); + switch (addr & 0xF) { case 0x0: @@ -929,6 +933,8 @@ void SPU_struct::WriteLong(u32 addr, u32 val) u32 chan_num = (addr >> 4) & 0xF; channel_struct &thischan=channels[chan_num]; + //printf("SPU write32 channel%d, reg %04X, val %08X\n", chan_num, addr, val); + switch (addr & 0xF) { case 0x0: @@ -1211,6 +1217,12 @@ template static FORCEINLINE void TestForLoop(SPU_struct *SPU, channe static FORCEINLINE void TestForLoop2(SPU_struct *SPU, channel_struct *chan) { + // Minimum length (the sum of PNT+LEN) is 4 words (16 bytes), + // smaller values (0..3 words) are causing hang-ups + // (busy bit remains set infinite, but no sound output occurs). + // fix: 7th Dragon (JP) - http://sourceforge.net/p/desmume/bugs/1357/ + if (chan->totlength < 4) return; + chan->sampcnt += chan->sampinc; if (chan->sampcnt > chan->double_totlength_shifted) @@ -1218,8 +1230,9 @@ static FORCEINLINE void TestForLoop2(SPU_struct *SPU, channel_struct *chan) // Do we loop? Or are we done? if (chan->repeat == 1) { - while (chan->sampcnt > chan->double_totlength_shifted) - chan->sampcnt -= chan->double_totlength_shifted - (double)(chan->loopstart << 3); + double step = (chan->double_totlength_shifted - (double)(chan->loopstart << 3)); + + while (chan->sampcnt > chan->double_totlength_shifted) chan->sampcnt -= step; if(chan->loop_index == K_ADPCM_LOOPING_RECOVERY_INDEX) { diff --git a/desmume/src/SPU.h b/desmume/src/SPU.h index fe7b7967f..368e79734 100644 --- a/desmume/src/SPU.h +++ b/desmume/src/SPU.h @@ -87,9 +87,9 @@ struct channel_struct loopstart(0), length(0), totlength(0), - double_totlength_shifted(0.f), - sampcnt(0.f), - sampinc(0.f), + double_totlength_shifted(0.0), + sampcnt(0.0), + sampinc(0.0), lastsampcnt(0), pcm16b(0), pcm16b_last(0),