NES: puNES acquireDirect(), part 2

per-chan osc
This commit is contained in:
tildearrow 2025-03-07 02:02:04 -05:00
parent 5df3e1f030
commit 29849972dd
3 changed files with 21 additions and 10 deletions

View file

@ -112,6 +112,11 @@ void DivPlatformNES::acquire_puNES(blip_buffer_t** bb, size_t len) {
nes->timestamp=0; nes->timestamp=0;
nes->bb=bb[0]; nes->bb=bb[0];
nes->S1.oscBuf=oscBuf[0];
nes->S2.oscBuf=oscBuf[1];
nes->TR.oscBuf=oscBuf[2];
nes->NS.oscBuf=oscBuf[3];
nes->DMC.oscBuf=oscBuf[4];
for (size_t i=0; i<len; i++) { for (size_t i=0; i<len; i++) {
// heuristic // heuristic
@ -140,16 +145,6 @@ void DivPlatformNES::acquire_puNES(blip_buffer_t** bb, size_t len) {
i+=pcmAdvance-1; i+=pcmAdvance-1;
doPCM; doPCM;
/*
if (++writeOscBuf>=32) {
writeOscBuf=0;
oscBuf[0]->putSample(i,isMuted[0]?0:(nes->S1.output<<11));
oscBuf[1]->putSample(i,isMuted[1]?0:(nes->S2.output<<11));
oscBuf[2]->putSample(i,isMuted[2]?0:(nes->TR.output<<11));
oscBuf[3]->putSample(i,isMuted[3]?0:(nes->NS.output<<11));
oscBuf[4]->putSample(i,isMuted[4]?0:(nes->DMC.output<<8));
}*/
} }
apu_tick(nes,len); apu_tick(nes,len);

View file

@ -324,6 +324,12 @@ void apu_tick(struct NESAPU* a, int len) {
blip_add_delta(a->bb,a->timestamp,sample-a->lastSample); blip_add_delta(a->bb,a->timestamp,sample-a->lastSample);
a->lastSample=sample; a->lastSample=sample;
} }
// output chan osc
a->S1.oscBuf->putSample(a->timestamp,a->muted[0]?0:(a->S1.output<<11));
a->S2.oscBuf->putSample(a->timestamp,a->muted[1]?0:(a->S2.output<<11));
a->TR.oscBuf->putSample(a->timestamp,a->muted[2]?0:(a->TR.output<<11));
a->NS.oscBuf->putSample(a->timestamp,a->muted[3]?0:(a->NS.output<<11));
a->DMC.oscBuf->putSample(a->timestamp,a->muted[4]?0:(a->DMC.output<<8));
rem-=advance; rem-=advance;
a->timestamp++; a->timestamp++;

View file

@ -23,6 +23,7 @@
#include "common.h" #include "common.h"
#include "blip_buf.h" #include "blip_buf.h"
#include "../../../dispatch.h"
enum dmc_types_of_dma { DMC_NORMAL, DMC_CPU_WRITE, DMC_R4014, DMC_NNL_DMA }; enum dmc_types_of_dma { DMC_NORMAL, DMC_CPU_WRITE, DMC_R4014, DMC_NNL_DMA };
enum apu_channels { APU_S1, APU_S2, APU_TR, APU_NS, APU_DMC, APU_EXTRA, APU_MASTER }; enum apu_channels { APU_S1, APU_S2, APU_TR, APU_NS, APU_DMC, APU_EXTRA, APU_MASTER };
@ -341,6 +342,8 @@ typedef struct _apuSquare {
_length_counter length; _length_counter length;
/* output */ /* output */
SWORD output; SWORD output;
/* Furnace: chan osc buffer */
DivDispatchOscBuffer* oscBuf;
} _apuSquare; } _apuSquare;
typedef struct _apuTriangle { typedef struct _apuTriangle {
/* timer */ /* timer */
@ -355,6 +358,8 @@ typedef struct _apuTriangle {
BYTE sequencer; BYTE sequencer;
/* output */ /* output */
SWORD output; SWORD output;
/* Furnace: chan osc buffer */
DivDispatchOscBuffer* oscBuf;
} _apuTriangle; } _apuTriangle;
typedef struct _apuNoise { typedef struct _apuNoise {
/* timer */ /* timer */
@ -375,6 +380,8 @@ typedef struct _apuNoise {
BYTE sequencer; BYTE sequencer;
/* output */ /* output */
SWORD output; SWORD output;
/* Furnace: chan osc buffer */
DivDispatchOscBuffer* oscBuf;
} _apuNoise; } _apuNoise;
typedef struct _apuDMC { typedef struct _apuDMC {
/* ogni quanti cicli devo generare un output */ /* ogni quanti cicli devo generare un output */
@ -404,6 +411,9 @@ typedef struct _apuDMC {
/* misc */ /* misc */
BYTE tick_type; BYTE tick_type;
/* Furnace: chan osc buffer */
DivDispatchOscBuffer* oscBuf;
} _apuDMC; } _apuDMC;
struct _nla_table { struct _nla_table {