1 /* SPDX-License-Identifier: BSD-3-Clause
2  *
3  * Copyright(c) 2020 Google LLC. All rights reserved.
4  *
5  * Author: Pin-chih Lin <johnylin@google.com>
6  */
7 
8 #ifndef __USER_MULTIBAND_DRC_H__
9 #define __USER_MULTIBAND_DRC_H__
10 
11 #include <stdint.h>
12 #include <user/crossover.h>
13 #include <user/drc.h>
14 #include <user/eq.h>
15 
16 /* Maximum number of frequency band for Multiband DRC */
17 #define SOF_MULTIBAND_DRC_MAX_BANDS SOF_CROSSOVER_MAX_STREAMS
18 
19 /* Maximum number of Crossover LR4 highpass and lowpass filters */
20 #define SOF_CROSSOVER_MAX_LR4 ((SOF_CROSSOVER_MAX_STREAMS - 1) * 2)
21 
22 /* The number of biquads (and biquads in series) of (De)Emphasis Equalizer */
23 #define SOF_EMP_DEEMP_BIQUADS 2
24 
25 /* Maximum number allowed of IPC configuration blob size */
26 #define SOF_MULTIBAND_DRC_MAX_BLOB_SIZE 1024
27 
28  /* multiband_drc configuration
29   *     Multiband DRC is a single-source-single-sink compound component which
30   *     consists of 4 stages: Emphasis Equalizer, Crossover Filter (from 1-band
31   *     to 4-band), DRC (per band), and Deemphasis Equalizer of summed stream.
32   *
33   *     The following graph illustrates a 3-band Multiband DRC component:
34   *
35   *                                      low
36   *                                     o----> DRC0 ----o
37   *                                     |               |
38   *                           3-WAY     |mid            |
39   *     x(n) --> EQ EMP --> CROSSOVER --o----> DRC1 ---(+)--> EQ DEEMP --> y(n)
40   *                                     |               |
41   *                                     |high           |
42   *                                     o----> DRC2 ----o
43   *
44   *     uint32_t num_bands <= 4
45   *         Determines the number of frequency bands, the choice of n-way
46   *         Crossover, and the number of DRC components.
47   *     uint32_t enable_emp_deemp
48   *         1=enable Emphasis and Deemphasis Equalizer; 0=disable (passthrough)
49   *     struct sof_eq_iir_biquad emp_coef[2]
50   *         The coefficient data for Emphasis Equalizer, which is a cascade of 2
51   *         biquad filters.
52   *     struct sof_eq_iir_biquad deemp_coef[2]
53   *         The coefficient data for Deemphasis Equalizer, which is a cascade of
54   *         2 biquad filters.
55   *     struct sof_eq_iir_biquad crossover_coef[6]
56   *         The coefficient data for Crossover LR4 filters. Please refer
57   *         src/include/user/crossover.h for details. Zeros will be filled if
58   *         the entries are useless. For example, when 2-way crossover is used:
59   *     struct sof_drc_params drc_coef[num_bands]
60   *         The parameter data for DRC per band, the number entries of this may
61   *         vary. Please refer src/include/user/drc.h for details.
62   *
63   */
64 struct sof_multiband_drc_config {
65 	uint32_t size;
66 	uint32_t num_bands;
67 	uint32_t enable_emp_deemp;
68 
69 	/* reserved */
70 	uint32_t reserved[8];
71 
72 	/* config of emphasis eq-iir */
73 	struct sof_eq_iir_biquad emp_coef[SOF_EMP_DEEMP_BIQUADS];
74 
75 	/* config of deemphasis eq-iir */
76 	struct sof_eq_iir_biquad deemp_coef[SOF_EMP_DEEMP_BIQUADS];
77 
78 	/* config of crossover */
79 	struct sof_eq_iir_biquad crossover_coef[SOF_CROSSOVER_MAX_LR4];
80 
81 	/* config of multi-band drc */
82 	struct sof_drc_params drc_coef[];
83 };
84 
85 #endif // __USER_MULTIBAND_DRC_H__
86