DS Audio: Fix ADPCM looping

This commit is contained in:
Vicki Pfau 2017-03-08 23:03:15 -08:00
parent 50d89e4b27
commit f3311cc373
1 changed files with 8 additions and 8 deletions

View File

@ -242,7 +242,7 @@ static void _updateChannel(struct mTiming* timing, void* user, uint32_t cyclesLa
_updateAdpcm(ch, (cpu->memory.load8(cpu, ch->offset + ch->source, NULL) >> ch->adpcmOffset) & 0xF); _updateAdpcm(ch, (cpu->memory.load8(cpu, ch->offset + ch->source, NULL) >> ch->adpcmOffset) & 0xF);
ch->offset += ch->adpcmOffset >> 2; ch->offset += ch->adpcmOffset >> 2;
ch->adpcmOffset ^= 4; ch->adpcmOffset ^= 4;
if (ch->offset == ch->loopPoint) { if (ch->offset == ch->loopPoint && !ch->adpcmOffset) {
ch->adpcmStartSample = ch->adpcmSample; ch->adpcmStartSample = ch->adpcmSample;
ch->adpcmStartIndex = ch->adpcmIndex; ch->adpcmStartIndex = ch->adpcmIndex;
} }
@ -251,20 +251,20 @@ static void _updateChannel(struct mTiming* timing, void* user, uint32_t cyclesLa
_updateMixer(ch->p); _updateMixer(ch->p);
switch (ch->repeat) { switch (ch->repeat) {
case 1: case 1:
if (ch->offset >= ch->length) { if (ch->offset >= ch->length + ch->loopPoint) {
ch->offset = ch->loopPoint; ch->offset = ch->loopPoint;
}
break;
case 2:
if (ch->offset >= ch->length) {
ch->enable = false;
ch->p->p->memory.io7[(DS7_REG_SOUND0CNT_HI + (ch->index << 4)) >> 1] &= 0x7FFF;
if (ch->format == 2) { if (ch->format == 2) {
ch->adpcmSample = ch->adpcmStartSample; ch->adpcmSample = ch->adpcmStartSample;
ch->adpcmIndex = ch->adpcmStartIndex; ch->adpcmIndex = ch->adpcmStartIndex;
} }
} }
break; break;
case 2:
if (ch->offset >= ch->length + ch->loopPoint) {
ch->enable = false;
ch->p->p->memory.io7[(DS7_REG_SOUND0CNT_HI + (ch->index << 4)) >> 1] &= 0x7FFF;
}
break;
} }
if (ch->enable) { if (ch->enable) {
mTimingSchedule(timing, &ch->updateEvent, ch->period - cyclesLate); mTimingSchedule(timing, &ch->updateEvent, ch->period - cyclesLate);