Audio: crossover: create share header file for crossover and multiband DRC

Multiband DRC requires crossover functionality to cover crossover
specific process, previously, these information defined in crossover
specific directory, now, create a new shared header file for common
information shared both in crossover and multiband DRC.

Signed-off-by: Baofeng Tian <baofeng.tian@intel.com>
This commit is contained in:
Baofeng Tian 2023-12-20 11:13:17 +08:00 committed by Liam Girdwood
parent 1f3cf75a1b
commit aee89ccf87
8 changed files with 90 additions and 93 deletions

View File

@ -11,8 +11,8 @@
#include <sof/audio/format.h>
#include <sof/audio/pipeline.h>
#include <sof/audio/ipc-config.h>
#include <module/crossover/crossover_common.h>
#include <sof/audio/crossover/crossover.h>
#include <sof/audio/crossover/crossover_algorithm.h>
#include <sof/common.h>
#include <rtos/panic.h>
#include <sof/ipc/msg.h>
@ -51,32 +51,6 @@ static inline void crossover_free_config(struct sof_crossover_config **config)
*config = NULL;
}
/**
* \brief Reset the state of an LR4 filter.
*/
static inline void crossover_reset_state_lr4(struct iir_state_df2t *lr4)
{
rfree(lr4->coef);
rfree(lr4->delay);
lr4->coef = NULL;
lr4->delay = NULL;
}
/**
* \brief Reset the state (coefficients and delay) of the crossover filter
* of a single channel.
*/
inline void crossover_reset_state_ch(struct crossover_state *ch_state)
{
int i;
for (i = 0; i < CROSSOVER_MAX_LR4; i++) {
crossover_reset_state_lr4(&ch_state->lowpass[i]);
crossover_reset_state_lr4(&ch_state->highpass[i]);
}
}
/**
* \brief Reset the state (coefficients and delay) of the crossover filter
* across all channels

View File

@ -5,7 +5,6 @@
// Author: Pin-chih Lin <johnylin@google.com>
#include <sof/audio/module_adapter/module/generic.h>
#include <sof/audio/crossover/crossover_algorithm.h>
#include <sof/audio/buffer.h>
#include <sof/audio/format.h>
#include <sof/audio/ipc-config.h>
@ -14,6 +13,7 @@
#include <sof/lib/memory.h>
#include <sof/lib/uuid.h>
#include <sof/math/numbers.h>
#include <module/crossover/crossover_common.h>
#include <sof/trace/trace.h>
#include <ipc/control.h>
#include <ipc/stream.h>

View File

@ -8,7 +8,7 @@
#define __SOF_AUDIO_MULTIBAND_DRC_MULTIBAND_DRC_H__
#include <sof/audio/module_adapter/module/generic.h>
#include <sof/audio/crossover/crossover.h>
#include <module/crossover/crossover_common.h>
#include <sof/math/iir_df2t.h>
#include <sof/audio/component.h>
#include <sof/audio/data_blob.h>

View File

@ -9,8 +9,8 @@
#define __USER_MULTIBAND_DRC_H__
#include <stdint.h>
#include <user/crossover.h>
#include <user/eq.h>
#include <module/crossover/crossover_common.h>
#include "../../drc/drc_user.h"

View File

@ -0,0 +1,84 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2023 Intel Corporation. All rights reserved.
*
* Author: Sebastiano Carlucci <scarlucci@google.com>
*/
#ifndef __SOF_CROSSOVER_COMMON_H__
#define __SOF_CROSSOVER_COMMON_H__
#include <sof/math/iir_df2t.h>
#include <user/eq.h>
/* Number of sinks for a 2 way crossover filter */
#define CROSSOVER_2WAY_NUM_SINKS 2
/* Number of sinks for a 3 way crossover filter */
#define CROSSOVER_3WAY_NUM_SINKS 3
/* Number of sinks for a 4 way crossover filter */
#define CROSSOVER_4WAY_NUM_SINKS 4
/* Number of delay slots allocated for LR4 Filters */
#define CROSSOVER_NUM_DELAYS_LR4 4
/* Maximum number of LR4 highpass OR lowpass filters */
#define CROSSOVER_MAX_LR4 3
/* Maximum Number of sinks allowed in config */
#define SOF_CROSSOVER_MAX_STREAMS 4
/**
* Stores the state of one channel of the Crossover filter
*/
struct crossover_state {
/* Store the state for each LR4 filter. */
struct iir_state_df2t lowpass[CROSSOVER_MAX_LR4];
struct iir_state_df2t highpass[CROSSOVER_MAX_LR4];
};
typedef void (*crossover_split)(int32_t in, int32_t out[],
struct crossover_state *state);
extern const crossover_split crossover_split_fnmap[];
/* crossover init function */
int crossover_init_coef_ch(struct sof_eq_iir_biquad *coef,
struct crossover_state *ch_state,
int32_t num_sinks);
/**
* \brief Reset the state of an LR4 filter.
*/
static inline void crossover_reset_state_lr4(struct iir_state_df2t *lr4)
{
rfree(lr4->coef);
rfree(lr4->delay);
lr4->coef = NULL;
lr4->delay = NULL;
}
/**
* \brief Reset the state (coefficients and delay) of the crossover filter
* of a single channel.
*/
static inline void crossover_reset_state_ch(struct crossover_state *ch_state)
{
int i;
for (i = 0; i < CROSSOVER_MAX_LR4; i++) {
crossover_reset_state_lr4(&ch_state->lowpass[i]);
crossover_reset_state_lr4(&ch_state->highpass[i]);
}
}
/**
* \brief Returns Crossover split function.
*/
static inline crossover_split crossover_find_split_func(int32_t num_sinks)
{
if (num_sinks < CROSSOVER_2WAY_NUM_SINKS ||
num_sinks > CROSSOVER_4WAY_NUM_SINKS)
return NULL;
// The functions in the map are offset by 2 indices.
return crossover_split_fnmap[num_sinks - CROSSOVER_2WAY_NUM_SINKS];
}
#endif /* __SOF_CROSSOVER_COMMON_H__ */

