13#ifndef __UTILS_DSP_H__
14#define __UTILS_DSP_H__
16#include "zrythm-config.h"
27# include <lsp-plug.in/dsp/dsp.h>
33NONNULL HOT
static inline void
34dsp_fill (
float * buf,
float val,
size_t size)
37 if (ZRYTHM_USE_OPTIMIZED_DSP)
39 lsp_dsp_fill (buf, val, size);
44 for (
size_t i = 0; i < size; i++)
56NONNULL HOT
static inline void
57dsp_limit1 (
float * buf,
float minf,
float maxf,
size_t size)
60 if (ZRYTHM_USE_OPTIMIZED_DSP)
62 lsp_dsp_limit1 (buf, minf, maxf, size);
67 for (
size_t i = 0; i < size; i++)
69 buf[i] = CLAMP (buf[i], minf, maxf);
79NONNULL HOT
static inline void
80dsp_copy (
float * dest,
const float * src,
size_t size)
83 if (ZRYTHM_USE_OPTIMIZED_DSP)
85 lsp_dsp_copy (dest, src, size);
90 for (
size_t i = 0; i < size; i++)
102NONNULL HOT
static inline void
103dsp_mul_k2 (
float * dest,
float k,
size_t size)
106 if (ZRYTHM_USE_OPTIMIZED_DSP)
108 lsp_dsp_mul_k2 (dest, k, size);
113 for (
size_t i = 0; i < size; i++)
125NONNULL WARN_UNUSED_RESULT
static inline float
126dsp_abs_max (
float * buf,
size_t size)
129 if (ZRYTHM_USE_OPTIMIZED_DSP)
131 return lsp_dsp_abs_max (buf, size);
137 for (
size_t i = 0; i < size; i++)
139 if (fabsf (buf[i]) > ret)
141 ret = fabsf (buf[i]);
155HOT NONNULL
static inline bool
156dsp_abs_max_with_existing_peak (
float * buf,
float * cur_peak,
size_t size)
158 float new_peak = *cur_peak;
161 if (ZRYTHM_USE_OPTIMIZED_DSP)
163 new_peak = lsp_dsp_abs_max (buf, size);
168 for (
size_t i = 0; i < size; i++)
170 float val = fabsf (buf[i]);
181 *cur_peak = new_peak;
201NONNULL HOT
static inline void
202dsp_add2 (
float * dest,
const float * src,
size_t count)
205 if (ZRYTHM_USE_OPTIMIZED_DSP)
207 lsp_dsp_add2 (dest, src, count);
212 for (
size_t i = 0; i < count; i++)
214 dest[i] = dest[i] + src[i];
224NONNULL HOT
static inline void
225dsp_mix2 (
float * dest,
const float * src,
float k1,
float k2,
size_t size)
228 if (ZRYTHM_USE_OPTIMIZED_DSP)
230 lsp_dsp_mix2 (dest, src, k1, k2, size);
235 for (
size_t i = 0; i < size; i++)
237 dest[i] = dest[i] * k1 + src[i] * k2;
247NONNULL HOT
static inline void
248dsp_reverse1 (
float * dest,
size_t size)
251 if (ZRYTHM_USE_OPTIMIZED_DSP)
253 lsp_dsp_reverse1 (dest, size);
258 for (
size_t i = 0; i < size; i++)
260 dest[i] = dest[(size - i) - 1];
270NONNULL HOT
static inline void
271dsp_reverse2 (
float * dest,
float * src,
size_t size)
274 if (ZRYTHM_USE_OPTIMIZED_DSP)
276 lsp_dsp_reverse2 (dest, src, size);
281 for (
size_t i = 0; i < size; i++)
283 dest[i] = src[(size - i) - 1];
294NONNULL HOT
static inline void
295dsp_normalize (
float * dest,
const float * src,
size_t size)
298 if (ZRYTHM_USE_OPTIMIZED_DSP)
300 lsp_dsp_normalize (dest, src, size);
305 dsp_copy (dest, src, size);
306 float abs_peak = dsp_abs_max (dest, size);
307 dsp_mul_k2 (dest, 1.f / abs_peak, size);
343 int32_t start_offset,
344 int32_t total_frames_to_fade,
346 float fade_from_multiplier);
362 int32_t start_offset,
363 int32_t total_frames_to_fade,
365 float fade_to_multiplier);
NONNULL float dsp_min(float *buf, size_t size)
Gets the minimum of the buffer.
NONNULL void dsp_make_mono(float *l, float *r, size_t size, bool equal_power)
Makes the two signals mono.
NONNULL void dsp_mix_add2(float *dest, const float *src1, const float *src2, float k1, float k2, size_t size)
Calculate dst[i] = dst[i] + src1[i] * k1 + src2[i] * k2.
NONNULL void dsp_linear_fade_in_from(float *dest, int32_t start_offset, int32_t total_frames_to_fade, size_t size, float fade_from_multiplier)
Calculate linear fade by multiplying from 0 to 1 for.
NONNULL float dsp_max(float *buf, size_t size)
Gets the maximum of the buffer.
NONNULL void dsp_linear_fade_out_to(float *dest, int32_t start_offset, int32_t total_frames_to_fade, size_t size, float fade_to_multiplier)
Calculate linear fade by multiplying from 0 to 1 for.
#define math_floats_equal(a, b)
Checks if 2 doubles are equal.