SM8521: acquireDirect()
This commit is contained in:
parent
1c05bb8b05
commit
d1234ad59e
3 changed files with 33 additions and 38 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue