1135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
2135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Copyright (C) 2008 The Android Open Source Project
3135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
4135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * you may not use this file except in compliance with the License.
6135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * You may obtain a copy of the License at
7135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
8135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
10135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Unless required by applicable law or agreed to in writing, software
11135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * See the License for the specific language governing permissions and
14135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * limitations under the License.
15135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */
16135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
17135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#ifndef ANDROID_EFFECTSMATH_H_
18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define ANDROID_EFFECTSMATH_H_
19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
20135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <stdint.h>
21135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#if __cplusplus
23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" {
24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif
25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/** coefs for pan, generates sin, cos */
27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define COEFF_PAN_G2    -27146    /* -0.82842712474619 = 2 - 4/sqrt(2) */
28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define COEFF_PAN_G0    23170     /* 0.707106781186547 = 1/sqrt(2) */
29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentcoefficients for approximating
32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent2^x = gn2toX0 + gn2toX1*x + gn2toX2*x^2 + gn2toX3*x^3
33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentwhere x is a int.frac number representing number of octaves.
34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentActually, we approximate only the 2^(frac) using the power series
35135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentand implement the 2^(int) as a shift, so that
36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent2^x == 2^(int.frac) == 2^(int) * 2^(fract)
37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    == (gn2toX0 + gn2toX1*x + gn2toX2*x^2 + gn2toX3*x^3) << (int)
38135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
39135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentThe gn2toX.. were generated using a best fit for a 3rd
40135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentorder polynomial, instead of taking the coefficients from
41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenta truncated Taylor (or Maclaurin?) series.
42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GN2_TO_X0    32768    /*    1                    */
45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GN2_TO_X1    22833    /*    0.696807861328125    */
46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GN2_TO_X2    7344    /*    0.22412109375        */
47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GN2_TO_X3    2588    /*    0.0789794921875        */
48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Fixed Point Math
51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * These macros are used for fixed point multiplies. If the processor
53135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * supports fixed point multiplies, replace these macros with inline
54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * assembly code to improve performance.
55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* Fixed point multiply 0.15 x 0.15 = 0.15 returned as 32-bits */
59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define FMUL_15x15(a,b) \
60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /*lint -e(704) <avoid multiply for performance>*/ \
61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (((int32_t)(a) * (int32_t)(b)) >> 15)
62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* Fixed point multiply 0.7 x 0.7 = 0.15 returned as 32-bits */
64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define FMUL_7x7(a,b) \
65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /*lint -e(704) <avoid multiply for performance>*/ \
66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (((int32_t)(a) * (int32_t)(b) ) << 1)
67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* Fixed point multiply 0.8 x 0.8 = 0.15 returned as 32-bits */
69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define FMUL_8x8(a,b) \
70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /*lint -e(704) <avoid multiply for performance>*/ \
71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (((int32_t)(a) * (int32_t)(b) ) >> 1)
72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* Fixed point multiply 0.8 x 1.15 = 0.15 returned as 32-bits */
74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define FMUL_8x15(a,b) \
75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /*lint -e(704) <avoid divide for performance>*/ \
76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (((int32_t)((a) << 7) * (int32_t)(b)) >> 15)
77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* macros for fractional phase accumulator */
79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentNote: changed the _U32 to _I32 on 03/14/02. This should not
81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentaffect the phase calculations, and should allow us to reuse these
82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentmacros for other audio sample related math.
83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define HARDWARE_BIT_WIDTH        32
85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_PHASE_INT_BITS        1
87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_PHASE_FRAC_BITS       15
88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define PHASE_FRAC_MASK           (uint32_t) ((0x1L << NUM_PHASE_FRAC_BITS) -1)
90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GET_PHASE_INT_PART(x)     (uint32_t)((uint32_t)(x) >> NUM_PHASE_FRAC_BITS)
92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GET_PHASE_FRAC_PART(x)    (uint32_t)((uint32_t)(x) & PHASE_FRAC_MASK)
93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DEFAULT_PHASE_FRAC        0
95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DEFAULT_PHASE_INT         0
96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentLinear interpolation calculates:
99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentoutput = (1-frac) * sample[n] + (frac) * sample[n+1]
100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentwhere conceptually    0 <= frac < 1
102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentFor a fixed point implementation, frac is actually an integer value
104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentwith an implied binary point one position to the left. The value of
105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentone (unity) is given by PHASE_ONE
106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentone half and one quarter are useful for 4-point linear interp.
107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define PHASE_ONE                (int32_t) (0x1L << NUM_PHASE_FRAC_BITS)
109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Multiply the signed audio sample by the unsigned fraction.
112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent-  a is the signed audio sample
113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent-  b is the unsigned fraction (cast to signed int as long as coef
114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uses (n-1) or less bits, where n == hardware bit width)
115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_AUDIO_COEF(audio,coef)         /*lint -e704 <avoid divide for performance>*/ \
117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)(                                    \
118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                            \
119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(audio)) * ((int32_t)(coef))    \
120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                            \
121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> NUM_PHASE_FRAC_BITS                        \
122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        )                \
123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        /* lint +704 <restore checking>*/
124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* wet / dry calculation macros */
126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_WET_DRY_FRAC_BITS       7    // 15
127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_WET_DRY_INT_BITS        9    // 1
128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* define a 1.0 */
130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define WET_DRY_ONE                 (int32_t) ((0x1L << NUM_WET_DRY_FRAC_BITS))
131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define WET_DRY_MINUS_ONE           (int32_t) (~WET_DRY_ONE)
132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define WET_DRY_FULL_SCALE          (int32_t) (WET_DRY_ONE - 1)
133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_AUDIO_WET_DRY_COEF(audio,coef) /*lint -e(702) <avoid divide for performance>*/ \
135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)(                                        \
136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                                \
137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(audio)) * ((int32_t)(coef))        \
138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                                \
139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> NUM_WET_DRY_FRAC_BITS                        \
140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                                     )
141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* Envelope 1 (EG1) calculation macros */
143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define    NUM_EG1_INT_BITS          1
144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_EG1_FRAC_BITS            15
145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* the max positive gain used in the synth for EG1 */
147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* SYNTH_FULL_SCALE_EG1_GAIN must match the value in the dls2eas
148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconverter, otherwise, the values we read from the .eas file are bogus. */
149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define SYNTH_FULL_SCALE_EG1_GAIN    (int32_t) ((0x1L << NUM_EG1_FRAC_BITS) -1)
150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* define a 1.0 */
152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define EG1_ONE                      (int32_t) ((0x1L << NUM_EG1_FRAC_BITS))
153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define EG1_MINUS_ONE                (int32_t) (~SYNTH_FULL_SCALE_EG1_GAIN)
154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define EG1_HALF                     (int32_t) (EG1_ONE/2)
156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define EG1_MINUS_HALF               (int32_t) (EG1_MINUS_ONE/2)
157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentWe implement the EG1 using a linear gain value, which means that the
160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentattack segment is handled by incrementing (adding) the linear gain.
161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentHowever, EG1 treats the Decay, Sustain, and Release differently than
162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe Attack portion. For Decay, Sustain, and Release, the gain is
163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentlinear on dB scale, which is equivalent to exponential damping on
164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenta linear scale. Because we use a linear gain for EG1, we implement
165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe Decay and Release as multiplication (instead of incrementing
166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentas we did for the attack segment).
167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentTherefore, we need the following macro to implement the multiplication
168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent(i.e., exponential damping) during the Decay and Release segments of
169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe EG1
170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_EG1_EG1(gain,damping)        /*lint -e(704) <avoid divide for performance>*/ \
172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)(                                        \
173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                                \
174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(gain)) * ((int32_t)(damping))    \
175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                                \
176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> NUM_EG1_FRAC_BITS                            \
177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        )
178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Use the following macro specifically for the filter, when multiplying
180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// the b1 coefficient. The 0 <= |b1| < 2, which therefore might overflow
181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// in certain conditions because we store b1 as a 1.15 value.
182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Instead, we could store b1 as b1p (b1' == b1 "prime") where
183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// b1p == b1/2, thus ensuring no potential overflow for b1p because
184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 0 <= |b1p| < 1
185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// However, during the filter calculation, we must account for the fact
186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// that we are using b1p instead of b1, and thereby multiply by
187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// an extra factor of 2. Rather than multiply by an extra factor of 2,
188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// we can instead shift the result right by one less, hence the
189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// modified shift right value of (NUM_EG1_FRAC_BITS -1)
190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_EG1_EG1_X2(gain,damping)         /*lint -e(702) <avoid divide for performance>*/ \
191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)(                                        \
192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                                \
193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(gain)) * ((int32_t)(damping))    \
194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                                \
195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> (NUM_EG1_FRAC_BITS -1)                        \
196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        )
197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define SATURATE_EG1(x)        /*lint -e{734} saturation operation */                \
199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    ((int32_t)(x) > SYNTH_FULL_SCALE_EG1_GAIN)    ? (SYNTH_FULL_SCALE_EG1_GAIN) :    \
200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    ((int32_t)(x) < EG1_MINUS_ONE)                ? (EG1_MINUS_ONE) :    (x);
201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* use "digital cents" == "dents" instead of cents */
204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* we coudl re-use the phase frac macros, but if we do,
205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentwe must change the phase macros to cast to _I32 instead of _U32,
206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentbecause using a _U32 cast causes problems when shifting the exponent
207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentfor the 2^x calculation, because right shift a negative values MUST
208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentbe sign extended, or else the 2^x calculation is wrong */
209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* use "digital cents" == "dents" instead of cents */
211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_DENTS_FRAC_BITS        12
212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_DENTS_INT_BITS         (HARDWARE_BIT_WIDTH - NUM_DENTS_FRAC_BITS)
213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DENTS_FRAC_MASK            (int32_t) ((0x1L << NUM_DENTS_FRAC_BITS) -1)
215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GET_DENTS_INT_PART(x)        /*lint -e(704) <avoid divide for performance>*/    \
217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                            (int32_t)((int32_t)(x) >> NUM_DENTS_FRAC_BITS)
218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GET_DENTS_FRAC_PART(x)     (int32_t)((int32_t)(x) & DENTS_FRAC_MASK)
220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DENTS_ONE                  (int32_t) (0x1L << NUM_DENTS_FRAC_BITS)
222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* use CENTS_TO_DENTS to convert a value in cents to dents */
224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CENTS_TO_DENTS (int32_t) (DENTS_ONE * (0x1L << NUM_EG1_FRAC_BITS) / 1200L)                            \
225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentFor gain, the LFO generates a value that modulates in terms
229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentof dB. However, we use a linear gain value, so we must convert
230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe LFO value in dB to a linear gain. Normally, we would use
231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentlinear gain = 10^x, where x = LFO value in dB / 20.
232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentInstead, we implement 10^x using our 2^x approximation.
233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentbecause
234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent  10^x = 2^(log2(10^x)) = 2^(x * log2(10))
236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentso we need to multiply by log2(10) which is just a constant.
238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentAh, but just wait -- our 2^x actually doesn't exactly implement
239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent2^x, but it actually assumes that the input is in cents, and within
240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe 2^x approximation converts its input from cents to octaves
241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentby dividing its input by 1200.
242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentSo, in order to convert the LFO gain value in dB to something
244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthat our existing 2^x approximation can use, multiply the LFO gain
245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentby log2(10) * 1200 / 20
246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentThe divide by 20 helps convert dB to linear gain, and we might
248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentas well incorporate that operation into this conversion.
249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentOf course, we need to keep some fractional bits, so multiply
250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe constant by NUM_EG1_FRAC_BITS
251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* use LFO_GAIN_TO_CENTS to convert the LFO gain value to cents */
254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#if 0
255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define    DOUBLE_LOG2_10    (double) (3.32192809488736)    /* log2(10) */
256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define    DOUBLE_LFO_GAIN_TO_CENTS    (double)                \
258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (                                                        \
259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                (DOUBLE_LOG2_10) *                            \
260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                1200.0    /                                    \
261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                20.0                                        \
262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    )
263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define    LFO_GAIN_TO_CENTS    (int32_t)                        \
265135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (                                                        \
266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                DOUBLE_LFO_GAIN_TO_CENTS *                    \
267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                (0x1L << NUM_EG1_FRAC_BITS)                    \
268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    )
269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif
270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define LFO_GAIN_TO_CENTS (int32_t) (1671981156L >> (23 - NUM_EG1_FRAC_BITS))
272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
274135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_DENTS_COEF(dents,coef)     /*lint -e704 <avoid divide for performance>*/    \
275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)(                                    \
276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                            \
277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(dents)) * ((int32_t)(coef))    \
278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                            \
279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> NUM_DENTS_FRAC_BITS                        \
280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        )                \
281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                        /* lint +e704 <restore checking>*/
282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* we use 16-bits in the PC per audio sample */
285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define BITS_PER_AUDIO_SAMPLE    16
286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* we define 1 as 1.0 - 1 LSbit */
288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DISTORTION_ONE           (int32_t)((0x1L << (BITS_PER_AUDIO_SAMPLE-1)) -1)
289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DISTORTION_MINUS_ONE     (int32_t)(~DISTORTION_ONE)
290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* drive coef is given as int.frac */
292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_DRIVE_COEF_INT_BITS  1
293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_DRIVE_COEF_FRAC_BITS 4
294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_AUDIO_DRIVE(audio,drive)         /*lint -e(702) <avoid divide for performance>*/ \
296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)    (                                \
297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                            \
298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(audio)) * ((int32_t)(drive))    \
299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                            \
300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> NUM_DRIVE_COEF_FRAC_BITS                    \
301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                                )
302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MULT_AUDIO_AUDIO(audio1,audio2)         /*lint -e(702) <avoid divide for performance>*/ \
304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (int32_t)    (                                    \
305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                                \
306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(audio1)) * ((int32_t)(audio2))    \
307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                                \
308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            >> (BITS_PER_AUDIO_SAMPLE-1)                    \
309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                                    )
310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define SATURATE(x)                                                            \
312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    ((((int32_t)(x)) > DISTORTION_ONE)        ? (DISTORTION_ONE) :            \
313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    (((int32_t)(x)) < DISTORTION_MINUS_ONE)    ? (DISTORTION_MINUS_ONE) :    ((int32_t)(x)));
314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
317135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effects_log2()
318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Fixed-point log2 function.
321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Input is interpreted as an integer (should not be 0).
324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Output is in 15-bit precision.
327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint32_t Effects_log2(uint32_t x);
333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effects_exp2()
336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Fixed-point radix-2 exponent.
339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Input is in 15-bit precision. Must be non-negative and less than 32.
342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Output is an integer.
345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentuint32_t Effects_exp2(int32_t x);
351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effects_MillibelsToLinear16()
354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Transform gain in millibels to linear gain multiplier:
357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * mB = 2000*log(lin/32767)
359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *    => lin = 2^((mB+2000*log(32767))/2000*log(2))
360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *    => lin = Effects_exp2(((mB + K1) << 15) / K2)
361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * with:
362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *    K1 = 2000*log(32767) and K2 = 2000*log(2)
363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nGain - log scale value in millibels.
366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Returns a 16-bit linear value approximately equal to 2^(nGain/1024)
369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MB_TO_LIN_K1 9031
375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MB_TO_LIN_K2 602
376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint16_t Effects_MillibelsToLinear16 (int32_t nGain);
377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effects_Linear16ToMillibels()
380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Transform linear gain multiplier to millibels
383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *  mB = 2000*log(lin/32767)
384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *     = 2000*log(2)*log2(lin)-2000*log(32767)
385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *    => mB = K1*Effects_log2(lin) + K2
386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * with:
387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *    K1 = 2000*log(2) and K2 = -2000*log(32767)
388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nGain - linear multiplier ranging form 0 to 32767 (corresponding to [0 1] gain range).
391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Returns a 16-bit log value expressed in milllibels.
394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint16_t Effects_Linear16ToMillibels (int32_t nGain);
400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effects_Sqrt()
403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Returns the square root of the argument given.
406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * in - positive number in the range 0 - 2^28
409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
410135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Returned value: square root of in.
412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint32_t Effects_Sqrt(int32_t in);
418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#if __cplusplus
420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}  // extern "C"
421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif
422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif /*ANDROID_EFFECTSMATH_H_*/
424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
425