From 7c324ec39db69d9ccac1f8a485e55ad3a5384efe Mon Sep 17 00:00:00 2001 From: LTVA1 <87536432+LTVA1@users.noreply.github.com> Date: Wed, 14 Aug 2024 20:01:16 +0300 Subject: [PATCH] naive channel pair refactor (dumb replace one pair with vector of pairs) --- src/engine/dispatch.h | 6 +- src/engine/engine.cpp | 6 +- src/engine/engine.h | 2 +- src/engine/platform/abstract.cpp | 4 +- src/engine/platform/c140.cpp | 7 +- src/engine/platform/c140.h | 2 +- src/engine/platform/dave.cpp | 5 +- src/engine/platform/dave.h | 2 +- src/engine/platform/opl.cpp | 5 +- src/engine/platform/opl.h | 2 +- src/engine/platform/pce.cpp | 5 +- src/engine/platform/pce.h | 2 +- src/engine/platform/pokey.cpp | 11 +- src/engine/platform/pokey.h | 2 +- src/engine/platform/sid3.cpp | 15 +-- src/engine/platform/sid3.h | 2 +- src/engine/platform/snes.cpp | 5 +- src/engine/platform/snes.h | 2 +- src/gui/pattern.cpp | 193 ++++++++++++++++--------------- 19 files changed, 140 insertions(+), 138 deletions(-) diff --git a/src/engine/dispatch.h b/src/engine/dispatch.h index bf7c50df3..1ab441a49 100644 --- a/src/engine/dispatch.h +++ b/src/engine/dispatch.h @@ -603,10 +603,10 @@ class DivDispatch { /** * get "paired" channels. - * @param chan the channel to query. - * @return a DivChannelPair. + * @param ch the channel to query. + * @param ret the DivChannelPair vector of pairs. */ - virtual DivChannelPair getPaired(int chan); + virtual void getPaired(int ch, std::vector& ret); /** * get channel mode hints. diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 1a382b85e..17c0a1417 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1549,9 +1549,9 @@ void* DivEngine::getDispatchChanState(int ch) { return disCont[dispatchOfChan[ch]].dispatch->getChanState(dispatchChanOfChan[ch]); } -DivChannelPair DivEngine::getChanPaired(int ch) { - if (ch<0 || ch>=chans) return DivChannelPair(); - return disCont[dispatchOfChan[ch]].dispatch->getPaired(dispatchChanOfChan[ch]); +void DivEngine::getChanPaired(int ch, std::vector& ret) { + if (ch<0 || ch>=chans) return; + disCont[dispatchOfChan[ch]].dispatch->getPaired(dispatchChanOfChan[ch], ret); } DivChannelModeHints DivEngine::getChanModeHints(int ch) { diff --git a/src/engine/engine.h b/src/engine/engine.h index a97957d0f..e2090be19 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -1109,7 +1109,7 @@ class DivEngine { void* getDispatchChanState(int chan); // get channel pairs - DivChannelPair getChanPaired(int chan); + void getChanPaired(int chan, std::vector& ret); // get channel mode hints DivChannelModeHints getChanModeHints(int chan); diff --git a/src/engine/platform/abstract.cpp b/src/engine/platform/abstract.cpp index 441ec1bff..ca87dcb31 100644 --- a/src/engine/platform/abstract.cpp +++ b/src/engine/platform/abstract.cpp @@ -37,8 +37,8 @@ unsigned short DivDispatch::getPan(int chan) { return 0; } -DivChannelPair DivDispatch::getPaired(int chan) { - return DivChannelPair(); +void DivDispatch::getPaired(int ch, std::vector& ret) { + ret.push_back(DivChannelPair()); } DivChannelModeHints DivDispatch::getModeHints(int chan) { diff --git a/src/engine/platform/c140.cpp b/src/engine/platform/c140.cpp index bde3e1fe7..24ffc6f14 100644 --- a/src/engine/platform/c140.cpp +++ b/src/engine/platform/c140.cpp @@ -561,12 +561,11 @@ float DivPlatformC140::getPostAmp() { return 3.0f; } -DivChannelPair DivPlatformC140::getPaired(int ch) { - if (!is219) return DivChannelPair(); +void DivPlatformC140::getPaired(int ch, std::vector& ret) { + if (!is219) return; if ((ch&3)==0) { - return DivChannelPair(bankLabel[ch>>2],ch+1,ch+2,ch+3,-1,-1,-1,-1,-1); + ret.push_back(DivChannelPair(bankLabel[ch>>2],ch+1,ch+2,ch+3,-1,-1,-1,-1,-1)); } - return DivChannelPair(); } const void* DivPlatformC140::getSampleMem(int index) { diff --git a/src/engine/platform/c140.h b/src/engine/platform/c140.h index fb385c5eb..3d055d629 100644 --- a/src/engine/platform/c140.h +++ b/src/engine/platform/c140.h @@ -89,7 +89,7 @@ class DivPlatformC140: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/dave.cpp b/src/engine/platform/dave.cpp index 0d5868611..f1f0bfed9 100644 --- a/src/engine/platform/dave.cpp +++ b/src/engine/platform/dave.cpp @@ -525,11 +525,10 @@ unsigned short DivPlatformDave::getPan(int ch) { } // TODO: the rest -DivChannelPair DivPlatformDave::getPaired(int ch) { +void DivPlatformDave::getPaired(int ch, std::vector& ret) { if (chan[ch].highPass) { - DivChannelPair("high",(ch+1)&3); + ret.push_back(DivChannelPair("high",(ch+1)&3)); } - return DivChannelPair(); } DivChannelModeHints DivPlatformDave::getModeHints(int ch) { diff --git a/src/engine/platform/dave.h b/src/engine/platform/dave.h index b232218be..e6d7e3497 100644 --- a/src/engine/platform/dave.h +++ b/src/engine/platform/dave.h @@ -76,7 +76,7 @@ class DivPlatformDave: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivChannelModeHints getModeHints(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); diff --git a/src/engine/platform/opl.cpp b/src/engine/platform/opl.cpp index b3d47a280..b8bdd6d49 100644 --- a/src/engine/platform/opl.cpp +++ b/src/engine/platform/opl.cpp @@ -2098,13 +2098,12 @@ unsigned short DivPlatformOPL::getPan(int ch) { return ((chan[ch].pan&1)<<8)|((chan[ch].pan&2)>>1); } -DivChannelPair DivPlatformOPL::getPaired(int ch) { +void DivPlatformOPL::getPaired(int ch, std::vector& ret) { if (oplType==3 && ch<12 && !(ch&1)) { if (chan[ch].fourOp) { - return DivChannelPair("4OP",ch+1); + ret.push_back(DivChannelPair("4OP",ch+1)); } } - return DivChannelPair(); } DivDispatchOscBuffer* DivPlatformOPL::getOscBuffer(int ch) { diff --git a/src/engine/platform/opl.h b/src/engine/platform/opl.h index 327389c1f..5f4134796 100644 --- a/src/engine/platform/opl.h +++ b/src/engine/platform/opl.h @@ -151,7 +151,7 @@ class DivPlatformOPL: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivDispatchOscBuffer* getOscBuffer(int chan); int mapVelocity(int ch, float vel); float getGain(int ch, int vol); diff --git a/src/engine/platform/pce.cpp b/src/engine/platform/pce.cpp index d65271a3b..fdee3133b 100644 --- a/src/engine/platform/pce.cpp +++ b/src/engine/platform/pce.cpp @@ -538,11 +538,10 @@ unsigned short DivPlatformPCE::getPan(int ch) { return ((chan[ch].pan&0xf0)<<4)|(chan[ch].pan&15); } -DivChannelPair DivPlatformPCE::getPaired(int ch) { +void DivPlatformPCE::getPaired(int ch, std::vector& ret) { if (ch==1 && lfoMode>0) { - return DivChannelPair("mod",0); + ret.push_back(DivChannelPair("mod",0)); } - return DivChannelPair(); } DivChannelModeHints DivPlatformPCE::getModeHints(int ch) { diff --git a/src/engine/platform/pce.h b/src/engine/platform/pce.h index 725d1c232..f780c7a3e 100644 --- a/src/engine/platform/pce.h +++ b/src/engine/platform/pce.h @@ -85,7 +85,7 @@ class DivPlatformPCE: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivChannelModeHints getModeHints(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); diff --git a/src/engine/platform/pokey.cpp b/src/engine/platform/pokey.cpp index 6f524210e..be134f76c 100644 --- a/src/engine/platform/pokey.cpp +++ b/src/engine/platform/pokey.cpp @@ -407,22 +407,21 @@ DivMacroInt* DivPlatformPOKEY::getChanMacroInt(int ch) { return &chan[ch].std; } -DivChannelPair DivPlatformPOKEY::getPaired(int ch) { +void DivPlatformPOKEY::getPaired(int ch, std::vector& ret) { switch (ch) { case 0: - if (audctl&4) return DivChannelPair("filter",2); + if (audctl&4) ret.push_back(DivChannelPair("filter",2)); break; case 1: - if (audctl&16) return DivChannelPair("16-bit",0); + if (audctl&16) ret.push_back(DivChannelPair("16-bit",0)); break; case 2: - if (audctl&8) return DivChannelPair("16-bit",3); + if (audctl&8) ret.push_back(DivChannelPair("16-bit",3)); break; case 3: - if (audctl&2) return DivChannelPair("filter",1); + if (audctl&2) ret.push_back(DivChannelPair("filter",1)); break; } - return DivChannelPair(); } DivDispatchOscBuffer* DivPlatformPOKEY::getOscBuffer(int ch) { diff --git a/src/engine/platform/pokey.h b/src/engine/platform/pokey.h index 6407c0778..4a973e5e9 100644 --- a/src/engine/platform/pokey.h +++ b/src/engine/platform/pokey.h @@ -65,7 +65,7 @@ class DivPlatformPOKEY: public DivDispatch { int dispatch(DivCommand c); void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivDispatchOscBuffer* getOscBuffer(int chan); unsigned char* getRegisterPool(); int getRegisterPoolSize(); diff --git a/src/engine/platform/sid3.cpp b/src/engine/platform/sid3.cpp index 63b4ab629..274d02de5 100644 --- a/src/engine/platform/sid3.cpp +++ b/src/engine/platform/sid3.cpp @@ -1244,26 +1244,27 @@ void DivPlatformSID3::setFlags(const DivConfig& flags) { } } -DivChannelPair DivPlatformSID3::getPaired(int ch) +void DivPlatformSID3::getPaired(int ch, std::vector& ret) { if(chan[ch].phase) { - return DivChannelPair("phase", chan[ch].phaseSrc); + ret.push_back(DivChannelPair("phase", chan[ch].phaseSrc)); } if(chan[ch].ring) { if(chan[ch].ringSrc == SID3_NUM_CHANNELS) { - return DivChannelPair("ring", ch); + ret.push_back(DivChannelPair("ring", ch)); + } + else + { + ret.push_back(DivChannelPair("ring", chan[ch].ringSrc)); } - - return DivChannelPair("ring", chan[ch].ringSrc); } if(chan[ch].sync) { - return DivChannelPair("sync", chan[ch].syncSrc); + ret.push_back(DivChannelPair("sync", chan[ch].syncSrc)); } - return DivChannelPair(); } int DivPlatformSID3::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { diff --git a/src/engine/platform/sid3.h b/src/engine/platform/sid3.h index 699c32ac3..7f32da440 100644 --- a/src/engine/platform/sid3.h +++ b/src/engine/platform/sid3.h @@ -250,7 +250,7 @@ class DivPlatformSID3: public DivDispatch { const char** getRegisterSheet(); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); int getOutputCount(); - DivChannelPair getPaired(int ch); + void getPaired(int ch, std::vector& ret); void quit(); ~DivPlatformSID3(); }; diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 4c133ec28..f0fc24bce 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -710,11 +710,10 @@ unsigned short DivPlatformSNES::getPan(int ch) { return (chan[ch].panL<<8)|chan[ch].panR; } -DivChannelPair DivPlatformSNES::getPaired(int ch) { +void DivPlatformSNES::getPaired(int ch, std::vector& ret) { if (chan[ch].pitchMod) { - return DivChannelPair("mod",(ch-1)&7); + ret.push_back(DivChannelPair("mod",(ch-1)&7)); } - return DivChannelPair(); } DivChannelModeHints DivPlatformSNES::getModeHints(int ch) { diff --git a/src/engine/platform/snes.h b/src/engine/platform/snes.h index a2eea2853..b61b12f0e 100644 --- a/src/engine/platform/snes.h +++ b/src/engine/platform/snes.h @@ -102,7 +102,7 @@ class DivPlatformSNES: public DivDispatch { void* getChanState(int chan); DivMacroInt* getChanMacroInt(int ch); unsigned short getPan(int chan); - DivChannelPair getPaired(int chan); + void getPaired(int ch, std::vector& ret); DivChannelModeHints getModeHints(int chan); DivSamplePos getSamplePos(int ch); DivDispatchOscBuffer* getOscBuffer(int chan); diff --git a/src/gui/pattern.cpp b/src/gui/pattern.cpp index a2568bd31..4111a4d83 100644 --- a/src/gui/pattern.cpp +++ b/src/gui/pattern.cpp @@ -1282,116 +1282,123 @@ void FurnaceGUI::drawPattern() { memset(floors,0,4*4*sizeof(unsigned int)); for (int i=0; icurSubSong->chanShow[i]) { - continue; - } + - DivChannelPair pairs=e->getChanPaired(i); - for (int j=0; j<8; j++) { - if (pairs.pairs[j]==-1) continue; - int pairCh=e->dispatchFirstChan[i]+pairs.pairs[j]; - if (!e->curSubSong->chanShow[pairCh]) { + std::vector pairs; + e->getChanPaired(i, pairs); + + for(DivChannelPair pair: pairs) + { + bool isPaired=false; + int numPairs=0; + unsigned int pairMin=i; + unsigned int pairMax=i; + unsigned char curFloor=0; + if (!e->curSubSong->chanShow[i]) { continue; } - isPaired=true; - if ((unsigned int)pairChpairMax) pairMax=pairCh; - } - if (!isPaired) continue; - - float posY=chanHeadBottom; - - // find a free floor - while (curFloor<4) { - bool free=true; - for (unsigned int j=pairMin; j<=pairMax; j++) { - const unsigned int j0=j>>5; - const unsigned int j1=1U<<(j&31); - if (floors[curFloor][j0]&j1) { - free=false; - break; + for (int j=0; j<8; j++) { + if (pair.pairs[j]==-1) continue; + int pairCh=e->dispatchFirstChan[i]+pair.pairs[j]; + if (!e->curSubSong->chanShow[pairCh]) { + continue; } - } - if (free) break; - curFloor++; - } - if (curFloor<4) { - // occupy floor - floors[curFloor][pairMin>>5]|=1U<<(pairMin&31); - floors[curFloor][pairMax>>5]|=1U<<(pairMax&31); - } - - pos=(patChanX[i+1]+patChanX[i])*0.5; - posCenter=pos; - posMin=pos; - posMax=pos; - numPairs++; - - if (pairs.label==NULL) { - textSize=ImGui::CalcTextSize("???"); - } else { - textSize=ImGui::CalcTextSize(pairs.label); - } - - posY+=(textSize.y+ImGui::GetStyle().ItemSpacing.y)*curFloor; - - tdl->AddLine( - ImVec2(pos,chanHeadBottom), - ImVec2(pos,posY+textSize.y), - ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), - 2.0f*dpiScale - ); - - for (int j=0; j<8; j++) { - if (pairs.pairs[j]==-1) continue; - int pairCh=e->dispatchFirstChan[i]+pairs.pairs[j]; - if (!e->curSubSong->chanShow[pairCh]) { - continue; + isPaired=true; + if ((unsigned int)pairChpairMax) pairMax=pairCh; } - pos=(patChanX[pairCh+1]+patChanX[pairCh])*0.5; - posCenter+=pos; + if (!isPaired) continue; + + float posY=chanHeadBottom; + + // find a free floor + while (curFloor<4) { + bool free=true; + for (unsigned int j=pairMin; j<=pairMax; j++) { + const unsigned int j0=j>>5; + const unsigned int j1=1U<<(j&31); + if (floors[curFloor][j0]&j1) { + free=false; + break; + } + } + if (free) break; + curFloor++; + } + if (curFloor<4) { + // occupy floor + floors[curFloor][pairMin>>5]|=1U<<(pairMin&31); + floors[curFloor][pairMax>>5]|=1U<<(pairMax&31); + } + + pos=(patChanX[i+1]+patChanX[i])*0.5; + posCenter=pos; + posMin=pos; + posMax=pos; numPairs++; - if (posposMax) posMax=pos; + + if (pair.label==NULL) { + textSize=ImGui::CalcTextSize("???"); + } else { + textSize=ImGui::CalcTextSize(pair.label); + } + + posY+=(textSize.y+ImGui::GetStyle().ItemSpacing.y)*curFloor; + tdl->AddLine( ImVec2(pos,chanHeadBottom), ImVec2(pos,posY+textSize.y), ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), 2.0f*dpiScale ); - } - posCenter/=numPairs; + for (int j=0; j<8; j++) { + if (pair.pairs[j]==-1) continue; + int pairCh=e->dispatchFirstChan[i]+pair.pairs[j]; + if (!e->curSubSong->chanShow[pairCh]) { + continue; + } - if (pairs.label==NULL) { - tdl->AddLine( - ImVec2(posMin,posY+textSize.y), - ImVec2(posMax,posY+textSize.y), - ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), - 2.0f*dpiScale - ); - } else { - tdl->AddLine( - ImVec2(posMin,posY+textSize.y), - ImVec2(posCenter-textSize.x*0.5-6.0f*dpiScale,posY+textSize.y), - ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), - 2.0f*dpiScale - ); - tdl->AddLine( - ImVec2(posCenter+textSize.x*0.5+6.0f*dpiScale,posY+textSize.y), - ImVec2(posMax,posY+textSize.y), - ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), - 2.0f*dpiScale - ); + pos=(patChanX[pairCh+1]+patChanX[pairCh])*0.5; + posCenter+=pos; + numPairs++; + if (posposMax) posMax=pos; + tdl->AddLine( + ImVec2(pos,chanHeadBottom), + ImVec2(pos,posY+textSize.y), + ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), + 2.0f*dpiScale + ); + } - delayedLabels.push_back(DelayedLabel(posCenter,posY,textSize,pairs.label)); + posCenter/=numPairs; + + if (pair.label==NULL) { + tdl->AddLine( + ImVec2(posMin,posY+textSize.y), + ImVec2(posMax,posY+textSize.y), + ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), + 2.0f*dpiScale + ); + } else { + tdl->AddLine( + ImVec2(posMin,posY+textSize.y), + ImVec2(posCenter-textSize.x*0.5-6.0f*dpiScale,posY+textSize.y), + ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), + 2.0f*dpiScale + ); + tdl->AddLine( + ImVec2(posCenter+textSize.x*0.5+6.0f*dpiScale,posY+textSize.y), + ImVec2(posMax,posY+textSize.y), + ImGui::GetColorU32(uiColors[GUI_COLOR_PATTERN_PAIR]), + 2.0f*dpiScale + ); + + delayedLabels.push_back(DelayedLabel(posCenter,posY,textSize,pair.label)); + } } }