naive channel pair refactor (dumb replace one pair with vector of pairs)

This commit is contained in:
LTVA1 2024-08-14 20:01:16 +03:00
parent 0ea53fdae5
commit 7c324ec39d
19 changed files with 140 additions and 138 deletions

View file

@ -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<DivChannelPair>& ret);
/**
* get channel mode hints.

View file

@ -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<DivChannelPair>& ret) {
if (ch<0 || ch>=chans) return;
disCont[dispatchOfChan[ch]].dispatch->getPaired(dispatchChanOfChan[ch], ret);
}
DivChannelModeHints DivEngine::getChanModeHints(int ch) {

View file

@ -1109,7 +1109,7 @@ class DivEngine {
void* getDispatchChanState(int chan);
// get channel pairs
DivChannelPair getChanPaired(int chan);
void getChanPaired(int chan, std::vector<DivChannelPair>& ret);
// get channel mode hints
DivChannelModeHints getChanModeHints(int chan);

View file

@ -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<DivChannelPair>& ret) {
ret.push_back(DivChannelPair());
}
DivChannelModeHints DivDispatch::getModeHints(int chan) {

View file

@ -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<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
DivDispatchOscBuffer* getOscBuffer(int chan);
unsigned char* getRegisterPool();
int getRegisterPoolSize();

View file

@ -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<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
DivChannelModeHints getModeHints(int chan);
DivSamplePos getSamplePos(int ch);
DivDispatchOscBuffer* getOscBuffer(int chan);

View file

@ -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<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
DivDispatchOscBuffer* getOscBuffer(int chan);
int mapVelocity(int ch, float vel);
float getGain(int ch, int vol);

View file

@ -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<DivChannelPair>& ret) {
if (ch==1 && lfoMode>0) {
return DivChannelPair("mod",0);
ret.push_back(DivChannelPair("mod",0));
}
return DivChannelPair();
}
DivChannelModeHints DivPlatformPCE::getModeHints(int ch) {

View file

@ -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<DivChannelPair>& ret);
DivChannelModeHints getModeHints(int chan);
DivSamplePos getSamplePos(int ch);
DivDispatchOscBuffer* getOscBuffer(int chan);

View file

@ -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<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
DivDispatchOscBuffer* getOscBuffer(int chan);
unsigned char* getRegisterPool();
int getRegisterPoolSize();

View file

@ -1244,26 +1244,27 @@ void DivPlatformSID3::setFlags(const DivConfig& flags) {
}
}
DivChannelPair DivPlatformSID3::getPaired(int ch)
void DivPlatformSID3::getPaired(int ch, std::vector<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
void quit();
~DivPlatformSID3();
};

View file

@ -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<DivChannelPair>& 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) {

View file

@ -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<DivChannelPair>& ret);
DivChannelModeHints getModeHints(int chan);
DivSamplePos getSamplePos(int ch);
DivDispatchOscBuffer* getOscBuffer(int chan);

View file

@ -1282,6 +1282,13 @@ void FurnaceGUI::drawPattern() {
memset(floors,0,4*4*sizeof(unsigned int));
for (int i=0; i<chans; i++) {
std::vector<DivChannelPair> pairs;
e->getChanPaired(i, pairs);
for(DivChannelPair pair: pairs)
{
bool isPaired=false;
int numPairs=0;
unsigned int pairMin=i;
@ -1291,10 +1298,9 @@ void FurnaceGUI::drawPattern() {
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 (pair.pairs[j]==-1) continue;
int pairCh=e->dispatchFirstChan[i]+pair.pairs[j];
if (!e->curSubSong->chanShow[pairCh]) {
continue;
}
@ -1333,10 +1339,10 @@ void FurnaceGUI::drawPattern() {
posMax=pos;
numPairs++;
if (pairs.label==NULL) {
if (pair.label==NULL) {
textSize=ImGui::CalcTextSize("???");
} else {
textSize=ImGui::CalcTextSize(pairs.label);
textSize=ImGui::CalcTextSize(pair.label);
}
posY+=(textSize.y+ImGui::GetStyle().ItemSpacing.y)*curFloor;
@ -1349,8 +1355,8 @@ void FurnaceGUI::drawPattern() {
);
for (int j=0; j<8; j++) {
if (pairs.pairs[j]==-1) continue;
int pairCh=e->dispatchFirstChan[i]+pairs.pairs[j];
if (pair.pairs[j]==-1) continue;
int pairCh=e->dispatchFirstChan[i]+pair.pairs[j];
if (!e->curSubSong->chanShow[pairCh]) {
continue;
}
@ -1370,7 +1376,7 @@ void FurnaceGUI::drawPattern() {
posCenter/=numPairs;
if (pairs.label==NULL) {
if (pair.label==NULL) {
tdl->AddLine(
ImVec2(posMin,posY+textSize.y),
ImVec2(posMax,posY+textSize.y),
@ -1391,7 +1397,8 @@ void FurnaceGUI::drawPattern() {
2.0f*dpiScale
);
delayedLabels.push_back(DelayedLabel(posCenter,posY,textSize,pairs.label));
delayedLabels.push_back(DelayedLabel(posCenter,posY,textSize,pair.label));
}
}
}