diff --git a/src/engine/platform/gbadma.cpp b/src/engine/platform/gbadma.cpp index da4e95403..9a0ac2fab 100644 --- a/src/engine/platform/gbadma.cpp +++ b/src/engine/platform/gbadma.cpp @@ -33,13 +33,12 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { // internal mixing is always 10-bit for (int i=0; i<2; i++) { bool newSamp=h==0; + chan[i].audDat=0; if (chan[i].active && (chan[i].useWave || (chan[i].sample>=0 && chan[i].samplesong.sampleLen))) { chan[i].audSub+=(1<=chan[i].freq) { @@ -52,13 +51,12 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { } chan[i].dmaCount&=15; } - } else { + } else if (sampleLoaded[chan[i].sample]) { DivSample* s=parent->getSample(chan[i].sample); if (s->samples>0) { - if (chan[i].audPos>=0 && chan[i].audPos<(int)s->samples) { - chan[i].audDat=s->data8[chan[i].audPos]; - } else { - chan[i].audDat=0; + if (chan[i].audPos>=0) { + unsigned int pos=(sampleOff[chan[i].sample]+chan[i].audPos)&0x01ffffff; + chan[i].audDat=sampleMem[pos]; } newSamp=true; if (chan[i].audSub>=chan[i].freq) { @@ -68,8 +66,9 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { chan[i].dmaCount+=posInc; if (s->isLoopable()) { if (chan[i].dmaCount>=16 && chan[i].audPos>=s->loopEnd) { - int loopPos=chan[i].audPos-s->loopStart; - chan[i].audPos=(loopPos%(s->loopEnd-s->loopStart))+s->loopStart; + int loopStart=s->loopStart&~3; + int loopPos=chan[i].audPos-loopStart; + chan[i].audPos=(loopPos%(s->loopEnd-s->loopStart))+loopStart; } } else if (chan[i].audPos>=(int)s->samples) { chan[i].sample=-1; @@ -82,8 +81,6 @@ void DivPlatformGBADMA::acquire(short** buf, size_t len) { chan[i].audPos=0; } } - } else { - chan[i].audDat=0; } if (!isMuted[i] && newSamp) { int out=chan[i].audDat*(chan[i].vol*chan[i].envVol/2)<<1; @@ -112,6 +109,7 @@ void DivPlatformGBADMA::tick(bool sysTick) { if (chan[i].std.vol.had) { chan[i].envVol=chan[i].std.vol.val; if (ins->type==DIV_INS_AMIGA) chan[i].envVol/=32; + else if (chan[i].envVol>2) chan[i].envVol=2; } if (NEW_ARP_STRAT) { chan[i].handleArp(); @@ -129,7 +127,9 @@ void DivPlatformGBADMA::tick(bool sysTick) { } } if (chan[i].useWave && chan[i].active) { - chan[i].ws.tick(); + if (chan[i].ws.tick()) { + updateWave(i); + } } if (chan[i].std.pitch.had) { if (chan[i].std.pitch.mode) { @@ -257,7 +257,7 @@ int DivPlatformGBADMA::dispatch(DivCommand c) { break; case DIV_CMD_VOLUME: if (chan[c.chan].vol!=c.value) { - chan[c.chan].vol=c.value; + chan[c.chan].vol=MIN(c.value,2); if (!chan[c.chan].std.vol.has) { chan[c.chan].envVol=2; } @@ -341,6 +341,13 @@ int DivPlatformGBADMA::dispatch(DivCommand c) { return 1; } +void DivPlatformGBADMA::updateWave(int ch) { + int addr=ch*256; + for (unsigned int i=0; i255) return false; + return sampleLoaded[sample]; +} + +void DivPlatformGBADMA::renderSamples(int sysID) { + size_t maxPos=getSampleMemCapacity(); + memset(sampleMem,0,maxPos); + + size_t memPos=0; + for (int i=0; isong.sampleLen; i++) { + DivSample* s=parent->song.sample[i]; + if (!s->renderOn[0][sysID]) { + sampleOff[i]=0; + continue; + } + int length=s->length8; + int actualLength=MIN((int)(maxPos-memPos),length); + if (actualLength>0) { + sampleOff[i]=memPos; + memcpy(&sampleMem[memPos],s->data8,actualLength); + memPos+=actualLength; + } + if (actualLength