summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/disc_flt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/disc_flt.c')
-rw-r--r--src/emu/sound/disc_flt.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/emu/sound/disc_flt.c b/src/emu/sound/disc_flt.c
index f6cc22918f0..b7bd7b57272 100644
--- a/src/emu/sound/disc_flt.c
+++ b/src/emu/sound/disc_flt.c
@@ -97,7 +97,7 @@ struct dst_rcdisc4_context
struct dst_rcfilter_context
{
double vCap;
- double vRef;
+ double rc;
double exponent;
};
@@ -147,18 +147,26 @@ static DISCRETE_STEP(dst_crfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ double rc = DST_CRFILTER__R * DST_CRFILTER__C;
+
+ if (rc != context->rc)
+ {
+ context->rc = rc;
+ context->exponent = RC_CHARGE_EXP(rc);
+ }
+
node->output[0] = DST_CRFILTER__IN - context->vCap;
//context->vCap += ((DST_CRFILTER__IN - context->vRef) - context->vCap) * context->exponent;
- context->vCap += (node->output[0] - context->vRef) * context->exponent;
+ context->vCap += (node->output[0] - DST_CRFILTER__VREF) * context->exponent;
}
static DISCRETE_RESET(dst_crfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
- context->exponent = RC_CHARGE_EXP(DST_CRFILTER__R * DST_CRFILTER__C);
- context->vCap = 0;
- context->vRef = DST_CRFILTER__VREF;
+ context->rc = DST_CRFILTER__R * DST_CRFILTER__C;
+ context->exponent = RC_CHARGE_EXP(context->rc);
+ context->vCap = 0;
node->output[0] = DST_CRFILTER__IN;
}
@@ -1021,20 +1029,28 @@ static DISCRETE_STEP(dst_rcfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ double rc = DST_RCFILTER__R * DST_RCFILTER__C;
+
+ if (rc != context->rc)
+ {
+ context->rc = rc;
+ context->exponent = RC_CHARGE_EXP(rc);
+ }
+
/************************************************************************/
/* Next Value = PREV + (INPUT_VALUE - PREV)*(1-(EXP(-TIMEDELTA/RC))) */
/************************************************************************/
context->vCap += ((DST_RCFILTER__VIN - node->output[0]) * context->exponent);
- node->output[0] = context->vCap + context->vRef;
+ node->output[0] = context->vCap + DST_RCFILTER__VREF;
}
static DISCRETE_RESET(dst_rcfilter)
{
struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
- context->exponent = RC_CHARGE_EXP(DST_RCFILTER__R * DST_RCFILTER__C);
- context->vRef = DST_RCFILTER__VREF;
+ context->rc = DST_RCFILTER__R * DST_RCFILTER__C;
+ context->exponent = RC_CHARGE_EXP(context->rc);
context->vCap = 0;
node->output[0] = 0;
}