prepare for possible major optimization
by just forwarding an output buffer to the dispatch and begin/length, the number of calls may be reduced which improves performance.
This commit is contained in:
parent
055b4f9c26
commit
6efcfc2e8a
19 changed files with 178 additions and 132 deletions
|
|
@ -1,8 +1,6 @@
|
|||
#include "../dispatch.h"
|
||||
|
||||
void DivDispatch::acquire(int& l, int& r) {
|
||||
l=0;
|
||||
r=0;
|
||||
void DivDispatch::acquire(short** buf, size_t start, size_t len) {
|
||||
}
|
||||
|
||||
void DivDispatch::tick() {
|
||||
|
|
|
|||
|
|
@ -4,10 +4,12 @@
|
|||
|
||||
#define FREQ_BASE 277.0f
|
||||
|
||||
void DivPlatformC64::acquire(int& l, int& r) {
|
||||
sid.clock();
|
||||
l=sid.output();
|
||||
r=l;
|
||||
void DivPlatformC64::acquire(short** buf, size_t start, size_t len) {
|
||||
for (size_t i=start; i<start+len; i++) {
|
||||
sid.clock();
|
||||
buf[0][i]=sid.output();
|
||||
buf[1][i]=buf[0][i];
|
||||
}
|
||||
}
|
||||
|
||||
void DivPlatformC64::tick() {
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ class DivPlatformC64: public DivDispatch {
|
|||
|
||||
void updateWave();
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -2,16 +2,17 @@
|
|||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
void DivPlatformDummy::acquire(int& l, int& r) {
|
||||
l=0;
|
||||
for (unsigned char i=0; i<chans; i++) {
|
||||
if (chan[i].active) {
|
||||
l+=((chan[i].pos>=0x8000)?chan[i].vol:-chan[i].vol)*chan[i].amp;
|
||||
|
||||
chan[i].pos+=chan[i].freq;
|
||||
void DivPlatformDummy::acquire(short** buf, size_t start, size_t len) {
|
||||
for (size_t i=start; i<start+len; i++) {
|
||||
buf[0][i]=0;
|
||||
for (unsigned char j=0; j<chans; j++) {
|
||||
if (chan[j].active) {
|
||||
buf[0][i]+=((chan[j].pos>=0x8000)?chan[j].vol:-chan[j].vol)*chan[j].amp;
|
||||
chan[j].pos+=chan[j].freq;
|
||||
}
|
||||
}
|
||||
buf[1][i]=buf[0][i];
|
||||
}
|
||||
r=l;
|
||||
}
|
||||
|
||||
void DivPlatformDummy::tick() {
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ class DivPlatformDummy: public DivDispatch {
|
|||
Channel chan[17];
|
||||
unsigned char chans;
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -7,10 +7,12 @@
|
|||
|
||||
#define FREQ_BASE 8015.85f
|
||||
|
||||
void DivPlatformGB::acquire(int& l, int& r) {
|
||||
GB_advance_cycles(gb,16);
|
||||
l=gb->apu_output.final_sample.left<<2;
|
||||
r=gb->apu_output.final_sample.right<<2;
|
||||
void DivPlatformGB::acquire(short** buf, size_t start, size_t len) {
|
||||
for (int i=start; i<start+len; i++) {
|
||||
GB_advance_cycles(gb,16);
|
||||
buf[0][i]=gb->apu_output.final_sample.left<<2;
|
||||
buf[1][i]=gb->apu_output.final_sample.right<<2;
|
||||
}
|
||||
}
|
||||
|
||||
void DivPlatformGB::updateWave() {
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class DivPlatformGB: public DivDispatch {
|
|||
GB_gameboy_t* gb;
|
||||
void updateWave();
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -12,59 +12,60 @@ static unsigned char konOffs[6]={
|
|||
0, 1, 2, 4, 5, 6
|
||||
};
|
||||
|
||||
void DivPlatformGenesis::acquire(int& l, int& r) {
|
||||
void DivPlatformGenesis::acquire(short** buf, size_t start, size_t len) {
|
||||
static short o[2];
|
||||
static int os[2];
|
||||
|
||||
if (dacMode && dacSample!=-1) {
|
||||
dacPeriod-=6;
|
||||
if (dacPeriod<1) {
|
||||
DivSample* s=parent->song.sample[dacSample];
|
||||
if (s->depth==8) {
|
||||
writes.emplace(0x2a,(unsigned char)s->rendData[dacPos++]+0x80);
|
||||
} else {
|
||||
writes.emplace(0x2a,((unsigned short)s->rendData[dacPos++]+0x8000)>>8);
|
||||
for (size_t h=start; h<start+len; h++) {
|
||||
if (dacMode && dacSample!=-1) {
|
||||
dacPeriod-=6;
|
||||
if (dacPeriod<1) {
|
||||
DivSample* s=parent->song.sample[dacSample];
|
||||
if (s->depth==8) {
|
||||
writes.emplace(0x2a,(unsigned char)s->rendData[dacPos++]+0x80);
|
||||
} else {
|
||||
writes.emplace(0x2a,((unsigned short)s->rendData[dacPos++]+0x8000)>>8);
|
||||
}
|
||||
if (dacPos>=s->rendLength) {
|
||||
dacSample=-1;
|
||||
}
|
||||
dacPeriod+=dacRate;
|
||||
}
|
||||
if (dacPos>=s->rendLength) {
|
||||
dacSample=-1;
|
||||
}
|
||||
dacPeriod+=dacRate;
|
||||
}
|
||||
}
|
||||
|
||||
os[0]=0; os[1]=0;
|
||||
for (int i=0; i<6; i++) {
|
||||
if (!writes.empty() && --delay<0) {
|
||||
delay=0;
|
||||
QueuedWrite& w=writes.front();
|
||||
if (w.addrOrVal) {
|
||||
OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val);
|
||||
//printf("write: %x = %.2x\n",w.addr,w.val);
|
||||
lastBusy=0;
|
||||
writes.pop();
|
||||
} else {
|
||||
lastBusy++;
|
||||
if (fm.write_busy==0) {
|
||||
//printf("busycounter: %d\n",lastBusy);
|
||||
OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr);
|
||||
w.addrOrVal=true;
|
||||
|
||||
os[0]=0; os[1]=0;
|
||||
for (int i=0; i<6; i++) {
|
||||
if (!writes.empty() && --delay<0) {
|
||||
delay=0;
|
||||
QueuedWrite& w=writes.front();
|
||||
if (w.addrOrVal) {
|
||||
OPN2_Write(&fm,0x1+((w.addr>>8)<<1),w.val);
|
||||
//printf("write: %x = %.2x\n",w.addr,w.val);
|
||||
lastBusy=0;
|
||||
writes.pop();
|
||||
} else {
|
||||
lastBusy++;
|
||||
if (fm.write_busy==0) {
|
||||
//printf("busycounter: %d\n",lastBusy);
|
||||
OPN2_Write(&fm,0x0+((w.addr>>8)<<1),w.addr);
|
||||
w.addrOrVal=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OPN2_Clock(&fm,o); os[0]+=o[0]; os[1]+=o[1];
|
||||
//OPN2_Write(&fm,0,0);
|
||||
}
|
||||
|
||||
OPN2_Clock(&fm,o); os[0]+=o[0]; os[1]+=o[1];
|
||||
//OPN2_Write(&fm,0,0);
|
||||
}
|
||||
psgClocks+=223722;
|
||||
while (psgClocks>=rate) {
|
||||
psgOut=(psg.acquireOne()*3)>>3;
|
||||
psgClocks-=rate;
|
||||
}
|
||||
|
||||
psgClocks+=223722;
|
||||
while (psgClocks>=rate) {
|
||||
psg.acquire(psgOut,psgOut);
|
||||
psgClocks-=rate;
|
||||
psgOut=(psgOut>>2)+(psgOut>>3);
|
||||
buf[0][h]=(os[0]<<5)+psgOut;
|
||||
buf[1][h]=(os[1]<<5)+psgOut;
|
||||
}
|
||||
|
||||
l=(os[0]<<5)+psgOut;
|
||||
r=(os[1]<<5)+psgOut;
|
||||
}
|
||||
|
||||
void DivPlatformGenesis::tick() {
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class DivPlatformGenesis: public DivDispatch {
|
|||
int toFreq(int freq);
|
||||
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -5,30 +5,32 @@
|
|||
|
||||
#define FREQ_BASE 3424.0f
|
||||
|
||||
void DivPlatformNES::acquire(int& l, int& r) {
|
||||
if (dacSample!=-1) {
|
||||
dacPeriod+=dacRate;
|
||||
if (dacPeriod>=rate) {
|
||||
DivSample* s=parent->song.sample[dacSample];
|
||||
if (s->depth==8) {
|
||||
apu_wr_reg(0x4011,((unsigned char)s->rendData[dacPos++]+0x80)>>1);
|
||||
} else {
|
||||
apu_wr_reg(0x4011,((unsigned short)s->rendData[dacPos++]+0x8000)>>9);
|
||||
void DivPlatformNES::acquire(short** buf, size_t start, size_t len) {
|
||||
for (size_t i=start; i<start+len; i++) {
|
||||
if (dacSample!=-1) {
|
||||
dacPeriod+=dacRate;
|
||||
if (dacPeriod>=rate) {
|
||||
DivSample* s=parent->song.sample[dacSample];
|
||||
if (s->depth==8) {
|
||||
apu_wr_reg(0x4011,((unsigned char)s->rendData[dacPos++]+0x80)>>1);
|
||||
} else {
|
||||
apu_wr_reg(0x4011,((unsigned short)s->rendData[dacPos++]+0x8000)>>9);
|
||||
}
|
||||
if (dacPos>=s->rendLength) {
|
||||
dacSample=-1;
|
||||
}
|
||||
dacPeriod-=rate;
|
||||
}
|
||||
if (dacPos>=s->rendLength) {
|
||||
dacSample=-1;
|
||||
}
|
||||
dacPeriod-=rate;
|
||||
}
|
||||
}
|
||||
|
||||
apu_tick(NULL);
|
||||
apu.odd_cycle=!apu.odd_cycle;
|
||||
if (apu.clocked) {
|
||||
apu.clocked=false;
|
||||
l=(pulse_output()+tnd_output())*30;
|
||||
r=l;
|
||||
//printf("output value: %d\n",l);
|
||||
|
||||
apu_tick(NULL);
|
||||
apu.odd_cycle=!apu.odd_cycle;
|
||||
if (apu.clocked) {
|
||||
apu.clocked=false;
|
||||
buf[0][i]=(pulse_output()+tnd_output())*30;
|
||||
buf[1][i]=buf[0][i];
|
||||
//printf("output value: %d\n",l);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ class DivPlatformNES: public DivDispatch {
|
|||
|
||||
void updateWave();
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -13,41 +13,43 @@
|
|||
|
||||
#define FREQ_BASE 1712.0f*2
|
||||
|
||||
void DivPlatformPCE::acquire(int& l, int& r) {
|
||||
// PCM part
|
||||
for (int i=0; i<6; i++) {
|
||||
if (chan[i].pcm && chan[i].dacSample!=-1) {
|
||||
if (--chan[i].dacPeriod<1) {
|
||||
DivSample* s=parent->song.sample[chan[i].dacSample];
|
||||
chWrite(i,0x07,0);
|
||||
if (s->depth==8) {
|
||||
chWrite(i,0x04,0xdf);
|
||||
chWrite(i,0x06,(((unsigned char)s->rendData[chan[i].dacPos++]+0x80)>>3));
|
||||
} else {
|
||||
chWrite(i,0x04,0xdf);
|
||||
chWrite(i,0x06,(((unsigned short)s->rendData[chan[i].dacPos++]+0x8000)>>11));
|
||||
void DivPlatformPCE::acquire(short** buf, size_t start, size_t len) {
|
||||
for (size_t h=start; h<start+len; h++) {
|
||||
// PCM part
|
||||
for (int i=0; i<6; i++) {
|
||||
if (chan[i].pcm && chan[i].dacSample!=-1) {
|
||||
if (--chan[i].dacPeriod<1) {
|
||||
DivSample* s=parent->song.sample[chan[i].dacSample];
|
||||
chWrite(i,0x07,0);
|
||||
if (s->depth==8) {
|
||||
chWrite(i,0x04,0xdf);
|
||||
chWrite(i,0x06,(((unsigned char)s->rendData[chan[i].dacPos++]+0x80)>>3));
|
||||
} else {
|
||||
chWrite(i,0x04,0xdf);
|
||||
chWrite(i,0x06,(((unsigned short)s->rendData[chan[i].dacPos++]+0x8000)>>11));
|
||||
}
|
||||
if (chan[i].dacPos>=s->rendLength) {
|
||||
chan[i].dacSample=-1;
|
||||
}
|
||||
chan[i].dacPeriod=chan[i].dacRate;
|
||||
}
|
||||
if (chan[i].dacPos>=s->rendLength) {
|
||||
chan[i].dacSample=-1;
|
||||
}
|
||||
chan[i].dacPeriod=chan[i].dacRate;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// PCE part
|
||||
while (!writes.empty()) {
|
||||
QueuedWrite w=writes.front();
|
||||
pce->Write(cycles,w.addr,w.val);
|
||||
writes.pop();
|
||||
}
|
||||
tempL=0; tempR=0;
|
||||
pce->Update(4);
|
||||
pce->ResetTS(0);
|
||||
|
||||
//printf("tempL: %d tempR: %d\n",tempL,tempR);
|
||||
l=tempL;
|
||||
r=tempR;
|
||||
// PCE part
|
||||
while (!writes.empty()) {
|
||||
QueuedWrite w=writes.front();
|
||||
pce->Write(cycles,w.addr,w.val);
|
||||
writes.pop();
|
||||
}
|
||||
tempL=0; tempR=0;
|
||||
pce->Update(4);
|
||||
pce->ResetTS(0);
|
||||
|
||||
//printf("tempL: %d tempR: %d\n",tempL,tempR);
|
||||
buf[0][h]=tempL;
|
||||
buf[1][h]=tempR;
|
||||
}
|
||||
}
|
||||
|
||||
void DivPlatformPCE::updateWave(int ch) {
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ class DivPlatformPCE: public DivDispatch {
|
|||
PCE_PSG* pce;
|
||||
void updateWave(int ch);
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
|
|
@ -2,11 +2,15 @@
|
|||
#include "../engine.h"
|
||||
#include <math.h>
|
||||
|
||||
void DivPlatformSMS::acquire(int& l, int& r) {
|
||||
void DivPlatformSMS::acquire(short** buf, size_t start, size_t len) {
|
||||
sn->sound_stream_update(buf[0]+start,len);
|
||||
memcpy(buf[1]+start,buf[0]+start,sizeof(short)*len);
|
||||
}
|
||||
|
||||
int DivPlatformSMS::acquireOne() {
|
||||
short v;
|
||||
sn->sound_stream_update(&v,1);
|
||||
l=v;
|
||||
r=v;
|
||||
return v;
|
||||
}
|
||||
|
||||
void DivPlatformSMS::tick() {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,8 @@ class DivPlatformSMS: public DivDispatch {
|
|||
bool updateSNMode;
|
||||
sn76496_device* sn;
|
||||
public:
|
||||
void acquire(int& l, int& r);
|
||||
int acquireOne();
|
||||
void acquire(short** buf, size_t start, size_t len);
|
||||
int dispatch(DivCommand c);
|
||||
void tick();
|
||||
int init(DivEngine* parent, int channels, int sugRate);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue