add ability to play by one row

This commit is contained in:
tildearrow 2022-02-06 00:42:07 -05:00
parent 107187a20c
commit 8772439d3e
4 changed files with 52 additions and 5 deletions

View file

@ -4756,6 +4756,7 @@ void DivEngine::playSub(bool preserveDrift, int goalRow) {
int goal=curOrder;
curOrder=0;
curRow=0;
stepPlay=0;
int prevDrift;
prevDrift=clockDrift;
clockDrift=0;
@ -4815,8 +4816,12 @@ int DivEngine::calcFreq(int base, int pitch, bool period, int octave) {
void DivEngine::play() {
isBusy.lock();
freelance=false;
playSub(false);
if (stepPlay==0) {
freelance=false;
playSub(false);
} else {
stepPlay=0;
}
isBusy.unlock();
}
@ -4827,11 +4832,23 @@ void DivEngine::playToRow(int row) {
isBusy.unlock();
}
void DivEngine::stepOne(int row) {
isBusy.lock();
if (!isPlaying()) {
freelance=false;
playSub(false,row);
}
stepPlay=2;
ticks=1;
isBusy.unlock();
}
void DivEngine::stop() {
isBusy.lock();
freelance=false;
playing=false;
extValuePresent=false;
stepPlay=0;
remainingLoops=-1;
isBusy.unlock();
}
@ -5086,6 +5103,10 @@ bool DivEngine::isPlaying() {
return (playing && !freelance);
}
bool DivEngine::isStepping() {
return !(stepPlay==0);
}
bool DivEngine::isChannelMuted(int chan) {
return isMuted[chan];
}

View file

@ -150,7 +150,7 @@ class DivEngine {
bool halted;
bool forceMono;
int ticks, curRow, curOrder, remainingLoops, nextSpeed, divider;
int cycles, clockDrift;
int cycles, clockDrift, stepPlay;
int changeOrd, changePos, totalSeconds, totalTicks, totalTicksR, totalCmds, lastCmds, cmdsPerSecond, globalPitch;
unsigned char extValue;
unsigned char speed1, speed2;
@ -288,6 +288,9 @@ class DivEngine {
// play to row
void playToRow(int row);
// play by one row
void stepOne(int row);
// stop
void stop();
@ -406,6 +409,9 @@ class DivEngine {
// is playing
bool isPlaying();
// is stepping
bool isStepping();
// is exporting
bool isExporting();
@ -587,6 +593,7 @@ class DivEngine {
divider(60),
cycles(0),
clockDrift(0),
stepPlay(0),
changeOrd(-1),
changePos(0),
totalSeconds(0),

View file

@ -844,7 +844,7 @@ bool DivEngine::nextTick(bool noAccum) {
}
if (!freelance) {
if (--ticks<=0) {
if (stepPlay!=1) if (--ticks<=0) {
ret=endOfSong;
if (endOfSong) {
if (song.loopModality!=2) {
@ -852,6 +852,7 @@ bool DivEngine::nextTick(bool noAccum) {
}
}
endOfSong=false;
if (stepPlay==2) stepPlay=1;
nextRow();
}
// process stuff