OPN: fix AY PCM direct stream export

This commit is contained in:
tildearrow 2024-09-01 16:55:09 -05:00
parent b650545773
commit d303675961
4 changed files with 16 additions and 11 deletions

View file

@ -113,14 +113,15 @@ const unsigned char dacLogTableAY[256]={
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15
}; };
void DivPlatformAY8910::runDAC() { void DivPlatformAY8910::runDAC(int runRate) {
if (runRate==0) runRate=dacRate;
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
if (chan[i].active && (chan[i].curPSGMode.val&8) && chan[i].dac.sample!=-1) { if (chan[i].active && (chan[i].curPSGMode.val&8) && chan[i].dac.sample!=-1) {
chan[i].dac.period+=chan[i].dac.rate; chan[i].dac.period+=chan[i].dac.rate;
bool end=false; bool end=false;
bool changed=false; bool changed=false;
int prevOut=chan[i].dac.out; int prevOut=chan[i].dac.out;
while (chan[i].dac.period>dacRate && !end) { while (chan[i].dac.period>runRate && !end) {
DivSample* s=parent->getSample(chan[i].dac.sample); DivSample* s=parent->getSample(chan[i].dac.sample);
if (s->samples<=0 || chan[i].dac.pos<0 || chan[i].dac.pos>=(int)s->samples) { if (s->samples<=0 || chan[i].dac.pos<0 || chan[i].dac.pos>=(int)s->samples) {
chan[i].dac.sample=-1; chan[i].dac.sample=-1;
@ -143,7 +144,7 @@ void DivPlatformAY8910::runDAC() {
end=true; end=true;
break; break;
} }
chan[i].dac.period-=dacRate; chan[i].dac.period-=runRate;
} }
if (changed && !end) { if (changed && !end) {
if (!isMuted[i]) { if (!isMuted[i]) {
@ -154,13 +155,15 @@ void DivPlatformAY8910::runDAC() {
} }
} }
void DivPlatformAY8910::runTFX() { void DivPlatformAY8910::runTFX(int runRate) {
/* /*
developer's note: if you are checking for intellivision developer's note: if you are checking for intellivision
make sure to add "&& selCore" make sure to add "&& selCore"
because for some reason, the register remap doesn't work because for some reason, the register remap doesn't work
when the user uses AtomicSSG core when the user uses AtomicSSG core
*/ */
// TODO: this
if (runRate==0) runRate=dacRate;
int timerPeriod, output; int timerPeriod, output;
for (int i=0; i<3; i++) { for (int i=0; i<3; i++) {
if (chan[i].active && (chan[i].curPSGMode.val&16) && !(chan[i].curPSGMode.val&8) && chan[i].tfx.mode!=-1) { if (chan[i].active && (chan[i].curPSGMode.val&16) && !(chan[i].curPSGMode.val&8) && chan[i].tfx.mode!=-1) {
@ -327,12 +330,9 @@ void DivPlatformAY8910::acquire(short** buf, size_t len) {
void DivPlatformAY8910::fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len) { void DivPlatformAY8910::fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len) {
writes.clear(); writes.clear();
int hrate=(int)(rate/sRate);
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
for (int h=0; h<hrate; h++) { runDAC(sRate);
runDAC(); runTFX(sRate);
runTFX();
}
while (!writes.empty()) { while (!writes.empty()) {
QueuedWrite& w=writes.front(); QueuedWrite& w=writes.front();
stream.push_back(DivDelayedWrite(i,w.addr,w.val)); stream.push_back(DivDelayedWrite(i,w.addr,w.val));

View file

@ -156,8 +156,8 @@ class DivPlatformAY8910: public DivDispatch {
friend void putDispatchChan(void*,int,int); friend void putDispatchChan(void*,int,int);
public: public:
void runDAC(); void runDAC(int runRate=0);
void runTFX(); void runTFX(int runRate=0);
void setExtClockDiv(unsigned int eclk=COLOR_NTSC, unsigned char ediv=8); void setExtClockDiv(unsigned int eclk=COLOR_NTSC, unsigned char ediv=8);
void acquire(short** buf, size_t len); void acquire(short** buf, size_t len);
void fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len); void fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len);

View file

@ -444,6 +444,10 @@ void DivPlatformYM2203::acquire_lle(short** buf, size_t len) {
} }
} }
void DivPlatformYM2203::fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len) {
ay->fillStream(stream,sRate,len);
}
void DivPlatformYM2203::tick(bool sysTick) { void DivPlatformYM2203::tick(bool sysTick) {
// PSG // PSG
ay->tick(sysTick); ay->tick(sysTick);

View file

@ -74,6 +74,7 @@ class DivPlatformYM2203: public DivPlatformOPN {
public: public:
void acquire(short** buf, size_t len); void acquire(short** buf, size_t len);
void fillStream(std::vector<DivDelayedWrite>& stream, int sRate, size_t len);
int dispatch(DivCommand c); int dispatch(DivCommand c);
void* getChanState(int chan); void* getChanState(int chan);
DivMacroInt* getChanMacroInt(int ch); DivMacroInt* getChanMacroInt(int ch);