fix hang when swapping chips

fixes #660
This commit is contained in:
tildearrow 2022-08-31 02:52:35 -05:00
parent 2abcea118c
commit f3c3d82e4d
1 changed files with 33 additions and 14 deletions

View File

@ -1140,7 +1140,7 @@ void DivEngine::swapChannels(int src, int dest) {
String prevChanName=curSubSong->chanName[src]; String prevChanName=curSubSong->chanName[src];
String prevChanShortName=curSubSong->chanShortName[src]; String prevChanShortName=curSubSong->chanShortName[src];
bool prevChanShow=curSubSong->chanShow[src]; bool prevChanShow=curSubSong->chanShow[src];
bool prevChanCollapse=curSubSong->chanCollapse[src]; unsigned char prevChanCollapse=curSubSong->chanCollapse[src];
curSubSong->chanName[src]=curSubSong->chanName[dest]; curSubSong->chanName[src]=curSubSong->chanName[dest];
curSubSong->chanShortName[src]=curSubSong->chanShortName[dest]; curSubSong->chanShortName[src]=curSubSong->chanShortName[dest];
@ -1445,25 +1445,44 @@ bool DivEngine::swapSystem(int src, int dest, bool preserveOrder) {
} }
} }
// swap channels
logV("swap list:"); logV("swap list:");
for (int i=0; i<tchans; i++) { for (int i=0; i<tchans; i++) {
logV("- %d -> %d",unswappedChannels[i],swappedChannels[i]); logV("- %d -> %d",unswappedChannels[i],swappedChannels[i]);
} }
// swap channels for (size_t i=0; i<song.subsong.size(); i++) {
bool allComplete=false; DivOrders prevOrders=song.subsong[i]->orders;
while (!allComplete) { DivPattern* prevPat[DIV_MAX_CHANS][256];
logD("doing swap..."); unsigned char prevEffectCols[DIV_MAX_CHANS];
allComplete=true; String prevChanName[DIV_MAX_CHANS];
for (int i=0; i<tchans; i++) { String prevChanShortName[DIV_MAX_CHANS];
if (unswappedChannels[i]!=swappedChannels[i]) { bool prevChanShow[DIV_MAX_CHANS];
swapChannels(i,swappedChannels[i]); unsigned char prevChanCollapse[DIV_MAX_CHANS];
allComplete=false;
logD("> %d -> %d",unswappedChannels[i],unswappedChannels[swappedChannels[i]]); for (int j=0; j<tchans; j++) {
unswappedChannels[i]^=unswappedChannels[swappedChannels[i]]; for (int k=0; k<256; k++) {
unswappedChannels[swappedChannels[i]]^=unswappedChannels[i]; prevPat[j][k]=song.subsong[i]->pat[j].data[k];
unswappedChannels[i]^=unswappedChannels[swappedChannels[i]];
} }
prevEffectCols[j]=song.subsong[i]->pat[j].effectCols;
prevChanName[j]=song.subsong[i]->chanName[j];
prevChanShortName[j]=song.subsong[i]->chanShortName[j];
prevChanShow[j]=song.subsong[i]->chanShow[j];
prevChanCollapse[j]=song.subsong[i]->chanCollapse[j];
}
for (int j=0; j<tchans; j++) {
for (int k=0; k<256; k++) {
song.subsong[i]->orders.ord[j][k]=prevOrders.ord[swappedChannels[j]][k];
song.subsong[i]->pat[j].data[k]=prevPat[swappedChannels[j]][k];
}
song.subsong[i]->pat[j].effectCols=prevEffectCols[swappedChannels[j]];
song.subsong[i]->chanName[j]=prevChanName[swappedChannels[j]];
song.subsong[i]->chanShortName[j]=prevChanShortName[swappedChannels[j]];
song.subsong[i]->chanShow[j]=prevChanShow[swappedChannels[j]];
song.subsong[i]->chanCollapse[j]=prevChanCollapse[swappedChannels[j]];
} }
} }
} }