Skip to content

Commit

Permalink
Audio: crossover: create share header file for crossover and multiban…
Browse files Browse the repository at this point in the history
…d 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>
  • Loading branch information
btian1 committed Dec 20, 2023
1 parent b3b9abf commit c464fdd
Show file tree
Hide file tree
Showing 9 changed files with 91 additions and 94 deletions.
28 changes: 1 addition & 27 deletions src/audio/crossover/crossover.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
#include <sof/audio/format.h>
#include <sof/audio/pipeline.h>
#include <sof/audio/ipc-config.h>
#include <sof/math/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>
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/audio/multiband_drc/multiband_drc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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/drc/drc_algorithm.h>
#include <sof/audio/buffer.h>
#include <sof/audio/format.h>
Expand All @@ -15,6 +14,7 @@
#include <sof/lib/memory.h>
#include <sof/lib/uuid.h>
#include <sof/math/numbers.h>
#include <sof/math/crossover_common.h>
#include <sof/trace/trace.h>
#include <ipc/control.h>
#include <ipc/stream.h>
Expand Down
2 changes: 1 addition & 1 deletion src/audio/multiband_drc/multiband_drc.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <sof/math/crossover_common.h>
#include <sof/audio/drc/drc.h>
#include <sof/math/iir_df2t.h>
#include <sof/audio/component.h>
Expand Down
2 changes: 1 addition & 1 deletion src/audio/multiband_drc/user/multiband_drc.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
#define __USER_MULTIBAND_DRC_H__

#include <stdint.h>
#include <user/crossover.h>
#include <user/drc.h>
#include <user/eq.h>
#include <sof/math/crossover_common.h>

/* Maximum number of frequency band for Multiband DRC */
#define SOF_MULTIBAND_DRC_MAX_BANDS SOF_CROSSOVER_MAX_STREAMS
Expand Down
2 changes: 1 addition & 1 deletion src/include/kernel/abi.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

/** \brief SOF ABI version major, minor and patch numbers */
#define SOF_ABI_MAJOR 3
#define SOF_ABI_MINOR 29
#define SOF_ABI_MINOR 30
#define SOF_ABI_PATCH 0

/** \brief SOF ABI version number. Format within 32bit word is MMmmmppp */
Expand Down
37 changes: 1 addition & 36 deletions src/include/sof/audio/crossover/crossover.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,14 @@

#include <sof/audio/module_adapter/module/module_interface.h>
#include <sof/math/iir_df2t.h>
#include <sof/math/crossover_common.h>
#include <sof/platform.h>
#include <user/crossover.h>
#include <stdint.h>

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).
Expand Down Expand Up @@ -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,
Expand All @@ -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 */
Expand Down Expand Up @@ -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.
*/
Expand Down
24 changes: 0 additions & 24 deletions src/include/sof/audio/crossover/crossover_algorithm.h

This file was deleted.

84 changes: 84 additions & 0 deletions src/include/sof/math/crossover_common.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright(c) 2023 Intel Corporation. All rights reserved.
*
* Author: Baofeng Tian <baofeng.tian@intel.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__ */
4 changes: 1 addition & 3 deletions src/include/user/crossover.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <sof/math/crossover_common.h>

/* Maximum number allowed in configuration blob */
#define SOF_CROSSOVER_MAX_SIZE 1024
Expand Down

0 comments on commit c464fdd

Please sign in to comment.