filter-chain: improve some float handling

Avoid some double to float conversions.
Use fmin and fmax.
This commit is contained in:
Wim Taymans 2022-11-02 12:41:20 +01:00
parent f801dc0886
commit 6bb73124aa
3 changed files with 28 additions and 46 deletions

View file

@ -785,10 +785,10 @@ static struct spa_pod *get_prop_info(struct graph *graph, struct spa_pod_builder
spa_pod_builder_prop(b, SPA_PROP_INFO_type, 0); spa_pod_builder_prop(b, SPA_PROP_INFO_type, 0);
if (p->hint & FC_HINT_BOOLEAN) { if (p->hint & FC_HINT_BOOLEAN) {
if (min == max) { if (min == max) {
spa_pod_builder_bool(b, def <= 0.0 ? false : true); spa_pod_builder_bool(b, def <= 0.0f ? false : true);
} else { } else {
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Enum, 0); spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Enum, 0);
spa_pod_builder_bool(b, def <= 0.0 ? false : true); spa_pod_builder_bool(b, def <= 0.0f ? false : true);
spa_pod_builder_bool(b, false); spa_pod_builder_bool(b, false);
spa_pod_builder_bool(b, true); spa_pod_builder_bool(b, true);
spa_pod_builder_pop(b, &f[1]); spa_pod_builder_pop(b, &f[1]);
@ -844,7 +844,7 @@ static struct spa_pod *get_props_param(struct graph *graph, struct spa_pod_build
spa_pod_builder_string(b, name); spa_pod_builder_string(b, name);
if (p->hint & FC_HINT_BOOLEAN) { if (p->hint & FC_HINT_BOOLEAN) {
spa_pod_builder_bool(b, port->control_data <= 0.0 ? false : true); spa_pod_builder_bool(b, port->control_data <= 0.0f ? false : true);
} else if (p->hint & FC_HINT_INTEGER) { } else if (p->hint & FC_HINT_INTEGER) {
spa_pod_builder_int(b, port->control_data); spa_pod_builder_int(b, port->control_data);
} else { } else {

View file

@ -11,24 +11,6 @@
#include <math.h> #include <math.h>
#include "biquad.h" #include "biquad.h"
#ifndef max
#define max(a, b) \
({ \
__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a > _b ? _a : _b; \
})
#endif
#ifndef min
#define min(a, b) \
({ \
__typeof__(a) _a = (a); \
__typeof__(b) _b = (b); \
_a < _b ? _a : _b; \
})
#endif
#ifndef M_PI #ifndef M_PI
#define M_PI 3.14159265358979323846 #define M_PI 3.14159265358979323846
#endif #endif
@ -47,7 +29,7 @@ static void set_coefficient(struct biquad *bq, double b0, double b1, double b2,
static void biquad_lowpass(struct biquad *bq, double cutoff, double resonance) static void biquad_lowpass(struct biquad *bq, double cutoff, double resonance)
{ {
/* Limit cutoff to 0 to 1. */ /* Limit cutoff to 0 to 1. */
cutoff = max(0.0, min(cutoff, 1.0)); cutoff = fmax(0.0, fmin(cutoff, 1.0));
if (cutoff == 1 || cutoff == 0) { if (cutoff == 1 || cutoff == 0) {
/* When cutoff is 1, the z-transform is 1. /* When cutoff is 1, the z-transform is 1.
@ -59,7 +41,7 @@ static void biquad_lowpass(struct biquad *bq, double cutoff, double resonance)
} }
/* Compute biquad coefficients for lowpass filter */ /* Compute biquad coefficients for lowpass filter */
resonance = max(0.0, resonance); /* can't go negative */ resonance = fmax(0.0, resonance); /* can't go negative */
double g = pow(10.0, 0.05 * resonance); double g = pow(10.0, 0.05 * resonance);
double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2); double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2);
@ -81,7 +63,7 @@ static void biquad_lowpass(struct biquad *bq, double cutoff, double resonance)
static void biquad_highpass(struct biquad *bq, double cutoff, double resonance) static void biquad_highpass(struct biquad *bq, double cutoff, double resonance)
{ {
/* Limit cutoff to 0 to 1. */ /* Limit cutoff to 0 to 1. */
cutoff = max(0.0, min(cutoff, 1.0)); cutoff = fmax(0.0, fmin(cutoff, 1.0));
if (cutoff == 1 || cutoff == 0) { if (cutoff == 1 || cutoff == 0) {
/* When cutoff is one, the z-transform is 0. */ /* When cutoff is one, the z-transform is 0. */
@ -95,7 +77,7 @@ static void biquad_highpass(struct biquad *bq, double cutoff, double resonance)
} }
/* Compute biquad coefficients for highpass filter */ /* Compute biquad coefficients for highpass filter */
resonance = max(0.0, resonance); /* can't go negative */ resonance = fmax(0.0, resonance); /* can't go negative */
double g = pow(10.0, 0.05 * resonance); double g = pow(10.0, 0.05 * resonance);
double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2); double d = sqrt((4 - sqrt(16 - 16 / (g * g))) / 2);
@ -117,10 +99,10 @@ static void biquad_highpass(struct biquad *bq, double cutoff, double resonance)
static void biquad_bandpass(struct biquad *bq, double frequency, double Q) static void biquad_bandpass(struct biquad *bq, double frequency, double Q)
{ {
/* No negative frequencies allowed. */ /* No negative frequencies allowed. */
frequency = max(0.0, frequency); frequency = fmax(0.0, frequency);
/* Don't let Q go negative, which causes an unstable filter. */ /* Don't let Q go negative, which causes an unstable filter. */
Q = max(0.0, Q); Q = fmax(0.0, Q);
if (frequency <= 0 || frequency >= 1) { if (frequency <= 0 || frequency >= 1) {
/* When the cutoff is zero, the z-transform approaches 0, if Q /* When the cutoff is zero, the z-transform approaches 0, if Q
@ -158,7 +140,7 @@ static void biquad_bandpass(struct biquad *bq, double frequency, double Q)
static void biquad_lowshelf(struct biquad *bq, double frequency, double db_gain) static void biquad_lowshelf(struct biquad *bq, double frequency, double db_gain)
{ {
/* Clip frequencies to between 0 and 1, inclusive. */ /* Clip frequencies to between 0 and 1, inclusive. */
frequency = max(0.0, min(frequency, 1.0)); frequency = fmax(0.0, fmin(frequency, 1.0));
double A = pow(10.0, db_gain / 40); double A = pow(10.0, db_gain / 40);
@ -195,7 +177,7 @@ static void biquad_highshelf(struct biquad *bq, double frequency,
double db_gain) double db_gain)
{ {
/* Clip frequencies to between 0 and 1, inclusive. */ /* Clip frequencies to between 0 and 1, inclusive. */
frequency = max(0.0, min(frequency, 1.0)); frequency = fmax(0.0, fmin(frequency, 1.0));
double A = pow(10.0, db_gain / 40); double A = pow(10.0, db_gain / 40);
@ -232,10 +214,10 @@ static void biquad_peaking(struct biquad *bq, double frequency, double Q,
double db_gain) double db_gain)
{ {
/* Clip frequencies to between 0 and 1, inclusive. */ /* Clip frequencies to between 0 and 1, inclusive. */
frequency = max(0.0, min(frequency, 1.0)); frequency = fmax(0.0, fmin(frequency, 1.0));
/* Don't let Q go negative, which causes an unstable filter. */ /* Don't let Q go negative, which causes an unstable filter. */
Q = max(0.0, Q); Q = fmax(0.0, Q);
double A = pow(10.0, db_gain / 40); double A = pow(10.0, db_gain / 40);
@ -270,10 +252,10 @@ static void biquad_peaking(struct biquad *bq, double frequency, double Q,
static void biquad_notch(struct biquad *bq, double frequency, double Q) static void biquad_notch(struct biquad *bq, double frequency, double Q)
{ {
/* Clip frequencies to between 0 and 1, inclusive. */ /* Clip frequencies to between 0 and 1, inclusive. */
frequency = max(0.0, min(frequency, 1.0)); frequency = fmax(0.0, fmin(frequency, 1.0));
/* Don't let Q go negative, which causes an unstable filter. */ /* Don't let Q go negative, which causes an unstable filter. */
Q = max(0.0, Q); Q = fmax(0.0, Q);
if (frequency <= 0 || frequency >= 1) { if (frequency <= 0 || frequency >= 1) {
/* When frequency is 0 or 1, the z-transform is 1. */ /* When frequency is 0 or 1, the z-transform is 1. */
@ -306,10 +288,10 @@ static void biquad_notch(struct biquad *bq, double frequency, double Q)
static void biquad_allpass(struct biquad *bq, double frequency, double Q) static void biquad_allpass(struct biquad *bq, double frequency, double Q)
{ {
/* Clip frequencies to between 0 and 1, inclusive. */ /* Clip frequencies to between 0 and 1, inclusive. */
frequency = max(0.0, min(frequency, 1.0)); frequency = fmax(0.0, fmin(frequency, 1.0));
/* Don't let Q go negative, which causes an unstable filter. */ /* Don't let Q go negative, which causes an unstable filter. */
Q = max(0.0, Q); Q = fmax(0.0, Q);
if (frequency <= 0 || frequency >= 1) { if (frequency <= 0 || frequency >= 1) {
/* When frequency is 0 or 1, the z-transform is 1. */ /* When frequency is 0 or 1, the z-transform is 1. */

View file

@ -80,39 +80,39 @@ static float get_default(struct fc_port *port, LADSPA_PortRangeHintDescriptor hi
break; break;
case LADSPA_HINT_DEFAULT_LOW: case LADSPA_HINT_DEFAULT_LOW:
if (LADSPA_IS_HINT_LOGARITHMIC(hint)) if (LADSPA_IS_HINT_LOGARITHMIC(hint))
def = (LADSPA_Data) exp(log(lower) * 0.75 + log(upper) * 0.25); def = (LADSPA_Data) expf(logf(lower) * 0.75f + logf(upper) * 0.25f);
else else
def = (LADSPA_Data) (lower * 0.75 + upper * 0.25); def = (LADSPA_Data) (lower * 0.75f + upper * 0.25f);
break; break;
case LADSPA_HINT_DEFAULT_MIDDLE: case LADSPA_HINT_DEFAULT_MIDDLE:
if (LADSPA_IS_HINT_LOGARITHMIC(hint)) if (LADSPA_IS_HINT_LOGARITHMIC(hint))
def = (LADSPA_Data) exp(log(lower) * 0.5 + log(upper) * 0.5); def = (LADSPA_Data) expf(logf(lower) * 0.5f + logf(upper) * 0.5f);
else else
def = (LADSPA_Data) (lower * 0.5 + upper * 0.5); def = (LADSPA_Data) (lower * 0.5f + upper * 0.5f);
break; break;
case LADSPA_HINT_DEFAULT_HIGH: case LADSPA_HINT_DEFAULT_HIGH:
if (LADSPA_IS_HINT_LOGARITHMIC(hint)) if (LADSPA_IS_HINT_LOGARITHMIC(hint))
def = (LADSPA_Data) exp(log(lower) * 0.25 + log(upper) * 0.75); def = (LADSPA_Data) expf(logf(lower) * 0.25f + logf(upper) * 0.75f);
else else
def = (LADSPA_Data) (lower * 0.25 + upper * 0.75); def = (LADSPA_Data) (lower * 0.25f + upper * 0.75f);
break; break;
case LADSPA_HINT_DEFAULT_0: case LADSPA_HINT_DEFAULT_0:
def = 0; def = 0.0f;
break; break;
case LADSPA_HINT_DEFAULT_1: case LADSPA_HINT_DEFAULT_1:
def = 1; def = 1.0f;
break; break;
case LADSPA_HINT_DEFAULT_100: case LADSPA_HINT_DEFAULT_100:
def = 100; def = 100.0f;
break; break;
case LADSPA_HINT_DEFAULT_440: case LADSPA_HINT_DEFAULT_440:
def = 440; def = 440.0f;
break; break;
default: default:
if (upper == lower) if (upper == lower)
def = upper; def = upper;
else else
def = SPA_CLAMP(0.5 * upper, lower, upper); def = SPA_CLAMPF(0.5f * upper, lower, upper);
break; break;
} }
if (LADSPA_IS_HINT_INTEGER(hint)) if (LADSPA_IS_HINT_INTEGER(hint))