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_EFFECTREVERB_H_
18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define ANDROID_EFFECTREVERB_H_
19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
206d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_environmentalreverb.h>
216d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_presetreverb.h>
22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*------------------------------------
25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * defines
26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *------------------------------------
27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentCIRCULAR() calculates the array index using modulo arithmetic.
31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric LaurentThe "trick" is that modulo arithmetic is simplified by masking
32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentthe effective address where the mask is (2^n)-1. This only works
33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentif the buffer size is a power of two.
34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
35135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CIRCULAR(base,offset,size) (uint32_t)(               \
36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            (                                               \
37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                ((int32_t)(base)) + ((int32_t)(offset))     \
38135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            )                                               \
39135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent            & size                                          \
40135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                            )
41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define NUM_OUTPUT_CHANNELS 2
43e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent#define OUTPUT_CHANNELS AUDIO_CHANNEL_OUT_STEREO
44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_BUFFER_SIZE_IN_SAMPLES_MAX   16384
46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
47cb28102ad3976339ec445afbcb4130f2991b38d7Eric Laurent#define REVERB_NUM_PRESETS  REVERB_PRESET_PLATE   // REVERB_PRESET_NONE is not included
48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_MAX_NUM_REFLECTIONS      5   // max num reflections per channel
49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// xfade parameters
52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_XFADE_PERIOD_IN_SECONDS      (double) (100.0 / 1000.0)        // xfade once every this many seconds
53135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/**********/
56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* the entire synth uses various flags in a bit field */
57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* if flag is set, synth reset has been requested */
59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_FLAG_RESET_IS_REQUESTED          0x01    /* bit 0 */
60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MASK_REVERB_RESET_IS_REQUESTED          0x01
61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MASK_REVERB_RESET_IS_NOT_REQUESTED      (uint32_t)(~MASK_REVERB_RESET_IS_REQUESTED)
62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentby default, we always want to update ALL channel parameters
65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentwhen we reset the synth (e.g., during GM ON)
66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DEFAULT_REVERB_FLAGS                    0x0
68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* coefficients for generating sin, cos */
70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_PAN_G2   4294940151          /* -0.82842712474619 = 2 - 4/sqrt(2) */
71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*
72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint32_t nPanG1 = +1.0 for sin
73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint32_t nPanG1 = -1.0 for cos
74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_PAN_G0   23170               /* 0.707106781186547 = 1/sqrt(2) */
76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*************************************************************/
78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// define the input injection points
79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define GUARD               5                       // safety guard of this many samples
80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MAX_AP_TIME         (int) ((20*65536)/1000)  // delay time in time units (65536th of sec)
82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MAX_DELAY_TIME      (int) ((65*65536)/1000)  // delay time in time units
83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define MAX_EARLY_TIME      (int) ((65*65536)/1000)  // delay time in time units
84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP0_IN              0
86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_DEFAULT_ROOM_NUMBER      1       // default preset number
89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DEFAULT_AP0_GAIN                19400
90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define DEFAULT_AP1_GAIN                -19400
91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_DEFAULT_WET              32767
93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_DEFAULT_DRY              0
94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_WET_MAX              32767
96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_WET_MIN              0
97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_DRY_MAX              32767
98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define REVERB_DRY_MIN              0
99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// constants for reverb density
101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// The density expressed in permilles changes the Allpass delay in a linear manner in the range defined by
102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AP0_TIME_BASE to AP0_TIME_BASE + AP0_TIME_RANGE
103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP0_TIME_BASE (int)((9*65536)/1000)
104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP0_TIME_RANGE (int)((4*65536)/1000)
105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP1_TIME_BASE (int)((12*65536)/1000)
106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP1_TIME_RANGE (int)((8*65536)/1000)
107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// constants for reverb diffusion
109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// The diffusion expressed in permilles changes the Allpass gain in a linear manner in the range defined by
110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AP0_GAIN_BASE to AP0_GAIN_BASE + AP0_GAIN_RANGE
111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP0_GAIN_BASE (int)(9830)
112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP0_GAIN_RANGE (int)(19660-9830)
113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP1_GAIN_BASE (int)(6553)
114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define AP1_GAIN_RANGE (int)(22936-6553)
115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
117e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurentenum reverb_state_e {
118e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent    REVERB_STATE_UNINITIALIZED,
119e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent    REVERB_STATE_INITIALIZED,
120e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent    REVERB_STATE_ACTIVE,
121e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent};
122e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent
123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* parameters for each allpass */
124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct
125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{
126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zApOut;       // delay offset for ap out
127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nApGain;      // gain for ap
129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zApIn;        // delay offset for ap in
131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} allpass_object_t;
133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* parameters for early reflections */
136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct
137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{
138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_zDelay[REVERB_MAX_NUM_REFLECTIONS];   // delay offset for ap out
139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nGain[REVERB_MAX_NUM_REFLECTIONS];    // gain for ap
141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} early_reflection_object_t;
143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//demo
145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct
146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{
147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRvbLpfFbk;
148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRvbLpfFwd;
149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRoomLpfFbk;
150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRoomLpfFwd;
151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarlyGain;
153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarlyDelay;
154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nLateGain;
155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nLateDelay;
156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    early_reflection_object_t m_sEarlyL;
158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    early_reflection_object_t m_sEarlyR;
159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_nMaxExcursion; //28
161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nXfadeInterval;
162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nAp0_ApGain; //30
164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nAp0_ApOut;
165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nAp1_ApGain;
166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nAp1_ApOut;
167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nDiffusion;
168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu4;
170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu5;
171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu6;
172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu7;
173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu8;
174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu9;
175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_rfu10; //43
176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} reverb_preset_t;
178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct
180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{
181cb28102ad3976339ec445afbcb4130f2991b38d7Eric Laurent    reverb_preset_t     m_sPreset[REVERB_NUM_PRESETS]; // array of presets(does not include REVERB_PRESET_NONE)
182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} reverb_preset_bank_t;
184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* parameters for each reverb */
187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct
188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{
189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /* update counter keeps track of when synth params need updating */
190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    /* only needs to be as large as REVERB_UPDATE_PERIOD_IN_SAMPLES */
191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nUpdateCounter;
192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_nBaseIndex;                                   // base index for circular buffer
194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // reverb delay line offsets, allpass parameters, etc:
196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    short             m_nRevFbkR;              // combine feedback reverb right out with dry left in
198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    short             m_zOutLpfL;              // left reverb output
199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    allpass_object_t    m_sAp0;                     // allpass 0 (left channel)
201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD0In;                    // delay offset for delay line D0 in
203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    short             m_nRevFbkL;              // combine feedback reverb left out with dry right in
205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    short             m_zOutLpfR;              // right reverb output
206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    allpass_object_t    m_sAp1;                     // allpass 1 (right channel)
208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD1In;                    // delay offset for delay line D1 in
210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    // delay output taps, notice criss cross order
212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD0Self;                  // self feeds forward d0 --> d0
213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD1Cross;                 // cross feeds across d1 --> d0
215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD1Self;                  // self feeds forward d1 --> d1
217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t             m_zD0Cross;                 // cross feeds across d0 --> d1
219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nSin;                     // gain for self taps
221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nCos;                     // gain for cross taps
223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nSinIncrement;            // increment for gain
225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nCosIncrement;            // increment for gain
227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRvbLpfFwd;                  // reverb feedback lpf forward gain (includes scaling for mixer)
229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRvbLpfFbk;                  // reverb feedback lpf feedback gain
231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRoomLpfFwd;                  // room lpf forward gain (includes scaling for mixer)
233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nRoomLpfFbk;                  // room lpf feedback gain
235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_nXfadeInterval;           // update/xfade after this many samples
237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_nXfadeCounter;            // keep track of when to xfade
239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nPhase;                   // -1 <= m_nPhase < 1
241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                                    // but during sin,cos calculations
242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent                                                    // use m_nPhase/2
243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nPhaseIncrement;          // add this to m_nPhase each frame
245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nNoise;                   // random noise sample
247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_nMaxExcursion;            // the taps can excurse +/- this amount
249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_bUseNoise;                // if TRUE, use noise as input signal
251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_bBypass;                  // if TRUE, then bypass reverb and copy input to output
253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nCurrentRoom;             // preset number for current room
255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nNextRoom;                // preset number for next room
257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarlyGain;               // gain for early (widen) signal
259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarlyDelay;              // initial dealy for early (widen) signal
260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarly0in;
261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nEarly1in;
262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nLateGain;               // gain for late reverb
263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nLateDelay;
264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
265135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nDiffusion;
266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    early_reflection_object_t   m_sEarlyL;          // left channel early reflections
268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    early_reflection_object_t   m_sEarlyR;          // right channel early reflections
269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    short             m_nDelayLine[REVERB_BUFFER_SIZE_IN_SAMPLES_MAX];    // one large delay line for all reverb elements
271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    reverb_preset_t     pPreset;
273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
274135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    reverb_preset_bank_t  m_sPreset;
275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    //int8_t            preset;
277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint32_t            m_nSamplingRate;
278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t             m_nUpdatePeriodInBits;
279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t             m_nBufferMask;
280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t             m_nUpdatePeriodInSamples;
281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t             m_nDelay0Out;
282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int32_t             m_nDelay1Out;
283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    int16_t             m_nCosWT_5KHz;
284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_Aux;                // if TRUE, is connected as auxiliary effect
286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    uint16_t            m_Preset;             // if TRUE, expose preset revert interface
287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
288e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent    uint32_t            mState;
289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} reverb_object_t;
290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef struct reverb_module_s {
294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    const struct effect_interface_s *itfe;
295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    effect_config_t config;
296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent    reverb_object_t context;
297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} reverb_module_t;
298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*------------------------------------
300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effect API
301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *------------------------------------
302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
3035e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint EffectCreate(const effect_uuid_t *effectUID,
30425f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                 int32_t sessionId,
30525f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                 int32_t ioId,
306e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent                 effect_handle_t *pHandle);
307e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint EffectRelease(effect_handle_t handle);
3085e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint EffectGetDescriptor(const effect_uuid_t *uuid,
309e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent                        effect_descriptor_t *pDescriptor);
310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
311e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int Reverb_Process(effect_handle_t self,
31225f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          audio_buffer_t *inBuffer,
31325f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          audio_buffer_t *outBuffer);
314e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int Reverb_Command(effect_handle_t self,
31525f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          uint32_t cmdCode,
31625f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          uint32_t cmdSize,
31725f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          void *pCmdData,
31825f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          uint32_t *replySize,
31925f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent                          void *pReplyData);
320e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int Reverb_GetDescriptor(effect_handle_t   self,
321e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent                                effect_descriptor_t *pDescriptor);
322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*------------------------------------
324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * internal functions
325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *------------------------------------
326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Reverb_Init(reverb_module_t *pRvbModule, int aux, int preset);
3293d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentint Reverb_setConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig, bool init);
3303d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Reverb_getConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig);
331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentvoid Reverb_Reset(reverb_object_t *pReverb, bool init);
332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
333b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Reverb_setParameter (reverb_object_t *pReverb, int32_t param, uint32_t size, void *pValue);
334b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Reverb_getParameter(reverb_object_t *pReverb, int32_t param, uint32_t *pSize, void *pValue);
335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbUpdateXfade
338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Update the xfade parameters as required
341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nNumSamplesToAdd - number of samples to write to buffer
344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - xfade parameters will be changed
350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbUpdateXfade(reverb_object_t* pReverbData, int nNumSamplesToAdd);
354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbCalculateNoise
357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Calculate a noise sample and limit its value
360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Pointer to reverb context
363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * new limited noise value
366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - pReverbData->m_nNoise value is updated
369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic uint16_t ReverbCalculateNoise(reverb_object_t *pReverbData);
373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbCalculateSinCos
376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Calculate a new sin and cosine value based on the given phase
379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nPhase   - phase angle
382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnSin    - input old value, output new value
383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnCos    - input old value, output new value
384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - *pnSin, *pnCos are updated
389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbCalculateSinCos(int16_t nPhase, int16_t *pnSin, int16_t *pnCos);
393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb
396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * apply reverb to the given signal
399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nNu
402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnSin    - input old value, output new value
403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnCos    - input old value, output new value
404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * number of samples actually reverberated
407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
410135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int Reverb(reverb_object_t* pReverbData, int nNumSamplesToAdd, short *pOutputBuffer, short *pInputBuffer);
413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbReadInPresets()
416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: sets global reverb preset bank to defaults
418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
425135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbReadInPresets(reverb_object_t* pReverbData);
426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*----------------------------------------------------------------------------
429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbUpdateRoom
430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose:
432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Update the room's preset parameters as required
433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs:
435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
436135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs:
437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *
439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects:
440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - reverb paramters (fbk, fwd, etc) will be changed
441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - m_nCurrentRoom := m_nNextRoom
442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *----------------------------------------------------------------------------
443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent*/
444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbUpdateRoom(reverb_object_t* pReverbData, bool fullUpdate);
445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
446135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbComputeConstants(reverb_object_t *pReverbData, uint32_t samplingRate);
448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent
449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#endif /*ANDROID_EFFECTREVERB_H_*/
450