From 607e3c9339fc37b651c7d5b3f7d5315c03b03ab5 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 26 Sep 2022 02:51:16 -0500 Subject: [PATCH] fix the crashes --- src/engine/platform/rf5c68.cpp | 11 ++++++----- src/engine/platform/snes.cpp | 7 +++++-- src/engine/platform/su.cpp | 2 +- src/engine/platform/ymz280b.cpp | 9 ++++++--- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/rf5c68.cpp b/src/engine/platform/rf5c68.cpp index e462e3d8b..dccd0fd27 100644 --- a/src/engine/platform/rf5c68.cpp +++ b/src/engine/platform/rf5c68.cpp @@ -122,9 +122,6 @@ void DivPlatformRF5C68::tick(bool sysTick) { } else { chan[i].audPos=0; } - // TODO: BANG BANG BANG - // AAAAAAAAAAAAAAAAAAA - // ASGDJFJFSDGL;ASDHFKJLSHFLKAJSFHKLJVSJ if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { unsigned char keyon=regPool[8]&~(1<calcFreq(chan[i].baseFreq,chan[i].pitch,false,2,chan[i].pitch2,chipClock,CHIP_FREQBASE)); if (chan[i].freq>65535) chan[i].freq=65535; if (chan[i].keyOn) { - unsigned int start=sampleOffRFC[chan[i].sample]; - unsigned int loop=start+s->length8; + unsigned int start=0; + unsigned int loop=0; + if (chan[i].sample>=0 && chan[i].samplesong.sampleLen) { + start=sampleOffRFC[chan[i].sample]; + loop=start+s->length8; + } if (chan[i].audPos>0) { start=start+MIN(chan[i].audPos,s->length8); } diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 3686980f2..b552cd4bd 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -178,7 +178,6 @@ void DivPlatformSNES::tick(bool sysTick) { updateWave(i); } } - // TODO: THIS WILL CRASH IF THE SAMPLE IS INVALID!!! if (chan[i].freqChanged || chan[i].keyOn || chan[i].keyOff) { DivSample* s=parent->getSample(chan[i].sample); double off=(s->centerRate>=1)?((double)s->centerRate/8363.0):1.0; @@ -191,7 +190,7 @@ void DivPlatformSNES::tick(bool sysTick) { if (chan[i].useWave) { start=waveTableAddr(i); loop=start; - } else { + } else if (chan[i].sample>=0 && chan[i].samplesong.sampleLen) { start=sampleOff[chan[i].sample]; end=MIN(start+MAX(s->lengthBRR,1),getSampleMemCapacity()); loop=MAX(start,end-1); @@ -201,6 +200,10 @@ void DivPlatformSNES::tick(bool sysTick) { if (s->loopStart>=0) { loop=start+s->loopStart/16*9; } + } else { + start=0; + end=0; + loop=0; } sampleMem[tabAddr+0]=start&0xff; sampleMem[tabAddr+1]=start>>8; diff --git a/src/engine/platform/su.cpp b/src/engine/platform/su.cpp index 25fefa200..cd0aea346 100644 --- a/src/engine/platform/su.cpp +++ b/src/engine/platform/su.cpp @@ -163,7 +163,7 @@ void DivPlatformSoundUnit::tick(bool sysTick) { DivInstrument* ins=parent->getIns(chan[i].ins,DIV_INS_SU); int sNum=ins->amiga.getSample(chan[i].note); DivSample* sample=parent->getSample(sNum); - if (sample!=NULL) { + if (sample!=NULL && sNum>=0 && sNumsong.sampleLen) { unsigned int sampleEnd=sampleOffSU[sNum]+(sample->getLoopEndPosition()); unsigned int off=sampleOffSU[sNum]+chan[i].hasOffset; chan[i].hasOffset=0; diff --git a/src/engine/platform/ymz280b.cpp b/src/engine/platform/ymz280b.cpp index 2e617c761..e89c3f9be 100644 --- a/src/engine/platform/ymz280b.cpp +++ b/src/engine/platform/ymz280b.cpp @@ -145,12 +145,15 @@ void DivPlatformYMZ280B::tick(bool sysTick) { // ADPCM has half the range if (s->depth==DIV_SAMPLE_DEPTH_YMZ_ADPCM && chan[i].freq>255) chan[i].freq=255; ctrl|=(chan[i].active?0x80:0)|((s->isLoopable())?0x10:0)|(chan[i].freq>>8); - // TODO: AGAIN THIS WILL CRASH IF THE SAMPLE IS INVALID!!! if (chan[i].keyOn) { - unsigned int start=sampleOff[chan[i].sample]; + unsigned int start=0; unsigned int loopStart=0; unsigned int loopEnd=0; - unsigned int end=MIN(start+s->getCurBufLen(),getSampleMemCapacity()-1); + unsigned int end=0; + if (chan[i].sample>=0 && chan[i].samplesong.sampleLen) { + start=sampleOff[chan[i].sample]; + end=MIN(start+s->getCurBufLen(),getSampleMemCapacity()-1); + } if (chan[i].audPos>0) { switch (s->depth) { case DIV_SAMPLE_DEPTH_YMZ_ADPCM: start+=chan[i].audPos/2; break;