YM2612: fix forceIns DAC clicking
This commit is contained in:
parent
bf2ef2742a
commit
58f789b9eb
|
@ -83,6 +83,7 @@ class DivPlatformFMBase: public DivDispatch {
|
||||||
|
|
||||||
unsigned char lastBusy;
|
unsigned char lastBusy;
|
||||||
int delay;
|
int delay;
|
||||||
|
bool flushFirst;
|
||||||
|
|
||||||
unsigned char regPool[512];
|
unsigned char regPool[512];
|
||||||
short oldWrites[512];
|
short oldWrites[512];
|
||||||
|
@ -103,7 +104,7 @@ class DivPlatformFMBase: public DivDispatch {
|
||||||
}
|
}
|
||||||
inline void urgentWrite(unsigned short a, unsigned char v) {
|
inline void urgentWrite(unsigned short a, unsigned char v) {
|
||||||
if (!skipRegisterWrites) {
|
if (!skipRegisterWrites) {
|
||||||
if (writes.empty()) {
|
if (writes.empty() || flushFirst) {
|
||||||
writes.push_back(QueuedWrite(a,v));
|
writes.push_back(QueuedWrite(a,v));
|
||||||
} else if (writes.size()>16 || writes.front().addrOrVal) {
|
} else if (writes.size()>16 || writes.front().addrOrVal) {
|
||||||
writes.push_back(QueuedWrite(a,v));
|
writes.push_back(QueuedWrite(a,v));
|
||||||
|
@ -118,9 +119,11 @@ class DivPlatformFMBase: public DivDispatch {
|
||||||
|
|
||||||
friend void putDispatchChan(void*,int,int);
|
friend void putDispatchChan(void*,int,int);
|
||||||
|
|
||||||
DivPlatformFMBase():DivDispatch(),
|
DivPlatformFMBase():
|
||||||
lastBusy(0),
|
DivDispatch(),
|
||||||
delay(0) {}
|
lastBusy(0),
|
||||||
|
delay(0),
|
||||||
|
flushFirst(false) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -141,23 +141,26 @@ void DivPlatformGenesis::acquire_nuked(short** buf, size_t len) {
|
||||||
|
|
||||||
os[0]=0; os[1]=0;
|
os[0]=0; os[1]=0;
|
||||||
for (int i=0; i<6; i++) {
|
for (int i=0; i<6; i++) {
|
||||||
if (!writes.empty() && --delay<0) {
|
if (!writes.empty()) {
|
||||||
delay=0;
|
if (--delay<0) {
|
||||||
QueuedWrite& w=writes.front();
|
delay=0;
|
||||||
if (w.addrOrVal) {
|
QueuedWrite& w=writes.front();
|
||||||
OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val);
|
if (w.addrOrVal) {
|
||||||
//printf("write: %x = %.2x\n",w.addr,w.val);
|
//logV("%.3x = %.2x",w.addr,w.val);
|
||||||
lastBusy=0;
|
OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val);
|
||||||
regPool[w.addr&0x1ff]=w.val;
|
lastBusy=0;
|
||||||
writes.pop_front();
|
regPool[w.addr&0x1ff]=w.val;
|
||||||
} else {
|
writes.pop_front();
|
||||||
lastBusy++;
|
} else {
|
||||||
if (fm.write_busy==0) {
|
lastBusy++;
|
||||||
//printf("busycounter: %d\n",lastBusy);
|
if (fm.write_busy==0) {
|
||||||
OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr);
|
OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr);
|
||||||
w.addrOrVal=true;
|
w.addrOrVal=true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
flushFirst=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
OPN2_Clock(&fm,o); os[0]+=o[0]; os[1]+=o[1];
|
OPN2_Clock(&fm,o); os[0]+=o[0]; os[1]+=o[1];
|
||||||
|
@ -207,6 +210,8 @@ void DivPlatformGenesis::acquire_ymfm(short** buf, size_t len) {
|
||||||
regPool[w.addr&0x1ff]=w.val;
|
regPool[w.addr&0x1ff]=w.val;
|
||||||
writes.pop_front();
|
writes.pop_front();
|
||||||
lastBusy=1;
|
lastBusy=1;
|
||||||
|
} else {
|
||||||
|
flushFirst=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ladder) {
|
if (ladder) {
|
||||||
|
@ -1127,6 +1132,7 @@ void DivPlatformGenesis::forceIns() {
|
||||||
rWrite(0x2b,0x80);
|
rWrite(0x2b,0x80);
|
||||||
}
|
}
|
||||||
immWrite(0x22,lfoValue);
|
immWrite(0x22,lfoValue);
|
||||||
|
flushFirst=true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DivPlatformGenesis::toggleRegisterDump(bool enable) {
|
void DivPlatformGenesis::toggleRegisterDump(bool enable) {
|
||||||
|
@ -1180,6 +1186,7 @@ void DivPlatformGenesis::reset() {
|
||||||
lfoValue=8;
|
lfoValue=8;
|
||||||
softPCMTimer=0;
|
softPCMTimer=0;
|
||||||
extMode=false;
|
extMode=false;
|
||||||
|
flushFirst=false;
|
||||||
|
|
||||||
if (softPCM) {
|
if (softPCM) {
|
||||||
chan[5].dacMode=true;
|
chan[5].dacMode=true;
|
||||||
|
@ -1282,6 +1289,7 @@ int DivPlatformGenesis::init(DivEngine* p, int channels, int sugRate, const DivC
|
||||||
dumpWrites=false;
|
dumpWrites=false;
|
||||||
ladder=false;
|
ladder=false;
|
||||||
skipRegisterWrites=false;
|
skipRegisterWrites=false;
|
||||||
|
flushFirst=false;
|
||||||
for (int i=0; i<10; i++) {
|
for (int i=0; i<10; i++) {
|
||||||
isMuted[i]=false;
|
isMuted[i]=false;
|
||||||
oscBuf[i]=new DivDispatchOscBuffer;
|
oscBuf[i]=new DivDispatchOscBuffer;
|
||||||
|
|
Loading…
Reference in New Issue