| /* 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_ */ |