View File

@ -9,6 +9,7 @@
#include <sof/audio/module_adapter/module/module_interface.h>
#include <sof/math/iir_df2t.h>
#include <module/crossover/crossover_common.h>
#include <sof/platform.h>
#include <user/crossover.h>
#include <stdint.h>
@ -16,18 +17,6 @@
struct comp_buffer;
struct comp_dev;
/* Maximum number of LR4 highpass OR lowpass filters */
#define CROSSOVER_MAX_LR4 3
/* Number of delay slots allocated for LR4 Filters */
#define CROSSOVER_NUM_DELAYS_LR4 4
/* Number of sinks for a 2 way crossover filter */
#define CROSSOVER_2WAY_NUM_SINKS 2
/* Number of sinks for a 3 way crossover filter */
#define CROSSOVER_3WAY_NUM_SINKS 3
/* Number of sinks for a 4 way crossover filter */
#define CROSSOVER_4WAY_NUM_SINKS 4
/**
* The Crossover filter will have from 2 to 4 outputs.
* Diagram of a 4-way Crossover filter (6 LR4 Filters).
@ -58,15 +47,6 @@ struct comp_dev;
*
*/
/**
* Stores the state of one channel of the Crossover filter
*/
struct crossover_state {
/* Store the state for each LR4 filter. */
struct iir_state_df2t lowpass[CROSSOVER_MAX_LR4];
struct iir_state_df2t highpass[CROSSOVER_MAX_LR4];
};
struct comp_data;
typedef void (*crossover_process)(struct comp_data *cd,
@ -75,9 +55,6 @@ typedef void (*crossover_process)(struct comp_data *cd,
int32_t num_sinks,
uint32_t frames);
typedef void (*crossover_split)(int32_t in, int32_t out[],
struct crossover_state *state);
/* Crossover component private data */
struct comp_data {
/**< filter state */
@ -137,18 +114,6 @@ static inline crossover_process
extern const crossover_split crossover_split_fnmap[];
extern const size_t crossover_split_fncount;
/**
* \brief Returns Crossover split function.
*/
static inline crossover_split crossover_find_split_func(int32_t num_sinks)
{
if (num_sinks < CROSSOVER_2WAY_NUM_SINKS ||
num_sinks > CROSSOVER_4WAY_NUM_SINKS)
return NULL;
// The functions in the map are offset by 2 indices.
return crossover_split_fnmap[num_sinks - CROSSOVER_2WAY_NUM_SINKS];
}
/*
* \brief Runs input in through the LR4 filter and returns it's output.
*/

View File

@ -1,24 +0,0 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2020 Google LLC. All rights reserved.
*
* Author: Pin-chih Lin <johnylin@google.com>
*/
#ifndef __SOF_AUDIO_CROSSOVER_CROSSOVER_ALGORITHM_H__
#define __SOF_AUDIO_CROSSOVER_CROSSOVER_ALGORITHM_H__
#include <stdint.h>
#include <sof/audio/crossover/crossover.h>
#include <sof/platform.h>
#include <sof/math/iir_df2t.h>
#include <user/crossover.h>
/* crossover reset function */
void crossover_reset_state_ch(struct crossover_state *ch_state);
/* crossover init function */
int crossover_init_coef_ch(struct sof_eq_iir_biquad *coef,
struct crossover_state *ch_state,
int32_t num_sinks);
#endif // __SOF_AUDIO_CROSSOVER_CROSSOVER_ALGORITHM_H__

View File

@ -10,9 +10,7 @@
#include <stdint.h>
#include <user/eq.h>
/* Maximum Number of sinks allowed in config */
#define SOF_CROSSOVER_MAX_STREAMS 4
#include <module/crossover/crossover_common.h>
/* Maximum number allowed in configuration blob */
#define SOF_CROSSOVER_MAX_SIZE 1024