mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-07-21 18:26:24 +00:00
filter-chain: improve some float handling
Avoid some double to float conversions. Use fmin and fmax.
This commit is contained in:
parent
f801dc0886
commit
6bb73124aa
|
@ -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);
|
||||
if (p->hint & FC_HINT_BOOLEAN) {
|
||||
if (min == max) {
|
||||
spa_pod_builder_bool(b, def <= 0.0 ? false : true);
|
||||
spa_pod_builder_bool(b, def <= 0.0f ? false : true);
|
||||
} else {
|
||||
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, true);
|
||||
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);
|
||||
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) {
|
||||
spa_pod_builder_int(b, port->control_data);
|
||||
} else {
|
||||
|
|
|
@ -11,24 +11,6 @@
|
|||
#include <math.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
|
||||
#define M_PI 3.14159265358979323846
|
||||
#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)
|
||||
{
|
||||
/* 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) {
|
||||
/* 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 */
|
||||
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 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)
|
||||
{
|
||||
/* 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) {
|
||||
/* 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 */
|
||||
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 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)
|
||||
{
|
||||
/* 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. */
|
||||
Q = max(0.0, Q);
|
||||
Q = fmax(0.0, Q);
|
||||
|
||||
if (frequency <= 0 || frequency >= 1) {
|
||||
/* 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)
|
||||
{
|
||||
/* 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);
|
||||
|
||||
|
@ -195,7 +177,7 @@ static void biquad_highshelf(struct biquad *bq, double frequency,
|
|||
double db_gain)
|
||||
{
|
||||
/* 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);
|
||||
|
||||
|
@ -232,10 +214,10 @@ static void biquad_peaking(struct biquad *bq, double frequency, double Q,
|
|||
double db_gain)
|
||||
{
|
||||
/* 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. */
|
||||
Q = max(0.0, Q);
|
||||
Q = fmax(0.0, Q);
|
||||
|
||||
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)
|
||||
{
|
||||
/* 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. */
|
||||
Q = max(0.0, Q);
|
||||
Q = fmax(0.0, Q);
|
||||
|
||||
if (frequency <= 0 || frequency >= 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)
|
||||
{
|
||||
/* 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. */
|
||||
Q = max(0.0, Q);
|
||||
Q = fmax(0.0, Q);
|
||||
|
||||
if (frequency <= 0 || frequency >= 1) {
|
||||
/* When frequency is 0 or 1, the z-transform is 1. */
|
||||
|
|
|
@ -80,39 +80,39 @@ static float get_default(struct fc_port *port, LADSPA_PortRangeHintDescriptor hi
|
|||
break;
|
||||
case LADSPA_HINT_DEFAULT_LOW:
|
||||
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
|
||||
def = (LADSPA_Data) (lower * 0.75 + upper * 0.25);
|
||||
def = (LADSPA_Data) (lower * 0.75f + upper * 0.25f);
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_MIDDLE:
|
||||
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
|
||||
def = (LADSPA_Data) (lower * 0.5 + upper * 0.5);
|
||||
def = (LADSPA_Data) (lower * 0.5f + upper * 0.5f);
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_HIGH:
|
||||
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
|
||||
def = (LADSPA_Data) (lower * 0.25 + upper * 0.75);
|
||||
def = (LADSPA_Data) (lower * 0.25f + upper * 0.75f);
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_0:
|
||||
def = 0;
|
||||
def = 0.0f;
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_1:
|
||||
def = 1;
|
||||
def = 1.0f;
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_100:
|
||||
def = 100;
|
||||
def = 100.0f;
|
||||
break;
|
||||
case LADSPA_HINT_DEFAULT_440:
|
||||
def = 440;
|
||||
def = 440.0f;
|
||||
break;
|
||||
default:
|
||||
if (upper == lower)
|
||||
def = upper;
|
||||
else
|
||||
def = SPA_CLAMP(0.5 * upper, lower, upper);
|
||||
def = SPA_CLAMPF(0.5f * upper, lower, upper);
|
||||
break;
|
||||
}
|
||||
if (LADSPA_IS_HINT_INTEGER(hint))
|
||||
|
|
Loading…
Reference in a new issue