From 5fe3a3c35a99ca9ae300ecff583cbce574038f31 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Fri, 19 Aug 2022 16:25:32 -0500 Subject: [PATCH] prepare for moving chips --- src/engine/engine.cpp | 51 +++++++++++++++++++++++++++++++++++++++++++ src/engine/engine.h | 3 +++ 2 files changed, 54 insertions(+) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 5fe2db695..7bf184f0a 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1386,6 +1386,57 @@ bool DivEngine::removeSystem(int index, bool preserveOrder) { return true; } +bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) { + if (src==dest) { + lastError="source and destination are equal"; + return false; + } + if (src<0 || src>=song.systemLen) { + lastError="invalid source index"; + return false; + } + if (dest<0 || dest>=song.systemLen) { + lastError="invalid destination index"; + return false; + } + //int chanCount=chans; + quitDispatch(); + BUSY_BEGIN; + saveLock.lock(); + + if (!preserveOrder) { + // move channels + // TODO: a lot of work! + } + + DivSystem srcSystem=song.system[src]; + + song.system[src]=song.system[dest]; + song.system[dest]=srcSystem; + + song.systemVol[src]^=song.systemVol[dest]; + song.systemVol[dest]^=song.systemVol[src]; + song.systemVol[src]^=song.systemVol[dest]; + + song.systemPan[src]^=song.systemPan[dest]; + song.systemPan[dest]^=song.systemPan[src]; + song.systemPan[src]^=song.systemPan[dest]; + + song.systemFlags[src]^=song.systemFlags[dest]; + song.systemFlags[dest]^=song.systemFlags[src]; + song.systemFlags[src]^=song.systemFlags[dest]; + + recalcChans(); + saveLock.unlock(); + BUSY_END; + initDispatch(); + BUSY_BEGIN; + renderSamples(); + reset(); + BUSY_END; + return true; +} + void DivEngine::poke(int sys, unsigned int addr, unsigned short val) { if (sys<0 || sys>=song.systemLen) return; BUSY_BEGIN; diff --git a/src/engine/engine.h b/src/engine/engine.h index 8e2c094da..d86e532bb 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -905,6 +905,9 @@ class DivEngine { // remove system bool removeSystem(int index, bool preserveOrder=true); + + // move system + bool swapSystem(int src, int dest, bool preserveOrder=true); // write to register on system void poke(int sys, unsigned int addr, unsigned short val);