reorganise snd_opl_nuked.c to closer match upstream
This commit is contained in:
@@ -1197,6 +1197,195 @@ channel_set_4op(nuked_t *dev, uint8_t data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_slot(slot_t *slot)
|
||||||
|
{
|
||||||
|
slot_calc_fb(slot);
|
||||||
|
env_calc(slot);
|
||||||
|
phase_generate(slot);
|
||||||
|
slot_generate(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void
|
||||||
|
nuked_generate_4ch(void *priv, int32_t *buf4)
|
||||||
|
{
|
||||||
|
nuked_t *dev = (nuked_t *) priv;
|
||||||
|
chan_t *ch;
|
||||||
|
wrbuf_t *writebuf;
|
||||||
|
int16_t **out;
|
||||||
|
int32_t mix[2];
|
||||||
|
int16_t accm;
|
||||||
|
int16_t shift = 0;
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
buf4[1] = dev->mixbuff[1];
|
||||||
|
buf4[3] = dev->mixbuff[3];
|
||||||
|
|
||||||
|
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
||||||
|
for (i = 0; i < 15; i++)
|
||||||
|
#else
|
||||||
|
for (i = 0; i < 36; i++)
|
||||||
|
#endif
|
||||||
|
process_slot(&dev->slot[i]);
|
||||||
|
|
||||||
|
mix[0] = mix[1] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 18; i++) {
|
||||||
|
ch = &dev->chan[i];
|
||||||
|
out = ch->out;
|
||||||
|
accm = *out[0] + *out[1] + *out[2] + *out[3];
|
||||||
|
#if OPL_ENABLE_STEREOEXT
|
||||||
|
mix[0] += (int32_t) ((accm * ch->leftpan) >> 16);
|
||||||
|
#else
|
||||||
|
mix[0] += (int32_t) (accm & ch->cha);
|
||||||
|
#endif
|
||||||
|
mix[1] += (int32_t) (accm & ch->chc);
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->mixbuff[0] = mix[0];
|
||||||
|
dev->mixbuff[2] = mix[1];
|
||||||
|
|
||||||
|
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
||||||
|
for (i = 15; i < 18; i++)
|
||||||
|
process_slot(&dev->slot[i]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
buf4[0] = dev->mixbuff[0];
|
||||||
|
buf4[2] = dev->mixbuff[2];
|
||||||
|
|
||||||
|
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
||||||
|
for (i = 18; i < 33; i++)
|
||||||
|
process_slot(&dev->slot[i]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
mix[0] = mix[1] = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 18; i++) {
|
||||||
|
ch = &dev->chan[i];
|
||||||
|
out = ch->out;
|
||||||
|
accm = *out[0] + *out[1] + *out[2] + *out[3];
|
||||||
|
#if OPL_ENABLE_STEREOEXT
|
||||||
|
mix[0] += (int32_t) ((accm * ch->rightpan) >> 16);
|
||||||
|
#else
|
||||||
|
mix[0] += (int32_t) (accm & ch->chb);
|
||||||
|
#endif
|
||||||
|
mix[1] += (int32_t) (accm & ch->chd);
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->mixbuff[1] = mix[0];
|
||||||
|
dev->mixbuff[3] = mix[1];
|
||||||
|
|
||||||
|
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
||||||
|
for (i = 33; i < 36; i++)
|
||||||
|
process_slot(&dev->slot[i]);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((dev->timer & 0x3f) == 0x3f)
|
||||||
|
dev->tremolopos = (dev->tremolopos + 1) % 210;
|
||||||
|
|
||||||
|
if (dev->tremolopos < 105)
|
||||||
|
dev->tremolo = dev->tremolopos >> dev->tremoloshift;
|
||||||
|
else
|
||||||
|
dev->tremolo = (210 - dev->tremolopos) >> dev->tremoloshift;
|
||||||
|
|
||||||
|
if ((dev->timer & 0x03ff) == 0x03ff)
|
||||||
|
dev->vibpos = (dev->vibpos + 1) & 7;
|
||||||
|
|
||||||
|
dev->timer++;
|
||||||
|
|
||||||
|
if (dev->eg_state) {
|
||||||
|
while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0)
|
||||||
|
shift++;
|
||||||
|
|
||||||
|
if (shift > 12)
|
||||||
|
dev->eg_add = 0;
|
||||||
|
else
|
||||||
|
dev->eg_add = shift + 1;
|
||||||
|
|
||||||
|
dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->eg_timerrem || dev->eg_state) {
|
||||||
|
if (dev->eg_timer == UINT64_C(0xfffffffff)) {
|
||||||
|
dev->eg_timer = 0;
|
||||||
|
dev->eg_timerrem = 1;
|
||||||
|
} else {
|
||||||
|
dev->eg_timer++;
|
||||||
|
dev->eg_timerrem = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->eg_state ^= 1;
|
||||||
|
|
||||||
|
while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) {
|
||||||
|
if (!(writebuf->reg & 0x200))
|
||||||
|
break;
|
||||||
|
|
||||||
|
writebuf->reg &= 0x01ff;
|
||||||
|
|
||||||
|
nuked_write_reg(dev, writebuf->reg, writebuf->data);
|
||||||
|
|
||||||
|
dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->wrbuf_samplecnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nuked_generate(nuked_t *dev, int32_t *buf)
|
||||||
|
{
|
||||||
|
int32_t samples[4];
|
||||||
|
nuked_generate_4ch(dev, samples);
|
||||||
|
buf[0] = samples[0];
|
||||||
|
buf[1] = samples[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nuked_generate_4ch_resampled(nuked_t *dev, int32_t *buf4)
|
||||||
|
{
|
||||||
|
while (dev->samplecnt >= dev->rateratio) {
|
||||||
|
dev->oldsamples[0] = dev->samples[0];
|
||||||
|
dev->oldsamples[1] = dev->samples[1];
|
||||||
|
dev->oldsamples[2] = dev->samples[2];
|
||||||
|
dev->oldsamples[3] = dev->samples[3];
|
||||||
|
nuked_generate_4ch(dev, dev->samples);
|
||||||
|
dev->samplecnt -= dev->rateratio;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt)
|
||||||
|
+ dev->samples[0] * dev->samplecnt)
|
||||||
|
/ dev->rateratio);
|
||||||
|
buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt)
|
||||||
|
+ dev->samples[1] * dev->samplecnt)
|
||||||
|
/ dev->rateratio);
|
||||||
|
buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt)
|
||||||
|
+ dev->samples[2] * dev->samplecnt)
|
||||||
|
/ dev->rateratio);
|
||||||
|
buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt)
|
||||||
|
+ dev->samples[3] * dev->samplecnt)
|
||||||
|
/ dev->rateratio);
|
||||||
|
|
||||||
|
dev->samplecnt += 1 << RSM_FRAC;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nuked_generate_resampled(nuked_t *dev, int16_t *buf4)
|
||||||
|
{
|
||||||
|
int16_t samples[4];
|
||||||
|
nuked_generate_4ch_resampled(dev, samples);
|
||||||
|
buf4[0] = samples[0];
|
||||||
|
buf4[1] = samples[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
nuked_generate_raw(nuked_t *dev, int32_t *bufp)
|
||||||
|
{
|
||||||
|
nuked_generate(dev, dev->samples);
|
||||||
|
|
||||||
|
bufp[0] = (int32_t) dev->samples[0];
|
||||||
|
bufp[1] = (int32_t) dev->samples[1];
|
||||||
|
}
|
||||||
|
|
||||||
uint16_t
|
uint16_t
|
||||||
nuked_write_addr(void *priv, uint16_t port, uint8_t val)
|
nuked_write_addr(void *priv, uint16_t port, uint8_t val)
|
||||||
{
|
{
|
||||||
@@ -1345,191 +1534,6 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val)
|
|||||||
dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE;
|
dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_slot(slot_t *slot)
|
|
||||||
{
|
|
||||||
slot_calc_fb(slot);
|
|
||||||
env_calc(slot);
|
|
||||||
phase_generate(slot);
|
|
||||||
slot_generate(slot);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void
|
|
||||||
nuked_generate_4ch(void *priv, int32_t *buf4)
|
|
||||||
{
|
|
||||||
nuked_t *dev = (nuked_t *) priv;
|
|
||||||
chan_t *ch;
|
|
||||||
wrbuf_t *writebuf;
|
|
||||||
int16_t **out;
|
|
||||||
int32_t mix[2];
|
|
||||||
int16_t accm;
|
|
||||||
int16_t shift = 0;
|
|
||||||
uint8_t i;
|
|
||||||
|
|
||||||
buf4[1] = dev->mixbuff[1];
|
|
||||||
buf4[3] = dev->mixbuff[3];
|
|
||||||
|
|
||||||
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
|
||||||
for (i = 0; i < 15; i++)
|
|
||||||
#else
|
|
||||||
for (i = 0; i < 36; i++)
|
|
||||||
#endif
|
|
||||||
process_slot(&dev->slot[i]);
|
|
||||||
|
|
||||||
mix[0] = mix[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 18; i++) {
|
|
||||||
ch = &dev->chan[i];
|
|
||||||
out = ch->out;
|
|
||||||
accm = *out[0] + *out[1] + *out[2] + *out[3];
|
|
||||||
#if OPL_ENABLE_STEREOEXT
|
|
||||||
mix[0] += (int16_t)((accm * ch->leftpan) >> 16);
|
|
||||||
#else
|
|
||||||
mix[0] += (int16_t) (accm & ch->cha);
|
|
||||||
#endif
|
|
||||||
mix[1] += (int16_t) (accm & ch->chc);
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->mixbuff[0] = mix[0];
|
|
||||||
dev->mixbuff[2] = mix[1];
|
|
||||||
|
|
||||||
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
|
||||||
for (i = 15; i < 18; i++)
|
|
||||||
process_slot(&dev->slot[i]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
buf4[0] = dev->mixbuff[0];
|
|
||||||
buf4[2] = dev->mixbuff[2];
|
|
||||||
|
|
||||||
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
|
||||||
for (i = 18; i < 33; i++)
|
|
||||||
process_slot(&dev->slot[i]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mix[0] = mix[1] = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < 18; i++) {
|
|
||||||
ch = &dev->chan[i];
|
|
||||||
out = ch->out;
|
|
||||||
accm = *out[0] + *out[1] + *out[2] + *out[3];
|
|
||||||
#if OPL_ENABLE_STEREOEXT
|
|
||||||
mix[0] += (int16_t)((accm * ch->leftpan) >> 16);
|
|
||||||
#else
|
|
||||||
mix[0] += (int16_t) (accm & ch->chb);
|
|
||||||
#endif
|
|
||||||
mix[1] += (int16_t) (accm & ch->chd);
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->mixbuff[1] = mix[0];
|
|
||||||
dev->mixbuff[3] = mix[1];
|
|
||||||
|
|
||||||
#if OPL_QUIRK_CHANNELSAMPLEDELAY
|
|
||||||
for (i = 33; i < 36; i++)
|
|
||||||
process_slot(&dev->slot[i]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((dev->timer & 0x3f) == 0x3f)
|
|
||||||
dev->tremolopos = (dev->tremolopos + 1) % 210;
|
|
||||||
|
|
||||||
if (dev->tremolopos < 105)
|
|
||||||
dev->tremolo = dev->tremolopos >> dev->tremoloshift;
|
|
||||||
else
|
|
||||||
dev->tremolo = (210 - dev->tremolopos) >> dev->tremoloshift;
|
|
||||||
|
|
||||||
if ((dev->timer & 0x03ff) == 0x03ff)
|
|
||||||
dev->vibpos = (dev->vibpos + 1) & 7;
|
|
||||||
|
|
||||||
dev->timer++;
|
|
||||||
|
|
||||||
if (dev->eg_state) {
|
|
||||||
while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0)
|
|
||||||
shift++;
|
|
||||||
|
|
||||||
if (shift > 12)
|
|
||||||
dev->eg_add = 0;
|
|
||||||
else
|
|
||||||
dev->eg_add = shift + 1;
|
|
||||||
dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dev->eg_timerrem || dev->eg_state) {
|
|
||||||
if (dev->eg_timer == UINT64_C(0xfffffffff)) {
|
|
||||||
dev->eg_timer = 0;
|
|
||||||
dev->eg_timerrem = 1;
|
|
||||||
} else {
|
|
||||||
dev->eg_timer++;
|
|
||||||
dev->eg_timerrem = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->eg_state ^= 1;
|
|
||||||
|
|
||||||
while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) {
|
|
||||||
if (!(writebuf->reg & 0x200))
|
|
||||||
break;
|
|
||||||
|
|
||||||
writebuf->reg &= 0x01ff;
|
|
||||||
|
|
||||||
nuked_write_reg(dev, writebuf->reg, writebuf->data);
|
|
||||||
|
|
||||||
dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
dev->wrbuf_samplecnt++;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nuked_generate(nuked_t *dev, int32_t *buf4)
|
|
||||||
{
|
|
||||||
int32_t samples[4];
|
|
||||||
nuked_generate_4ch(dev, samples);
|
|
||||||
buf4[0] = samples[0];
|
|
||||||
buf4[1] = samples[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nuked_generate_4ch_resampled(nuked_t *dev, int16_t *buf4)
|
|
||||||
{
|
|
||||||
while (dev->samplecnt >= dev->rateratio) {
|
|
||||||
dev->oldsamples[0] = dev->samples[0];
|
|
||||||
dev->oldsamples[1] = dev->samples[1];
|
|
||||||
dev->oldsamples[2] = dev->samples[2];
|
|
||||||
dev->oldsamples[3] = dev->samples[3];
|
|
||||||
nuked_generate_4ch(dev, dev->samples);
|
|
||||||
dev->samplecnt -= dev->rateratio;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt)
|
|
||||||
+ dev->samples[0] * dev->samplecnt)
|
|
||||||
/ dev->rateratio);
|
|
||||||
buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt)
|
|
||||||
+ dev->samples[1] * dev->samplecnt)
|
|
||||||
/ dev->rateratio);
|
|
||||||
buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt)
|
|
||||||
+ dev->samples[2] * dev->samplecnt)
|
|
||||||
/ dev->rateratio);
|
|
||||||
buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt)
|
|
||||||
+ dev->samples[3] * dev->samplecnt)
|
|
||||||
/ dev->rateratio);
|
|
||||||
|
|
||||||
dev->samplecnt += 1 << RSM_FRAC;
|
|
||||||
}
|
|
||||||
|
|
||||||
void nuked_generate_resampled(nuked_t *dev, int16_t *buf4)
|
|
||||||
{
|
|
||||||
int16_t samples[4];
|
|
||||||
nuked_generate_4ch_resampled(dev, samples);
|
|
||||||
buf4[0] = samples[0];
|
|
||||||
buf4[1] = samples[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
nuked_generate_raw(nuked_t *dev, int32_t *bufp)
|
|
||||||
{
|
|
||||||
nuked_generate(dev, dev->samples);
|
|
||||||
|
|
||||||
bufp[0] = (int32_t) dev->samples[0];
|
|
||||||
bufp[1] = (int32_t) dev->samples[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples)
|
nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples)
|
||||||
{
|
{
|
||||||
@@ -1550,7 +1554,7 @@ void
|
|||||||
nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num)
|
nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num)
|
||||||
{
|
{
|
||||||
for (uint_fast32_t i = 0; i < num; i++) {
|
for (uint_fast32_t i = 0; i < num; i++) {
|
||||||
nuked_generate_raw(dev, sndptr);
|
nuked_generate_resampled(dev, sndptr);
|
||||||
sndptr += 2;
|
sndptr += 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user