From 509d20c215e17b9bff709767b2eb0e12f2053e62 Mon Sep 17 00:00:00 2001 From: scratchminer Date: Tue, 23 Jan 2024 01:41:20 -0500 Subject: [PATCH] reduce CPU usage massively --- extern/pwrnoise/pwrnoise.c | 123 ++++++++++++++++------------- extern/pwrnoise/pwrnoise.h | 3 +- src/engine/platform/powernoise.cpp | 5 +- 3 files changed, 70 insertions(+), 61 deletions(-) diff --git a/extern/pwrnoise/pwrnoise.c b/extern/pwrnoise/pwrnoise.c index 631e54616..1c3351d0e 100644 --- a/extern/pwrnoise/pwrnoise.c +++ b/extern/pwrnoise/pwrnoise.c @@ -40,22 +40,23 @@ void pwrnoise_noise_write(noise_channel_t *chan, uint8_t reg, uint8_t val) { } } -void pwrnoise_noise_step(noise_channel_t *chan) { - chan->octave_counter++; - if (chan->enable && !(((chan->octave_counter - 1) >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001)) { - if ((++chan->period_counter) == 4096) { +void pwrnoise_noise_step(noise_channel_t *chan, uint16_t cycles) { + if (!chan->enable) chan->out_latch = 0; + + chan->octave_counter += cycles; + if (chan->enable && (cycles > 2 || !(((chan->octave_counter - 1) >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001))) { + chan->period_counter += (cycles >> (chan->octave + 1)); + if (cycles == 1) ++chan->period_counter; + + if (chan->period_counter >= 4096) { chan->prev = (uint8_t)(chan->lfsr >> 15); uint16_t in = ((chan->lfsr >> chan->tapa) ^ (chan->tapb_enable ? (chan->lfsr >> chan->tapb) : 0)) & 0x0001; chan->lfsr = (chan->lfsr << 1) | in; - chan->period_counter = chan->period; + chan->period_counter = chan->period + (chan->period_counter - 4096); } } - uint8_t out = chan->prev; - if (!chan->enable) out = 0; - else if (out != 0) out = chan->vol; - - chan->out_latch = out; + chan->out_latch = (chan->prev != 0) ? chan->vol : 0; } void pwrnoise_slope_write(slope_channel_t *chan, uint8_t reg, uint8_t val) { @@ -96,9 +97,18 @@ void pwrnoise_slope_write(slope_channel_t *chan, uint8_t reg, uint8_t val) { } } -void pwrnoise_slope_step(slope_channel_t *chan, bool force_zero) { - if (chan->enable && !((chan->octave_counter++ >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001)) { - if ((++chan->period_counter) == 4096) { +void pwrnoise_slope_step(slope_channel_t *chan, uint16_t cycles, bool force_zero) { + if (!chan->enable) { + chan->out_latch = 0; + return; + } + + chan->octave_counter += cycles; + if (chan->enable && (cycles > 2 || !(((chan->octave_counter - 1) >> chan->octave) & 0x0001) && ((chan->octave_counter >> chan->octave) & 0x0001))) { + chan->period_counter += (cycles >> (chan->octave + 1)); + if (cycles == 1) ++chan->period_counter; + + if (chan->period_counter >= 4096) { if (!chan->portion) { if ((chan->flags & 0x02) != 0) chan->accum -= chan->aoffset; else chan->accum += chan->aoffset; @@ -126,48 +136,47 @@ void pwrnoise_slope_step(slope_channel_t *chan, bool force_zero) { } } - chan->period_counter = chan->period; + chan->period_counter = chan->period + (chan->period_counter - 4096); + + uint8_t left = chan->accum >> 3; + uint8_t right = chan->accum >> 3; + + switch (chan->vol >> 4) { + case 0: + case 1: + left >>= 1; + case 2: + case 3: + left >>= 1; + case 4: + case 5: + case 6: + case 7: + left >>= 1; + default: break; + } + switch (chan->vol & 0xf) { + case 0: + case 1: + right >>= 1; + case 2: + case 3: + right >>= 1; + case 4: + case 5: + case 6: + case 7: + right >>= 1; + default: break; + } + + left &= (chan->vol >> 4); + right &= (chan->vol & 0xf); + chan->prev = (left << 4) | right; } } - uint8_t left = chan->accum >> 3; - uint8_t right = chan->accum >> 3; - - switch (chan->vol >> 4) { - case 0: - case 1: - left >>= 1; - case 2: - case 3: - left >>= 1; - case 4: - case 5: - case 6: - case 7: - left >>= 1; - default: break; - } - switch (chan->vol & 0xf) { - case 0: - case 1: - right >>= 1; - case 2: - case 3: - right >>= 1; - case 4: - case 5: - case 6: - case 7: - right >>= 1; - default: break; - } - - left &= (chan->vol >> 4); - right &= (chan->vol & 0xf); - uint8_t out = (left << 4) | right; - - if (!chan->enable || force_zero) out = 0; - chan->out_latch = out; + chan->out_latch = force_zero ? 0 : chan->prev; } void pwrnoise_reset(power_noise_t *pn) { @@ -200,14 +209,14 @@ void pwrnoise_write(power_noise_t *pn, uint8_t reg, uint8_t val) { } } -void pwrnoise_step(power_noise_t *pn, int16_t *left, int16_t *right) { +void pwrnoise_step(power_noise_t *pn, uint16_t cycles, int16_t *left, int16_t *right) { int32_t final_left, final_right; if ((pn->flags & 0x80) != 0) { - pwrnoise_noise_step(&pn->n1); - pwrnoise_noise_step(&pn->n2); - pwrnoise_noise_step(&pn->n3); - pwrnoise_slope_step(&pn->s, (pn->n1.am && !(pn->n1.prev)) || (pn->n2.am && !(pn->n2.prev)) || (pn->n3.am && !(pn->n3.prev))); + pwrnoise_noise_step(&pn->n1, cycles); + pwrnoise_noise_step(&pn->n2, cycles); + pwrnoise_noise_step(&pn->n3, cycles); + pwrnoise_slope_step(&pn->s, cycles, (pn->n1.am && !(pn->n1.prev)) || (pn->n2.am && !(pn->n2.prev)) || (pn->n3.am && !(pn->n3.prev))); final_left = (pn->n1.out_latch >> 4) + (pn->n2.out_latch >> 4) + (pn->n3.out_latch >> 4) + (pn->s.out_latch >> 4); final_right = (pn->n1.out_latch & 0xf) + (pn->n2.out_latch & 0xf) + (pn->n3.out_latch & 0xf) + (pn->s.out_latch & 0xf); diff --git a/extern/pwrnoise/pwrnoise.h b/extern/pwrnoise/pwrnoise.h index c20da5b47..0da3978b6 100644 --- a/extern/pwrnoise/pwrnoise.h +++ b/extern/pwrnoise/pwrnoise.h @@ -52,6 +52,7 @@ typedef struct { uint8_t vol; uint8_t out_latch; + uint8_t prev; } slope_channel_t; typedef struct { @@ -66,7 +67,7 @@ typedef struct { } power_noise_t; void pwrnoise_reset(power_noise_t *pn); -void pwrnoise_step(power_noise_t *pn, int16_t *left, int16_t *right); +void pwrnoise_step(power_noise_t *pn, uint16_t cycles, int16_t *left, int16_t *right); void pwrnoise_write(power_noise_t *pn, uint8_t reg, uint8_t val); #ifdef __cplusplus diff --git a/src/engine/platform/powernoise.cpp b/src/engine/platform/powernoise.cpp index 0e770940f..d0dbfc97d 100644 --- a/src/engine/platform/powernoise.cpp +++ b/src/engine/platform/powernoise.cpp @@ -19,6 +19,7 @@ #include "powernoise.h" #include "../engine.h" +#include "../../ta-log.h" #include "furIcons.h" #include @@ -81,9 +82,7 @@ void DivPlatformPowerNoise::acquire(short** buf, size_t len) { int16_t left, right; for (size_t h=0; hdata[oscBuf[0]->needle++]=mapAmp(((pn.n1.out_latch>>1)&0x7)+(pn.n1.out_latch>>5)); oscBuf[1]->data[oscBuf[1]->needle++]=mapAmp(((pn.n2.out_latch>>1)&0x7)+(pn.n2.out_latch>>5));