/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* Copyright (C) 2011 Google Inc. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE.WEBKIT file.
*/
#ifndef DRC_H_
#define DRC_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "crossover2.h"
#include "drc_kernel.h"
#include "eq2.h"
/* DRC implements a flexible audio dynamics compression effect such as is
* commonly used in musical production and game audio. It lowers the volume of
* the loudest parts of the signal and raises the volume of the softest parts,
* making the sound richer, fuller, and more controlled.
*
* This is a three band stereo DRC. There are three compressor kernels, and each
* can have its own parameters. If a kernel is disabled, it only delays the
* signal and does not compress it.
*
* INPUT
* |
* +----------+
* | emphasis |
* +----------+
* |
* +------------+
* | crossover |
* +------------+
* / | \
* (low band) (mid band) (high band)
* / | \
* +------+ +------+ +------+
* | drc | | drc | | drc |
* |kernel| |kernel| |kernel|
* +------+ +------+ +------+
* \ | /
* \ | /
* +-------------+
* | (+) |
* +-------------+
* |
* +------------+
* | deemphasis |
* +------------+
* |
* OUTPUT
*
*/
/* The parameters of the DRC compressor.
*
* PARAM_THRESHOLD - The value above which the compression starts, in dB.
* PARAM_KNEE - The value above which the knee region starts, in dB.
* PARAM_RATIO - The input/output dB ratio after the knee region.
* PARAM_ATTACK - The time to reduce the gain by 10dB, in seconds.
* PARAM_RELEASE - The time to increase the gain by 10dB, in seconds.
* PARAM_PRE_DELAY - The lookahead time for the compressor, in seconds.
* PARAM_RELEASE_ZONE[1-4] - The adaptive release curve parameters.
* PARAM_POST_GAIN - The static boost value in output, in dB.
* PARAM_FILTER_STAGE_GAIN - The gain of each emphasis filter stage.
* PARAM_FILTER_STAGE_RATIO - The frequency ratio for each emphasis filter stage
* to the previous stage.
* PARAM_FILTER_ANCHOR - The frequency of the first emphasis filter, in
* normalized frequency (in [0, 1], relative to half of the sample rate).
* PARAM_CROSSOVER_LOWER_FREQ - The lower frequency of the band, in normalized
* frequency (in [0, 1], relative to half of the sample rate).
* PARAM_ENABLED - 1 to enable the compressor, 0 to disable it.
*/
enum {
PARAM_THRESHOLD,
PARAM_KNEE,
PARAM_RATIO,
PARAM_ATTACK,
PARAM_RELEASE,
PARAM_PRE_DELAY,
PARAM_RELEASE_ZONE1,
PARAM_RELEASE_ZONE2,
PARAM_RELEASE_ZONE3,
PARAM_RELEASE_ZONE4,
PARAM_POST_GAIN,
PARAM_FILTER_STAGE_GAIN,
PARAM_FILTER_STAGE_RATIO,
PARAM_FILTER_ANCHOR,
PARAM_CROSSOVER_LOWER_FREQ,
PARAM_ENABLED,
PARAM_LAST
};
/* The number of compressor kernels (also the number of bands). */
#define DRC_NUM_KERNELS 3
/* The maximum number of frames can be passed to drc_process() call. */
#define DRC_PROCESS_MAX_FRAMES 2048
/* The default value of PARAM_PRE_DELAY in seconds. */
#define DRC_DEFAULT_PRE_DELAY 0.006f
struct drc {
/* sample rate in Hz */
float sample_rate;
/* 1 to disable the emphasis and deemphasis, 0 to enable it. */
int emphasis_disabled;
/* parameters holds the tweakable compressor parameters. */
float parameters[DRC_NUM_KERNELS][PARAM_LAST];
/* The emphasis filter and deemphasis filter */
struct eq2 *emphasis_eq;
struct eq2 *deemphasis_eq;
/* The crossover filter */
struct crossover2 xo2;
/* The compressor kernels */
struct drc_kernel kernel[DRC_NUM_KERNELS];
/* Temporary buffer used during drc_process(). The mid and high band
* signal is stored in these buffers (the low band is stored in the
* original input buffer). */
float *data1[DRC_NUM_CHANNELS];
float *data2[DRC_NUM_CHANNELS];
};
/* DRC needs the parameters to be set before initialization. So drc_new() should
* be called first to allocated an instance, then drc_set_param() is called
* (multiple times) to set the parameters. Finally drc_init() is called to do
* the initialization. After that drc_process() can be used to process data. The
* sequence is:
*
* drc_new();
* drc_set_param();
* ...
* drc_set_param();
* drc_init();
* drc_process();
* ...
* drc_process();
* drc_free();
*/
/* Allocates a DRC. */
struct drc *drc_new(float sample_rate);
/* Initializes a DRC. */
void drc_init(struct drc *drc);
/* Frees a DRC.*/
void drc_free(struct drc *drc);
/* Processes input data using a DRC.
* Args:
* drc - The DRC we want to use.
* float **data - Pointers to input/output data. The input must be stereo
* and one channel is pointed by data[0], another pointed by data[1]. The
* output data is stored in the same place.
* frames - The number of frames to process.
*/
void drc_process(struct drc *drc, float **data, int frames);
/* Sets a parameter for the DRC.
* Args:
* drc - The DRC we want to use.
* index - The index of the kernel we want to set its parameter.
* paramID - One of the PARAM_* enum constant.
* value - The parameter value
*/
void drc_set_param(struct drc *drc, int index, unsigned paramID, float value);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* DRC_H_ */