From 0c0efaea50e85c2766e31c3d46b597351dde4a20 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Wed, 24 May 2023 01:51:27 -0500 Subject: [PATCH] make use of sample loop flag issue #1109 this MAY BREAK THINGS if any problems, REVERT THIS ONE --- src/engine/platform/qsound.cpp | 2 +- src/engine/platform/segapcm.cpp | 4 ++-- src/engine/platform/snes.cpp | 2 +- src/engine/vgmOps.cpp | 4 ++-- src/gui/sampleEdit.cpp | 11 ++++++++--- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/engine/platform/qsound.cpp b/src/engine/platform/qsound.cpp index 066ce34b..b1aeab3e 100644 --- a/src/engine/platform/qsound.cpp +++ b/src/engine/platform/qsound.cpp @@ -319,7 +319,7 @@ void DivPlatformQSound::tick(bool sysTick) { if (length > 65536 - 16) { length = 65536 - 16; } - if (loopStart == -1 || loopStart >= length) { + if (!s->isLoopable()) { if (i<16) { qsound_end = offPCM[chan[i].sample] + length + 15; } else { diff --git a/src/engine/platform/segapcm.cpp b/src/engine/platform/segapcm.cpp index ead57f80..ce24e2fb 100644 --- a/src/engine/platform/segapcm.cpp +++ b/src/engine/platform/segapcm.cpp @@ -138,7 +138,7 @@ void DivPlatformSegaPCM::tick(bool sysTick) { 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),sampleEndSegaPCM[chan[i].pcm.sample]); - if (loopStart<0 || loopStart>=actualLength) { + if (!s->isLoopable()) { rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); } else { int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; @@ -156,7 +156,7 @@ void DivPlatformSegaPCM::tick(bool sysTick) { 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),sampleEndSegaPCM[chan[i].pcm.sample]); - if (loopStart<0 || loopStart>=actualLength) { + if (!s->isLoopable()) { rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); } else { int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 21ae97b8..0c9734c2 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -222,7 +222,7 @@ void DivPlatformSNES::tick(bool sysTick) { if (chan[i].audPos>0) { start=start+MIN(chan[i].audPos,s->lengthBRR-1)/16*9; } - if (s->loopStart>=0) { + if (s->isLoopable()) { loop=((s->depth!=DIV_SAMPLE_DEPTH_BRR)?9:0)+start+((s->loopStart/16)*9); } } else { diff --git a/src/engine/vgmOps.cpp b/src/engine/vgmOps.cpp index 95ba1ca7..4f764c48 100644 --- a/src/engine/vgmOps.cpp +++ b/src/engine/vgmOps.cpp @@ -591,7 +591,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0x95); w->writeC(streamID); w->writeS(write.val); // sample number - w->writeC((sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT)==0)|(sampleDir[streamID]?0x10:0)); // flags + w->writeC((sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT)==0 && sample->isLoopable())|(sampleDir[streamID]?0x10:0)); // flags if (sample->isLoopable() && !sampleDir[streamID]) { loopTimer[streamID]=sample->length8; loopSample[streamID]=write.val; @@ -610,7 +610,7 @@ void DivEngine::performVGMWrite(SafeWriter* w, DivSystem sys, DivRegWrite& write w->writeC(0x95); w->writeC(streamID); w->writeS(pendingFreq[streamID]); // sample number - w->writeC((sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT)==0)|(sampleDir[streamID]?0x10:0)); // flags + w->writeC((sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT)==0 && sample->isLoopable())|(sampleDir[streamID]?0x10:0)); // flags if (sample->isLoopable() && !sampleDir[streamID]) { loopTimer[streamID]=sample->length8; loopSample[streamID]=pendingFreq[streamID]; diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index ab92f3d8..1888aff1 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -219,12 +219,17 @@ void FurnaceGUI::drawSampleEdit() { if (ImGui::Checkbox("Loop",&doLoop)) { MARK_MODIFIED if (doLoop) { sample->loop=true; - sample->loopStart=0; - sample->loopEnd=sample->samples; + if (sample->loopStart<0) { + sample->loopStart=0; + } + if (sample->loopEnd<0) { + sample->loopEnd=sample->samples; + } } else { sample->loop=false; + /* sample->loopStart=-1; - sample->loopEnd=sample->samples; + sample->loopEnd=sample->samples;*/ } updateSampleTex=true; if (e->getSampleFormatMask()&(1U<