/* 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_KERNEL_H_
#define DRC_KERNEL_H_
#ifdef __cplusplus
extern "C" {
#endif
#define DRC_NUM_CHANNELS 2
struct drc_kernel {
float sample_rate;
/* The detector_average is the target gain obtained by looking at the
* future samples in the lookahead buffer and applying the compression
* curve on them. compressor_gain is the gain applied to the current
* samples. compressor_gain moves towards detector_average with the
* speed envelope_rate which is calculated once for each division (32
* frames). */
float detector_average;
float compressor_gain;
int enabled;
int processed;
/* Lookahead section. */
unsigned last_pre_delay_frames;
float *pre_delay_buffers[DRC_NUM_CHANNELS];
int pre_delay_read_index;
int pre_delay_write_index;
float max_attack_compression_diff_db;
/* Amount of input change in dB required for 1 dB of output change.
* This applies to the portion of the curve above knee_threshold
* (see below).
*/
float ratio;
float slope; /* Inverse ratio. */
/* The input to output change below the threshold is 1:1. */
float linear_threshold;
float db_threshold;
/* db_knee is the number of dB above the threshold before we enter the
* "ratio" portion of the curve. The portion between db_threshold and
* (db_threshold + db_knee) is the "soft knee" portion of the curve
* which transitions smoothly from the linear portion to the ratio
* portion. knee_threshold is db_to_linear(db_threshold + db_knee).
*/
float db_knee;
float knee_threshold;
float ratio_base;
/* Internal parameter for the knee portion of the curve. */
float K;
/* The release frames coefficients */
float kA, kB, kC, kD, kE;
/* Calculated parameters */
float master_linear_gain;
float attack_frames;
float sat_release_frames_inv_neg;
float sat_release_rate_at_neg_two_db;
float knee_alpha, knee_beta;
/* envelope for the current division */
float envelope_rate;
float scaled_desired_gain;
};
/* Initializes a drc kernel */
void dk_init(struct drc_kernel *dk, float sample_rate);
/* Frees a drc kernel */
void dk_free(struct drc_kernel *dk);
/* Sets the parameters of a drc kernel. See drc.h for details */
void dk_set_parameters(struct drc_kernel *dk,
float db_threshold,
float db_knee,
float ratio,
float attack_time,
float release_time,
float pre_delay_time,
float db_post_gain,
float releaseZone1,
float releaseZone2,
float releaseZone3,
float releaseZone4
);
/* Enables or disables a drc kernel */
void dk_set_enabled(struct drc_kernel *dk, int enabled);
/* Performs stereo-linked compression.
* Args:
* dk - The DRC kernel.
* data - The pointers to the audio sample buffer. One pointer per channel.
* count - The number of audio samples per channel.
*/
void dk_process(struct drc_kernel *dk, float *data_channels[], unsigned count);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* DRC_KERNEL_H_ */