mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05: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
					
				
					 3 changed files with 28 additions and 46 deletions
				
			
		| 
						 | 
					@ -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 {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue