prepare new dispatch

will allow for more than 2 outputs
This commit is contained in:
tildearrow 2023-01-01 19:46:08 -05:00
parent 565e8cc314
commit 08d2f12dbd
82 changed files with 178 additions and 161 deletions

View file

@ -33,4 +33,7 @@
// sample related // sample related
#define DIV_MAX_SAMPLE_TYPE 4 #define DIV_MAX_SAMPLE_TYPE 4
// dispatch
#define DIV_MAX_OUTPUTS 16
#endif #endif

View file

@ -322,12 +322,10 @@ class DivDispatch {
/** /**
* fill a buffer with sound data. * fill a buffer with sound data.
* @param bufL the left or mono channel buffer. * @param buf pointers to output buffers.
* @param bufR the right channel buffer.
* @param start the start offset.
* @param len the amount of samples to fill. * @param len the amount of samples to fill.
*/ */
virtual void acquire(short* bufL, short* bufR, size_t start, size_t len); virtual void acquire(short** buf, size_t len);
/** /**
* fill a write stream with data (e.g. for software-mixed PCM). * fill a write stream with data (e.g. for software-mixed PCM).
@ -413,10 +411,10 @@ class DivDispatch {
virtual void muteChannel(int ch, bool mute); virtual void muteChannel(int ch, bool mute);
/** /**
* test whether this dispatch outputs audio in two channels. * get the number of outputs this dispatch provides.
* @return whether it does. * @return number of outputs (usually 1 or 2 but may be more). SHALL NOT be less than one.
*/ */
virtual bool isStereo(); virtual int getOutputCount();
/** /**
* test whether sending a key off command to a channel should reset arp too. * test whether sending a key off command to a channel should reset arp too.

View file

@ -89,7 +89,11 @@ void DivDispatchContainer::setQuality(bool lowQual) {
} }
void DivDispatchContainer::acquire(size_t offset, size_t count) { void DivDispatchContainer::acquire(size_t offset, size_t count) {
dispatch->acquire(bbIn[0],bbIn[1],offset,count); int outs=dispatch->getOutputCount();
for (int i=0; i<outs; i++) {
bbInMapped[i]=&bbIn[i][offset];
}
dispatch->acquire(bbInMapped,count);
} }
void DivDispatchContainer::flush(size_t count) { void DivDispatchContainer::flush(size_t count) {
@ -166,26 +170,10 @@ void DivDispatchContainer::clear() {
} }
void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) { void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, double gotRate, const DivConfig& flags) {
// quit if we already initialized
if (dispatch!=NULL) return; if (dispatch!=NULL) return;
bb[0]=blip_new(32768); // initialize chip
if (bb[0]==NULL) {
logE("not enough memory!");
return;
}
bb[1]=blip_new(32768);
if (bb[1]==NULL) {
logE("not enough memory!");
return;
}
bbOut[0]=new short[32768];
bbOut[1]=new short[32768];
bbIn[0]=new short[32768];
bbIn[1]=new short[32768];
bbInLen=32768;
switch (sys) { switch (sys) {
case DIV_SYSTEM_YMU759: case DIV_SYSTEM_YMU759:
dispatch=new DivPlatformOPL; dispatch=new DivPlatformOPL;
@ -461,6 +449,23 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
break; break;
} }
dispatch->init(eng,chanCount,gotRate,flags); dispatch->init(eng,chanCount,gotRate,flags);
// initialize output buffers
int outs=dispatch->getOutputCount();
bbInLen=32768;
for (int i=0; i<outs; i++) {
bb[i]=blip_new(bbInLen);
if (bb[i]==NULL) {
logE("not enough memory!");
return;
}
bbIn[i]=new short[bbInLen];
bbOut[i]=new short[bbInLen];
memset(bbIn,0,bbInLen*sizeof(short));
memset(bbOut,0,bbInLen*sizeof(short));
}
} }
void DivDispatchContainer::quit() { void DivDispatchContainer::quit() {
@ -469,11 +474,19 @@ void DivDispatchContainer::quit() {
delete dispatch; delete dispatch;
dispatch=NULL; dispatch=NULL;
delete[] bbOut[0]; for (int i=0; i<DIV_MAX_OUTPUTS; i++) {
delete[] bbOut[1]; if (bbOut[i]!=NULL) {
delete[] bbIn[0]; delete[] bbOut[i];
delete[] bbIn[1]; bbOut[i]=NULL;
}
if (bbIn[i]!=NULL) {
delete[] bbIn[i];
bbIn[i]=NULL;
}
if (bb[i]!=NULL) {
blip_delete(bb[i]);
bb[i]=NULL;
}
}
bbInLen=0; bbInLen=0;
blip_delete(bb[0]);
blip_delete(bb[1]);
} }

View file

@ -170,11 +170,12 @@ struct DivNoteEvent {
struct DivDispatchContainer { struct DivDispatchContainer {
DivDispatch* dispatch; DivDispatch* dispatch;
blip_buffer_t* bb[2]; blip_buffer_t* bb[DIV_MAX_OUTPUTS];
size_t bbInLen, runtotal, runLeft, runPos, lastAvail; size_t bbInLen, runtotal, runLeft, runPos, lastAvail;
int temp[2], prevSample[2]; int temp[DIV_MAX_OUTPUTS], prevSample[DIV_MAX_OUTPUTS];
short* bbIn[2]; short* bbInMapped[DIV_MAX_OUTPUTS];
short* bbOut[2]; short* bbIn[DIV_MAX_OUTPUTS];
short* bbOut[DIV_MAX_OUTPUTS];
bool lowQuality, dcOffCompensation; bool lowQuality, dcOffCompensation;
void setRates(double gotRate); void setRates(double gotRate);
@ -187,18 +188,20 @@ struct DivDispatchContainer {
void quit(); void quit();
DivDispatchContainer(): DivDispatchContainer():
dispatch(NULL), dispatch(NULL),
bb{NULL,NULL},
bbInLen(0), bbInLen(0),
runtotal(0), runtotal(0),
runLeft(0), runLeft(0),
runPos(0), runPos(0),
lastAvail(0), lastAvail(0),
temp{0,0},
prevSample{0,0},
bbIn{NULL,NULL},
bbOut{NULL,NULL},
lowQuality(false), lowQuality(false),
dcOffCompensation(false) {} dcOffCompensation(false) {
memset(bb,0,DIV_MAX_OUTPUTS*sizeof(void*));
memset(temp,0,DIV_MAX_OUTPUTS*sizeof(int));
memset(prevSample,0,DIV_MAX_OUTPUTS*sizeof(int));
memset(bbIn,0,DIV_MAX_OUTPUTS*sizeof(void*));
memset(bbInMapped,0,DIV_MAX_OUTPUTS*sizeof(void*));
memset(bbOut,0,DIV_MAX_OUTPUTS*sizeof(void*));
}
}; };
typedef int EffectValConversion(unsigned char,unsigned char); typedef int EffectValConversion(unsigned char,unsigned char);

View file

@ -19,7 +19,7 @@
#include "../dispatch.h" #include "../dispatch.h"
void DivDispatch::acquire(short* bufL, short* bufR, size_t start, size_t len) { void DivDispatch::acquire(short** buf, size_t len) {
} }
void DivDispatch::fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len) { void DivDispatch::fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len) {
@ -69,8 +69,8 @@ int DivDispatch::dispatch(DivCommand c) {
void DivDispatch::reset() { void DivDispatch::reset() {
} }
bool DivDispatch::isStereo() { int DivDispatch::getOutputCount() {
return false; return 1;
} }
bool DivDispatch::keyOffAffectsArp(int ch) { bool DivDispatch::keyOffAffectsArp(int ch) {

View file

@ -401,8 +401,8 @@ void DivPlatformAmiga::reset() {
filtConst=filterOn?filtConstOn:filtConstOff; filtConst=filterOn?filtConstOn:filtConstOff;
} }
bool DivPlatformAmiga::isStereo() { int DivPlatformAmiga::getOutputCount() {
return true; return 2;
} }
bool DivPlatformAmiga::keyOffAffectsArp(int ch) { bool DivPlatformAmiga::keyOffAffectsArp(int ch) {

View file

@ -75,7 +75,7 @@ class DivPlatformAmiga: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);

View file

@ -885,8 +885,8 @@ void DivPlatformArcade::setFlags(const DivConfig& flags) {
} }
} }
bool DivPlatformArcade::isStereo() { int DivPlatformArcade::getOutputCount() {
return true; return 2;
} }
void DivPlatformArcade::setYMFM(bool use) { void DivPlatformArcade::setYMFM(bool use) {

View file

@ -77,7 +77,7 @@ class DivPlatformArcade: public DivPlatformOPM {
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
void setYMFM(bool use); void setYMFM(bool use);
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);

View file

@ -751,8 +751,8 @@ void DivPlatformAY8910::reset() {
portBVal=0; portBVal=0;
} }
bool DivPlatformAY8910::isStereo() { int DivPlatformAY8910::getOutputCount() {
return true; return 2;
} }
bool DivPlatformAY8910::keyOffAffectsArp(int ch) { bool DivPlatformAY8910::keyOffAffectsArp(int ch) {

View file

@ -140,7 +140,7 @@ class DivPlatformAY8910: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
bool getDCOffRequired(); bool getDCOffRequired();

View file

@ -747,8 +747,8 @@ void DivPlatformAY8930::reset() {
immWrite(0x1a,0x00); // or mask immWrite(0x1a,0x00); // or mask
} }
bool DivPlatformAY8930::isStereo() { int DivPlatformAY8930::getOutputCount() {
return true; return 2;
} }
bool DivPlatformAY8930::keyOffAffectsArp(int ch) { bool DivPlatformAY8930::keyOffAffectsArp(int ch) {

View file

@ -142,7 +142,7 @@ class DivPlatformAY8930: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -306,8 +306,8 @@ void DivPlatformBubSysWSG::reset() {
k005289.reset(); k005289.reset();
} }
bool DivPlatformBubSysWSG::isStereo() { int DivPlatformBubSysWSG::getOutputCount() {
return false; return 1;
} }
bool DivPlatformBubSysWSG::keyOffAffectsArp(int ch) { bool DivPlatformBubSysWSG::keyOffAffectsArp(int ch) {

View file

@ -56,7 +56,7 @@ class DivPlatformBubSysWSG: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);

View file

@ -361,8 +361,8 @@ void DivPlatformGA20::reset() {
} }
} }
bool DivPlatformGA20::isStereo() { int DivPlatformGA20::getOutputCount() {
return false; return 1;
} }
void DivPlatformGA20::notifyInsChange(int ins) { void DivPlatformGA20::notifyInsChange(int ins) {

View file

@ -85,7 +85,7 @@ class DivPlatformGA20: public DivDispatch, public iremga20_intf {
virtual void forceIns() override; virtual void forceIns() override;
virtual void tick(bool sysTick=true) override; virtual void tick(bool sysTick=true) override;
virtual void muteChannel(int ch, bool mute) override; virtual void muteChannel(int ch, bool mute) override;
virtual bool isStereo() override; virtual int getOutputCount() override;
virtual void notifyInsChange(int ins) override; virtual void notifyInsChange(int ins) override;
virtual void notifyWaveChange(int wave) override; virtual void notifyWaveChange(int wave) override;
virtual void notifyInsDeletion(void* ins) override; virtual void notifyInsDeletion(void* ins) override;

View file

@ -604,8 +604,8 @@ int DivPlatformGB::getPortaFloor(int ch) {
return 24; return 24;
} }
bool DivPlatformGB::isStereo() { int DivPlatformGB::getOutputCount() {
return true; return 2;
} }
bool DivPlatformGB::getDCOffRequired() { bool DivPlatformGB::getDCOffRequired() {

View file

@ -90,7 +90,7 @@ class DivPlatformGB: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
int getPortaFloor(int ch); int getPortaFloor(int ch);
bool isStereo(); int getOutputCount();
bool getDCOffRequired(); bool getDCOffRequired();
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);

View file

@ -1193,8 +1193,8 @@ void DivPlatformGenesis::reset() {
delay=0; delay=0;
} }
bool DivPlatformGenesis::isStereo() { int DivPlatformGenesis::getOutputCount() {
return true; return 2;
} }
bool DivPlatformGenesis::keyOffAffectsArp(int ch) { bool DivPlatformGenesis::keyOffAffectsArp(int ch) {

View file

@ -110,7 +110,7 @@ class DivPlatformGenesis: public DivPlatformOPN {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void setYMFM(bool use); void setYMFM(bool use);
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
bool keyOffAffectsPorta(int ch); bool keyOffAffectsPorta(int ch);

View file

@ -448,8 +448,8 @@ void DivPlatformK007232::reset() {
} }
} }
bool DivPlatformK007232::isStereo() { int DivPlatformK007232::getOutputCount() {
return stereo; return stereo?2:1;
} }
void DivPlatformK007232::notifyInsChange(int ins) { void DivPlatformK007232::notifyInsChange(int ins) {

View file

@ -91,7 +91,7 @@ class DivPlatformK007232: public DivDispatch, public k007232_intf {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -393,8 +393,8 @@ void DivPlatformLynx::muteChannel(int ch, bool mute) {
if (chan[ch].active) WRITE_VOLUME(ch,(isMuted[ch]?0:(chan[ch].outVol&127))); if (chan[ch].active) WRITE_VOLUME(ch,(isMuted[ch]?0:(chan[ch].outVol&127)));
} }
bool DivPlatformLynx::isStereo() { int DivPlatformLynx::getOutputCount() {
return true; return 2;
} }
void DivPlatformLynx::forceIns() { void DivPlatformLynx::forceIns() {

View file

@ -79,7 +79,7 @@ class DivPlatformLynx: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
bool keyOffAffectsPorta(int ch); bool keyOffAffectsPorta(int ch);
//int getPortaFloor(int ch); //int getPortaFloor(int ch);

View file

@ -371,8 +371,8 @@ void DivPlatformMSM5232::reset() {
} }
} }
bool DivPlatformMSM5232::isStereo() { int DivPlatformMSM5232::getOutputCount() {
return false; return 1;
} }
bool DivPlatformMSM5232::keyOffAffectsArp(int ch) { bool DivPlatformMSM5232::keyOffAffectsArp(int ch) {

View file

@ -71,7 +71,7 @@ class DivPlatformMSM5232: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -336,8 +336,8 @@ void DivPlatformMSM6258::reset() {
delay=0; delay=0;
} }
bool DivPlatformMSM6258::isStereo() { int DivPlatformMSM6258::getOutputCount() {
return true; return 2;
} }
bool DivPlatformMSM6258::keyOffAffectsArp(int ch) { bool DivPlatformMSM6258::keyOffAffectsArp(int ch) {

View file

@ -69,7 +69,7 @@ class DivPlatformMSM6258: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -494,8 +494,8 @@ void DivPlatformNamcoWSG::reset() {
namco->device_start(NULL); namco->device_start(NULL);
} }
bool DivPlatformNamcoWSG::isStereo() { int DivPlatformNamcoWSG::getOutputCount() {
return (devType==30); return (devType==30)?2:1;
} }
bool DivPlatformNamcoWSG::keyOffAffectsArp(int ch) { bool DivPlatformNamcoWSG::keyOffAffectsArp(int ch) {

View file

@ -65,7 +65,7 @@ class DivPlatformNamcoWSG: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setDeviceType(int type); void setDeviceType(int type);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);

View file

@ -1568,8 +1568,8 @@ void DivPlatformOPL::reset() {
immWrite(0xbd,(dam<<7)|(dvb<<6)|(properDrums<<5)|drumState); immWrite(0xbd,(dam<<7)|(dvb<<6)|(properDrums<<5)|drumState);
} }
bool DivPlatformOPL::isStereo() { int DivPlatformOPL::getOutputCount() {
return (oplType==3 || oplType==759); return (oplType==3 || oplType==759)?4:1;
} }
bool DivPlatformOPL::keyOffAffectsArp(int ch) { bool DivPlatformOPL::keyOffAffectsArp(int ch) {

View file

@ -119,7 +119,7 @@ class DivPlatformOPL: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void setYMFM(bool use); void setYMFM(bool use);
void setOPLType(int type, bool drums); void setOPLType(int type, bool drums);
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);

View file

@ -547,8 +547,8 @@ void DivPlatformPCE::reset() {
delay=500; delay=500;
} }
bool DivPlatformPCE::isStereo() { int DivPlatformPCE::getOutputCount() {
return true; return 2;
} }
bool DivPlatformPCE::keyOffAffectsArp(int ch) { bool DivPlatformPCE::keyOffAffectsArp(int ch) {

View file

@ -87,7 +87,7 @@ class DivPlatformPCE: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);

View file

@ -410,8 +410,8 @@ void DivPlatformPCMDAC::reset() {
chan[0].ws.init(NULL,32,255); chan[0].ws.init(NULL,32,255);
} }
bool DivPlatformPCMDAC::isStereo() { int DivPlatformPCMDAC::getOutputCount() {
return true; return 2;
} }
DivMacroInt* DivPlatformPCMDAC::getChanMacroInt(int ch) { DivMacroInt* DivPlatformPCMDAC::getChanMacroInt(int ch) {

View file

@ -75,7 +75,7 @@ class DivPlatformPCMDAC: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsChange(int ins); void notifyInsChange(int ins);

View file

@ -287,8 +287,8 @@ void DivPlatformPET::reset() {
chan[0].std.setEngine(parent); chan[0].std.setEngine(parent);
} }
bool DivPlatformPET::isStereo() { int DivPlatformPET::getOutputCount() {
return false; return 1;
} }
void DivPlatformPET::notifyInsDeletion(void* ins) { void DivPlatformPET::notifyInsDeletion(void* ins) {

View file

@ -57,7 +57,7 @@ class DivPlatformPET: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();

View file

@ -636,8 +636,8 @@ void DivPlatformQSound::reset() {
immWrite(Q1_ECHO_FEEDBACK, echoFeedback << 6); immWrite(Q1_ECHO_FEEDBACK, echoFeedback << 6);
} }
bool DivPlatformQSound::isStereo() { int DivPlatformQSound::getOutputCount() {
return true; return 2;
} }
bool DivPlatformQSound::keyOffAffectsArp(int ch) { bool DivPlatformQSound::keyOffAffectsArp(int ch) {

View file

@ -74,7 +74,7 @@ class DivPlatformQSound: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsChange(int ins); void notifyInsChange(int ins);

View file

@ -332,8 +332,8 @@ void DivPlatformRF5C68::reset() {
} }
} }
bool DivPlatformRF5C68::isStereo() { int DivPlatformRF5C68::getOutputCount() {
return true; return 2;
} }
void DivPlatformRF5C68::notifyInsChange(int ins) { void DivPlatformRF5C68::notifyInsChange(int ins) {

View file

@ -67,7 +67,7 @@ class DivPlatformRF5C68: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void setChipModel(int type); void setChipModel(int type);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);

View file

@ -419,8 +419,8 @@ void DivPlatformSAA1099::reset() {
rWrite(0x1c,1); rWrite(0x1c,1);
} }
bool DivPlatformSAA1099::isStereo() { int DivPlatformSAA1099::getOutputCount() {
return true; return 2;
} }
int DivPlatformSAA1099::getPortaFloor(int ch) { int DivPlatformSAA1099::getPortaFloor(int ch) {

View file

@ -86,7 +86,7 @@ class DivPlatformSAA1099: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
int getPortaFloor(int ch); int getPortaFloor(int ch);
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -335,8 +335,8 @@ void DivPlatformSCC::reset() {
lastUpdated34=0; lastUpdated34=0;
} }
bool DivPlatformSCC::isStereo() { int DivPlatformSCC::getOutputCount() {
return false; return 1;
} }
void DivPlatformSCC::notifyWaveChange(int wave) { void DivPlatformSCC::notifyWaveChange(int wave) {

View file

@ -61,7 +61,7 @@ class DivPlatformSCC: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void notifyWaveChange(int wave); void notifyWaveChange(int wave);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);

View file

@ -502,8 +502,8 @@ void DivPlatformSegaPCM::setFlags(const DivConfig& flags) {
} }
} }
bool DivPlatformSegaPCM::isStereo() { int DivPlatformSegaPCM::getOutputCount() {
return true; return 2;
} }
int DivPlatformSegaPCM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { int DivPlatformSegaPCM::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {

View file

@ -91,7 +91,7 @@ class DivPlatformSegaPCM: public DivDispatch {
void notifyInsChange(int ins); void notifyInsChange(int ins);
void renderSamples(int chipID); void renderSamples(int chipID);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags); int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags);

View file

@ -444,8 +444,8 @@ void DivPlatformSMS::reset() {
} }
} }
bool DivPlatformSMS::isStereo() { int DivPlatformSMS::getOutputCount() {
return stereo; return stereo?2:1;
} }
bool DivPlatformSMS::keyOffAffectsArp(int ch) { bool DivPlatformSMS::keyOffAffectsArp(int ch) {

View file

@ -78,7 +78,7 @@ class DivPlatformSMS: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
bool keyOffAffectsPorta(int ch); bool keyOffAffectsPorta(int ch);
int getPortaFloor(int ch); int getPortaFloor(int ch);

View file

@ -768,8 +768,8 @@ void DivPlatformSNES::reset() {
initEcho(); initEcho();
} }
bool DivPlatformSNES::isStereo() { int DivPlatformSNES::getOutputCount() {
return true; return 2;
} }
void DivPlatformSNES::notifyInsChange(int ins) { void DivPlatformSNES::notifyInsChange(int ins) {

View file

@ -104,7 +104,7 @@ class DivPlatformSNES: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);

View file

@ -499,8 +499,8 @@ void DivPlatformSoundUnit::reset() {
rWrite(0xbd,fil1); rWrite(0xbd,fil1);
} }
bool DivPlatformSoundUnit::isStereo() { int DivPlatformSoundUnit::getOutputCount() {
return true; return 2;
} }
bool DivPlatformSoundUnit::keyOffAffectsArp(int ch) { bool DivPlatformSoundUnit::keyOffAffectsArp(int ch) {

View file

@ -109,7 +109,7 @@ class DivPlatformSoundUnit: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -490,8 +490,8 @@ void DivPlatformSwan::reset() {
rWrite(0x11,0x09); // enable speakers rWrite(0x11,0x09); // enable speakers
} }
bool DivPlatformSwan::isStereo() { int DivPlatformSwan::getOutputCount() {
return true; return 2;
} }
void DivPlatformSwan::notifyWaveChange(int wave) { void DivPlatformSwan::notifyWaveChange(int wave) {

View file

@ -69,7 +69,7 @@ class DivPlatformSwan: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();

View file

@ -335,8 +335,8 @@ void DivPlatformT6W28::reset() {
rWrite(1,0xe7); rWrite(1,0xe7);
} }
bool DivPlatformT6W28::isStereo() { int DivPlatformT6W28::getOutputCount() {
return true; return 2;
} }
bool DivPlatformT6W28::keyOffAffectsArp(int ch) { bool DivPlatformT6W28::keyOffAffectsArp(int ch) {

View file

@ -70,7 +70,7 @@ class DivPlatformT6W28: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -342,8 +342,8 @@ float DivPlatformTIA::getPostAmp() {
return 0.5f; return 0.5f;
} }
bool DivPlatformTIA::isStereo() { int DivPlatformTIA::getOutputCount() {
return (mixingType==2); return (mixingType==2)?2:1;
} }
bool DivPlatformTIA::keyOffAffectsArp(int ch) { bool DivPlatformTIA::keyOffAffectsArp(int ch) {

View file

@ -58,7 +58,7 @@ class DivPlatformTIA: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
float getPostAmp(); float getPostAmp();
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);

View file

@ -947,8 +947,8 @@ void DivPlatformTX81Z::setFlags(const DivConfig& flags) {
} }
} }
bool DivPlatformTX81Z::isStereo() { int DivPlatformTX81Z::getOutputCount() {
return true; return 2;
} }
int DivPlatformTX81Z::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { int DivPlatformTX81Z::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {

View file

@ -73,7 +73,7 @@ class DivPlatformTX81Z: public DivPlatformOPM {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();

View file

@ -465,8 +465,8 @@ void DivPlatformVB::reset() {
delay=500; delay=500;
} }
bool DivPlatformVB::isStereo() { int DivPlatformVB::getOutputCount() {
return true; return 2;
} }
bool DivPlatformVB::keyOffAffectsArp(int ch) { bool DivPlatformVB::keyOffAffectsArp(int ch) {

View file

@ -76,7 +76,7 @@ class DivPlatformVB: public DivDispatch {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
float getPostAmp(); float getPostAmp();
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);

View file

@ -406,8 +406,8 @@ float DivPlatformVERA::getPostAmp() {
return 4.0f; return 4.0f;
} }
bool DivPlatformVERA::isStereo() { int DivPlatformVERA::getOutputCount() {
return true; return 2;
} }
void DivPlatformVERA::notifyInsDeletion(void* ins) { void DivPlatformVERA::notifyInsDeletion(void* ins) {

View file

@ -72,7 +72,7 @@ class DivPlatformVERA: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
float getPostAmp(); float getPostAmp();
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();

View file

@ -299,8 +299,8 @@ void DivPlatformVIC20::reset() {
vic_sound_clock(vic,4); vic_sound_clock(vic,4);
} }
bool DivPlatformVIC20::isStereo() { int DivPlatformVIC20::getOutputCount() {
return false; return 1;
} }
void DivPlatformVIC20::notifyInsDeletion(void* ins) { void DivPlatformVIC20::notifyInsDeletion(void* ins) {

View file

@ -56,7 +56,7 @@ class DivPlatformVIC20: public DivDispatch {
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);
bool isStereo(); int getOutputCount();
void poke(unsigned int addr, unsigned short val); void poke(unsigned int addr, unsigned short val);
void poke(std::vector<DivRegWrite>& wlist); void poke(std::vector<DivRegWrite>& wlist);
const char** getRegisterSheet(); const char** getRegisterSheet();

View file

@ -894,8 +894,8 @@ void DivPlatformX1_010::reset() {
} }
} }
bool DivPlatformX1_010::isStereo() { int DivPlatformX1_010::getOutputCount() {
return stereo; return stereo?2:1;
} }
bool DivPlatformX1_010::keyOffAffectsArp(int ch) { bool DivPlatformX1_010::keyOffAffectsArp(int ch) {

View file

@ -138,7 +138,7 @@ class DivPlatformX1_010: public DivDispatch, public vgsound_emu_mem_intf {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void setFlags(const DivConfig& flags); void setFlags(const DivConfig& flags);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);

View file

@ -967,8 +967,8 @@ void DivPlatformYM2203::reset() {
ay->flushWrites(); ay->flushWrites();
} }
bool DivPlatformYM2203::isStereo() { int DivPlatformYM2203::getOutputCount() {
return false; return 1;
} }
bool DivPlatformYM2203::keyOffAffectsArp(int ch) { bool DivPlatformYM2203::keyOffAffectsArp(int ch) {

View file

@ -70,7 +70,7 @@ class DivPlatformYM2203: public DivPlatformOPN {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -1424,8 +1424,8 @@ void DivPlatformYM2608::reset() {
ay->flushWrites(); ay->flushWrites();
} }
bool DivPlatformYM2608::isStereo() { int DivPlatformYM2608::getOutputCount() {
return true; return 2;
} }
bool DivPlatformYM2608::keyOffAffectsArp(int ch) { bool DivPlatformYM2608::keyOffAffectsArp(int ch) {

View file

@ -85,7 +85,7 @@ class DivPlatformYM2608: public DivPlatformOPN {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -1372,8 +1372,8 @@ void DivPlatformYM2610::reset() {
immWrite(0x1b,0xff); // B immWrite(0x1b,0xff); // B
} }
bool DivPlatformYM2610::isStereo() { int DivPlatformYM2610::getOutputCount() {
return true; return 2;
} }
bool DivPlatformYM2610::keyOffAffectsArp(int ch) { bool DivPlatformYM2610::keyOffAffectsArp(int ch) {

View file

@ -53,7 +53,7 @@ class DivPlatformYM2610: public DivPlatformYM2610Base {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -1443,8 +1443,8 @@ void DivPlatformYM2610B::reset() {
ay->flushWrites(); ay->flushWrites();
} }
bool DivPlatformYM2610B::isStereo() { int DivPlatformYM2610B::getOutputCount() {
return true; return 2;
} }
bool DivPlatformYM2610B::keyOffAffectsArp(int ch) { bool DivPlatformYM2610B::keyOffAffectsArp(int ch) {

View file

@ -49,7 +49,7 @@ class DivPlatformYM2610B: public DivPlatformYM2610Base {
void forceIns(); void forceIns();
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
bool isStereo(); int getOutputCount();
bool keyOffAffectsArp(int ch); bool keyOffAffectsArp(int ch);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyInsDeletion(void* ins); void notifyInsDeletion(void* ins);

View file

@ -119,8 +119,8 @@ class DivPlatformYM2610Base: public DivPlatformOPN {
} }
} }
bool isStereo() { int getOutputCount() {
return true; return 2;
} }
const void* getSampleMem(int index) { const void* getSampleMem(int index) {

View file

@ -372,8 +372,8 @@ void DivPlatformYMZ280B::reset() {
} }
} }
bool DivPlatformYMZ280B::isStereo() { int DivPlatformYMZ280B::getOutputCount() {
return true; return 2;
} }
void DivPlatformYMZ280B::notifyInsChange(int ins) { void DivPlatformYMZ280B::notifyInsChange(int ins) {

View file

@ -68,7 +68,7 @@ class DivPlatformYMZ280B: public DivDispatch {
void tick(bool sysTick=true); void tick(bool sysTick=true);
void muteChannel(int ch, bool mute); void muteChannel(int ch, bool mute);
float getPostAmp(); float getPostAmp();
bool isStereo(); int getOutputCount();
void setChipModel(int type); void setChipModel(int type);
void notifyInsChange(int ins); void notifyInsChange(int ins);
void notifyWaveChange(int wave); void notifyWaveChange(int wave);