From 7525a0793649443af7c51b43af2ea7d2ce9d7a80 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 24 Feb 2023 01:23:46 -0500 Subject: [PATCH] SegaPCM: fix loop --- src/engine/platform/segapcm.cpp | 27 ++++++++++----------------- src/engine/platform/segapcm.h | 1 - 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index e98dae723..ee097abc6 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -136,11 +136,11 @@ void DivPlatformSegaPCM::tick(bool sysTick) { rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); - rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-1)>>8)); + rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-2)>>8)); if (loopStart<0 || loopStart>=actualLength) { rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); } else { - int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart+sampleLoopOff[chan[i].pcm.sample]; + int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; rWrite(4+(i<<3),loopPos&0xff); rWrite(5+(i<<3),(loopPos>>8)&0xff); rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); @@ -153,11 +153,11 @@ void DivPlatformSegaPCM::tick(bool sysTick) { rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); - rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-1)>>8)); + rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-2)>>8)); if (loopStart<0 || loopStart>=actualLength) { rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); } else { - int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart+sampleLoopOff[chan[i].pcm.sample]; + int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; rWrite(4+(i<<3),loopPos&0xff); rWrite(5+(i<<3),(loopPos>>8)&0xff); rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); @@ -458,27 +458,20 @@ void DivPlatformSegaPCM::reset() { if ((memPos&0xff0000)!=((memPos+alignedSize)&0xff0000)) { memPos=(memPos+0xffff)&0xff0000; } + if (alignedSize&(~0xff)) { + memPos+=256-(alignedSize&0xff); + } logV("- sample %d will be at %x with length %x",i,memPos,alignedSize); sampleLoaded[i]=true; if (memPos>=16777216) break; sampleOffSegaPCM[i]=memPos; - unsigned int readPos=0; for (unsigned int j=0; j=(unsigned int)sample->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT)) { - if (sample->isLoopable()) { - readPos=sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT); - sampleMem[memPos++]=((unsigned char)sample->data8[readPos]+0x80); - } else { - sampleMem[memPos++]=0x80; - } - } else { - sampleMem[memPos++]=((unsigned char)sample->data8[readPos]+0x80); - } - readPos++; + sampleMem[memPos++]=((unsigned char)sample->data8[j]+0x80); if (memPos>=16777216) break; } - sampleLoopOff[i]=readPos-sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT); if (memPos>=16777216) break; + + memPos&=~0xff; } sampleMemLen=memPos; } diff --git a/src/engine/platform/segapcm.h b/src/engine/platform/segapcm.h index 75af90e33..4dd541e76 100644 --- a/src/engine/platform/segapcm.h +++ b/src/engine/platform/segapcm.h @@ -76,7 +76,6 @@ class DivPlatformSegaPCM: public DivDispatch { short pendingWrites[256]; unsigned int sampleOffSegaPCM[256]; - unsigned int sampleLoopOff[256]; bool sampleLoaded[256]; friend void putDispatchChip(void*,int);