SM8521: acquireDirect()
This commit is contained in:
parent
1c05bb8b05
commit
d1234ad59e
|
@ -719,11 +719,6 @@ void DivDispatchContainer::init(DivSystem sys, DivEngine* eng, int chanCount, do
|
|||
break;
|
||||
case DIV_SYSTEM_SM8521:
|
||||
dispatch=new DivPlatformSM8521;
|
||||
if (isRender) {
|
||||
((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQualityRender",3));
|
||||
} else {
|
||||
((DivPlatformSM8521*)dispatch)->setCoreQuality(eng->getConfInt("smQuality",3));
|
||||
}
|
||||
break;
|
||||
case DIV_SYSTEM_PV1000:
|
||||
dispatch=new DivPlatformPV1000;
|
||||
|
|
|
@ -47,7 +47,7 @@ const char** DivPlatformSM8521::getRegisterSheet() {
|
|||
return regCheatSheetSM8521;
|
||||
}
|
||||
|
||||
void DivPlatformSM8521::acquire(short** buf, size_t len) {
|
||||
void DivPlatformSM8521::acquireDirect(blip_buffer_t** bb, size_t len) {
|
||||
while (!writes.empty()) {
|
||||
QueuedWrite w=writes.front();
|
||||
sm8521_write(&sm8521,w.addr,w.val);
|
||||
|
@ -60,8 +60,29 @@ void DivPlatformSM8521::acquire(short** buf, size_t len) {
|
|||
}
|
||||
|
||||
for (size_t h=0; h<len; h++) {
|
||||
sm8521_sound_tick(&sm8521,coreQuality);
|
||||
buf[0][h]=sm8521.out<<6;
|
||||
int advance=len-h;
|
||||
if (sm8521.sgc&1) {
|
||||
const int remain=(sm8521.sg[0].base.t+1)-sm8521.sg[0].base.counter;
|
||||
if (remain<advance) advance=remain;
|
||||
}
|
||||
if (sm8521.sgc&2) {
|
||||
const int remain=(sm8521.sg[1].base.t+1)-sm8521.sg[1].base.counter;
|
||||
if (remain<advance) advance=remain;
|
||||
}
|
||||
if (sm8521.sgc&4) {
|
||||
const int remain=(sm8521.noise.base.t+1)-sm8521.noise.base.counter;
|
||||
if (remain<advance) advance=remain;
|
||||
}
|
||||
if (advance<1) advance=1;
|
||||
sm8521_sound_tick(&sm8521,advance);
|
||||
|
||||
h+=advance-1;
|
||||
|
||||
int out=sm8521.out<<6;
|
||||
if (out!=lastOut) {
|
||||
blip_add_delta(bb[0],h,out-lastOut);
|
||||
lastOut=out;
|
||||
}
|
||||
for (int i=0; i<2; i++) {
|
||||
oscBuf[i]->putSample(h,sm8521.sg[i].base.out<<7);
|
||||
}
|
||||
|
@ -346,6 +367,7 @@ void DivPlatformSM8521::reset() {
|
|||
addWrite(0xffffffff,0);
|
||||
}
|
||||
sm8521_reset(&sm8521);
|
||||
lastOut=0;
|
||||
rWrite(0x40,0x80); // initialize SGC
|
||||
}
|
||||
|
||||
|
@ -357,6 +379,10 @@ bool DivPlatformSM8521::keyOffAffectsArp(int ch) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool DivPlatformSM8521::hasAcquireDirect() {
|
||||
return true;
|
||||
}
|
||||
|
||||
void DivPlatformSM8521::notifyWaveChange(int wave) {
|
||||
for (int i=0; i<2; i++) {
|
||||
if (chan[i].wave==wave) {
|
||||
|
@ -376,7 +402,7 @@ void DivPlatformSM8521::setFlags(const DivConfig& flags) {
|
|||
chipClock=11059200;
|
||||
CHECK_CUSTOM_CLOCK;
|
||||
antiClickEnabled=!flags.getBool("noAntiClick",false);
|
||||
rate=chipClock/4/coreQuality; // CKIN -> fCLK(/2) -> Function blocks (/2)
|
||||
rate=chipClock/4; // CKIN -> fCLK(/2) -> Function blocks (/2)
|
||||
for (int i=0; i<3; i++) {
|
||||
oscBuf[i]->setRate(rate);
|
||||
}
|
||||
|
@ -390,32 +416,6 @@ void DivPlatformSM8521::poke(std::vector<DivRegWrite>& wlist) {
|
|||
for (DivRegWrite& i: wlist) rWrite(i.addr,i.val);
|
||||
}
|
||||
|
||||
void DivPlatformSM8521::setCoreQuality(unsigned char q) {
|
||||
switch (q) {
|
||||
case 0:
|
||||
coreQuality=64;
|
||||
break;
|
||||
case 1:
|
||||
coreQuality=32;
|
||||
break;
|
||||
case 2:
|
||||
coreQuality=16;
|
||||
break;
|
||||
case 3:
|
||||
coreQuality=8;
|
||||
break;
|
||||
case 4:
|
||||
coreQuality=4;
|
||||
break;
|
||||
case 5:
|
||||
coreQuality=1;
|
||||
break;
|
||||
default:
|
||||
coreQuality=8;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int DivPlatformSM8521::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {
|
||||
parent=p;
|
||||
dumpWrites=false;
|
||||
|
|
|
@ -54,14 +54,14 @@ class DivPlatformSM8521: public DivDispatch {
|
|||
FixedQueue<QueuedWrite,128> writes;
|
||||
|
||||
bool antiClickEnabled;
|
||||
int coreQuality;
|
||||
int coreQuality, lastOut;
|
||||
struct sm8521_t sm8521;
|
||||
unsigned char regPool[256];
|
||||
void updateWave(int ch);
|
||||
friend void putDispatchChip(void*,int);
|
||||
friend void putDispatchChan(void*,int,int);
|
||||
public:
|
||||
void acquire(short** buf, size_t len);
|
||||
void acquireDirect(blip_buffer_t** bb, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void* getChanState(int chan);
|
||||
DivMacroInt* getChanMacroInt(int ch);
|
||||
|
@ -74,13 +74,13 @@ class DivPlatformSM8521: public DivDispatch {
|
|||
void muteChannel(int ch, bool mute);
|
||||
int getOutputCount();
|
||||
bool keyOffAffectsArp(int ch);
|
||||
bool hasAcquireDirect();
|
||||
void setFlags(const DivConfig& flags);
|
||||
void notifyWaveChange(int wave);
|
||||
void notifyInsDeletion(void* ins);
|
||||
void poke(unsigned int addr, unsigned short val);
|
||||
void poke(std::vector<DivRegWrite>& wlist);
|
||||
const char** getRegisterSheet();
|
||||
void setCoreQuality(unsigned char q);
|
||||
int init(DivEngine* parent, int channels, int sugRate, const DivConfig& flags);
|
||||
void quit();
|
||||
~DivPlatformSM8521();
|
||||
|
|
Loading…
Reference in a new issue