pipewire/spa/plugins/audioconvert/peaks-ops.h
Wim Taymans c02cdcb5ce audioconvert: add avx2 optimized s32_to f32d
Add an alternative avx2 s32_to_f32d implementation that doesn't use the
gather function for when gather is slow.

Don't overwrite the orinal cpu_flags but store the selected flags in a
new variable. Use this to debug the selected function cpu flags.

Build libraries with defines from previous libraries so that we can
reuse functions from them.

We can then remove the SSE2 | SLOW_GATHER function selection from the
list. We will now select avx2 and it will then switch implementations
based on the CPU flags.
2026-03-20 17:57:59 +01:00

59 lines
1.5 KiB
C

/* Spa */
/* SPDX-FileCopyrightText: Copyright © 2022 Wim Taymans */
/* SPDX-License-Identifier: MIT */
#include <string.h>
#include <stdio.h>
#include <spa/utils/defs.h>
#include <spa/support/log.h>
#undef SPA_LOG_TOPIC_DEFAULT
#define SPA_LOG_TOPIC_DEFAULT &resample_log_topic
extern struct spa_log_topic resample_log_topic;
struct peaks {
uint32_t cpu_flags;
uint32_t func_cpu_flags;
const char *func_name;
struct spa_log *log;
uint32_t flags;
void (*min_max) (struct peaks *peaks, const float * SPA_RESTRICT src,
uint32_t n_samples, float *min, float *max);
float (*abs_max) (struct peaks *peaks, const float * SPA_RESTRICT src,
uint32_t n_samples, float max);
void (*free) (struct peaks *peaks);
};
int peaks_init(struct peaks *peaks);
#define peaks_min_max(peaks,...) (peaks)->min_max(peaks, __VA_ARGS__)
#define peaks_abs_max(peaks,...) (peaks)->abs_max(peaks, __VA_ARGS__)
#define peaks_free(peaks) (peaks)->free(peaks)
#define DEFINE_MIN_MAX_FUNCTION(arch) \
void peaks_min_max_##arch(struct peaks *peaks, \
const float * SPA_RESTRICT src, \
uint32_t n_samples, float *min, float *max);
#define DEFINE_ABS_MAX_FUNCTION(arch) \
float peaks_abs_max_##arch(struct peaks *peaks, \
const float * SPA_RESTRICT src, \
uint32_t n_samples, float max);
#define PEAKS_OPS_MAX_ALIGN 16
DEFINE_MIN_MAX_FUNCTION(c);
DEFINE_ABS_MAX_FUNCTION(c);
#if defined (HAVE_SSE)
DEFINE_MIN_MAX_FUNCTION(sse);
DEFINE_ABS_MAX_FUNCTION(sse);
#endif
#undef DEFINE_MIN_MAX_FUNCTION
#undef DEFINE_ABS_MAX_FUNCTION