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