1a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent/* 2a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * Copyright (C) 2011 The Android Open Source Project 3a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * 4a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * you may not use this file except in compliance with the License. 6a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * You may obtain a copy of the License at 7a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * 8a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * 10a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * Unless required by applicable law or agreed to in writing, software 11a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * See the License for the specific language governing permissions and 14a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent * limitations under the License. 15a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent */ 16a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 17a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <stdlib.h> 18a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <string.h> 19a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define LOG_TAG "PreProcessing" 20a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//#define LOG_NDEBUG 0 21a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <utils/Log.h> 22a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <utils/Timers.h> 23a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <hardware/audio_effect.h> 24a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <audio_effects/effect_aec.h> 25a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <audio_effects/effect_agc.h> 26a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include <audio_effects/effect_ns.h> 275387696d25bc710f8cd0e6d08079e2aa8d6c1417Eric Laurent#include <module_common_types.h> 285387696d25bc710f8cd0e6d08079e2aa8d6c1417Eric Laurent#include <audio_processing.h> 29a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include "speex/speex_resampler.h" 30a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent// undefine to perform multi channels API functional tests 323f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent//#define DUAL_MIC_TEST 33a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 34a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 35a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// local definitions 36a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 37a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 38a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// maximum number of sessions 39a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define PREPROC_NUM_SESSIONS 8 40a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 41a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// types of pre processing modules 42a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_id 43a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 44a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_AGC, // Automatic Gain Control 45a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_AEC, // Acoustic Echo Canceler 46a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_NS, // Noise Suppressor 47a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_NUM_EFFECTS 48a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 49a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 50a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session state 51a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_session_state { 52a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_SESSION_STATE_INIT, // initialized 53a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_SESSION_STATE_CONFIG // configuration received 54a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 55a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 56a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect/Preprocessor state 57a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_effect_state { 58a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_INIT, // initialized 59a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_CREATED, // webRTC engine created 60a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_CONFIG, // configuration received/disabled 61a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_ACTIVE // active/enabled 62a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 63a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 64a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// handle on webRTC engine 65a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef void* preproc_fx_handle_t; 66a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 67a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_session_s preproc_session_t; 68a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_effect_s preproc_effect_t; 69a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_ops_s preproc_ops_t; 70a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 71a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect operation table. Functions for all pre processors are declared in sPreProcOps[] table. 72a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Function pointer can be null if no action required. 73a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_ops_s { 74a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* create)(preproc_effect_t *fx); 75a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* init)(preproc_effect_t *fx); 76a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* reset)(preproc_effect_t *fx); 77a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void (* enable)(preproc_effect_t *fx); 78a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void (* disable)(preproc_effect_t *fx); 79a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* set_parameter)(preproc_effect_t *fx, void *param, void *value); 80a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* get_parameter)(preproc_effect_t *fx, void *param, size_t *size, void *value); 81a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* set_device)(preproc_effect_t *fx, uint32_t device); 82a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 83a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 84a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect context 85a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_effect_s { 86a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const struct effect_interface_s *itfe; 87a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t procId; // type of pre processor (enum preproc_id) 88a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t state; // current state (enum preproc_effect_state) 89a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session; // session the effect is on 90a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const preproc_ops_t *ops; // effect ops table 91a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_fx_handle_t engine; // handle on webRTC engine 923f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 933f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent bool aux_channels_on; // support auxiliary channels 943f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent size_t cur_channel_config; // current auciliary channel configuration 953f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 96a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 97a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 98a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session context 99a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_session_s { 100a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent struct preproc_effect_s effects[PREPROC_NUM_EFFECTS]; // effects in this session 101a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t state; // current state (enum preproc_session_state) 102a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int id; // audio session ID 103a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int io; // handle of input stream this session is on 104a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing* apm; // handle on webRTC audio processing module (APM) 105a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t apmFrameCount; // buffer size for webRTC process (10 ms) 106a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t apmSamplingRate; // webRTC APM sampling rate (8/16 or 32 kHz) 107a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frameCount; // buffer size before input resampler ( <=> apmFrameCount) 108a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t samplingRate; // sampling rate at effect process interface 109a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inChannelCount; // input channel count 110a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t outChannelCount; // output channel count 111a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t createdMsk; // bit field containing IDs of crested pre processors 112a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t enabledMsk; // bit field containing IDs of enabled pre processors 113a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t processedMsk; // bit field containing IDs of pre processors already 114a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // processed in current round 115a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioFrame *procFrame; // audio frame passed to webRTC AMP ProcessStream() 116a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *inBuf; // input buffer used when resampling 117a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t inBufSize; // input buffer size in frames 118a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesIn; // number of frames in input buffer 119a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *inResampler; // handle on input speex resampler 120a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *outBuf; // output buffer used when resampling 121a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t outBufSize; // output buffer size in frames 122a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesOut; // number of frames in output buffer 123a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *outResampler; // handle on output speex resampler 124a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revChannelCount; // number of channels on reverse stream 125a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revEnabledMsk; // bit field containing IDs of enabled pre processors 126a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // with reverse channel 127a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revProcessedMsk; // bit field containing IDs of pre processors with reverse 128a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // channel already processed in current round 129a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioFrame *revFrame; // audio frame passed to webRTC AMP AnalyzeReverseStream() 130a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *revBuf; // reverse channel input buffer 131a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t revBufSize; // reverse channel input buffer size 132a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesRev; // number of frames in reverse channel input buffer 133a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *revResampler; // handle on reverse channel input speex resampler 134a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 135a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1363f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 1373f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentenum { 1383f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent PREPROC_CMD_DUAL_MIC_ENABLE = EFFECT_CMD_FIRST_PROPRIETARY, // enable dual mic mode 1393f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent PREPROC_CMD_DUAL_MIC_PCM_DUMP_START, // start pcm capture 1403f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP // stop pcm capture 1413f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent}; 1423f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1433f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentenum { 1443f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_MONO, 1453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_STEREO, 1463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_MONO_AUX, 1473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_STEREO_AUX, 1483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_CNT, 1493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_FIRST_AUX = CHANNEL_CFG_MONO_AUX, 1503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent}; 1513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentconst channel_config_t sDualMicConfigs[CHANNEL_CFG_CNT] = { 1533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent {AUDIO_CHANNEL_IN_MONO , 0}, 1543f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent {AUDIO_CHANNEL_IN_STEREO , 0}, 1553f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent {AUDIO_CHANNEL_IN_FRONT , AUDIO_CHANNEL_IN_BACK}, 1563f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent {AUDIO_CHANNEL_IN_STEREO , AUDIO_CHANNEL_IN_RIGHT} 1573f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent}; 1583f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1593f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentbool sHasAuxChannels[PREPROC_NUM_EFFECTS] = { 1603f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent false, // PREPROC_AGC 1613f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent true, // PREPROC_AEC 1623f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent true, // PREPROC_NS 1633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent}; 1643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentbool gDualMicEnabled; 1663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric LaurentFILE *gPcmDumpFh; 1673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurentstatic pthread_mutex_t gPcmDumpLock = PTHREAD_MUTEX_INITIALIZER; 1683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 171a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 172a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect descriptors 173a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 174a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 175a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// UUIDs for effect types have been generated from http://www.itu.int/ITU-T/asn1/uuid.html 176a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// as the pre processing effects are not defined by OpenSL ES 177a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 178a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Automatic Gain Control 179a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sAgcDescriptor = { 180a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x0a8abfe0, 0x654c, 0x11e0, 0xba26, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 181a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xaa8130e0, 0x66fc, 0x11e0, 0xbad0, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 182a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 183a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 184a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 185a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 186a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Automatic Gain Control", 187a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 188a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 189a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 190a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Acoustic Echo Cancellation 191a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sAecDescriptor = { 192a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x7b491460, 0x8d4d, 0x11e0, 0xbd61, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 193a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xbb392ec0, 0x8d4d, 0x11e0, 0xa896, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 194a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 195a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 196a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 197a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 198a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Acoustic Echo Canceler", 199a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 200a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 201a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 202a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Noise suppression 203a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sNsDescriptor = { 204a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x58b4b260, 0x8e06, 0x11e0, 0xaa8e, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 205a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xc06c8400, 0x8e06, 0x11e0, 0x9cb6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 206a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 207a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 208a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 209a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 210a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Noise Suppression", 211a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 212a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 213a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 214a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 215a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t *sDescriptors[PREPROC_NUM_EFFECTS] = { 216a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAgcDescriptor, 217a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAecDescriptor, 218a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sNsDescriptor 219a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 220a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 221a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 222a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Helper functions 223a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 224a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 225a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst effect_uuid_t * const sUuidToPreProcTable[PREPROC_NUM_EFFECTS] = { 226a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_AGC, 227a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_AEC, 228a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_NS 229a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 230a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 231a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 232a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst effect_uuid_t * ProcIdToUuid(int procId) 233a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 234a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (procId >= PREPROC_NUM_EFFECTS) { 235a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return EFFECT_UUID_NULL; 236a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 237a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sUuidToPreProcTable[procId]; 238a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 239a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 240a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentuint32_t UuidToProcId(const effect_uuid_t * uuid) 241a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 242a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 243a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS; i++) { 244a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (memcmp(uuid, sUuidToPreProcTable[i], sizeof(*uuid)) == 0) { 245a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 246a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 247a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 248a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return i; 249a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 250a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 251a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentbool HasReverseStream(uint32_t procId) 252a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 253a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (procId == PREPROC_AEC) { 254a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return true; 255a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 256a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return false; 257a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 258a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 259a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 260a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 261a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Automatic Gain Control (AGC) 262a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 263a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 2645387696d25bc710f8cd0e6d08079e2aa8d6c1417Eric Laurentstatic const int kAgcDefaultTargetLevel = 3; 2655387696d25bc710f8cd0e6d08079e2aa8d6c1417Eric Laurentstatic const int kAgcDefaultCompGain = 9; 266a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const bool kAgcDefaultLimiter = true; 267a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 268a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcInit (preproc_effect_t *effect) 269a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 2703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcInit"); 271a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 272a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_mode(webrtc::GainControl::kFixedDigital); 273a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_target_level_dbfs(kAgcDefaultTargetLevel); 274a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_compression_gain_db(kAgcDefaultCompGain); 275a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->enable_limiter(kAgcDefaultLimiter); 276a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 277a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 278a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 279a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcCreate(preproc_effect_t *effect) 280a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 281a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = effect->session->apm->gain_control(); 2823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcCreate got agc %p", agc); 283a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (agc == NULL) { 2845ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcCreate Error"); 285a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 286a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 287a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(agc); 288a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcInit(effect); 289a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 290a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 291a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 292a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcGetParameter(preproc_effect_t *effect, 293a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 294a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 295a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 296a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 297a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 298a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 299a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent t_agc_settings *pProperties = (t_agc_settings *)pValue; 300a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 301a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 302a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 303a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 304a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 305a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(int16_t)) { 306a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 307a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 308a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 309a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 310a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 311a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(bool)) { 312a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 313a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 314a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 315a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 316a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 317a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(t_agc_settings)) { 318a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 319a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 320a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 321a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 322a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 323a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 3245ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcGetParameter() unknown param %08x", param); 325a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 326a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 327a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 328a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 329a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 330a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 331a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int16_t *) pValue = (int16_t)(agc->target_level_dbfs() * -100); 3323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() target level %d milliBels", *(int16_t *) pValue); 333a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 334a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 335a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int16_t *) pValue = (int16_t)(agc->compression_gain_db() * 100); 3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() comp gain %d milliBels", *(int16_t *) pValue); 337a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 338a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 339a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(bool *) pValue = (bool)agc->is_limiter_enabled(); 3403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() limiter enabled %s", 341a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (*(int16_t *) pValue != 0) ? "true" : "false"); 342a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 343a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 344a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->targetLevel = (int16_t)(agc->target_level_dbfs() * -100); 345a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->compGain = (int16_t)(agc->compression_gain_db() * 100); 346a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->limiterEnabled = (bool)agc->is_limiter_enabled(); 347a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 348a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 3495ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcGetParameter() unknown param %d", param); 350a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 351a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 352a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 353a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 354a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 355a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 356a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 357a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 358a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 359a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 360a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent t_agc_settings *pProperties = (t_agc_settings *)pValue; 361a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 362a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 363a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 364a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 3653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() target level %d milliBels", *(int16_t *)pValue); 366a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_target_level_dbfs(-(*(int16_t *)pValue / 100)); 367a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 368a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 3693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() comp gain %d milliBels", *(int16_t *)pValue); 370a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_compression_gain_db(*(int16_t *)pValue / 100); 371a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 372a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 3733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() limiter enabled %s", *(bool *)pValue ? "true" : "false"); 374a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->enable_limiter(*(bool *)pValue); 375a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 376a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 3773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() properties level %d, gain %d limiter %d", 378a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->targetLevel, 379a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->compGain, 380a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->limiterEnabled); 381a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_target_level_dbfs(-(pProperties->targetLevel / 100)); 382a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status != 0) break; 383a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_compression_gain_db(pProperties->compGain / 100); 384a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status != 0) break; 385a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->enable_limiter(pProperties->limiterEnabled); 386a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 387a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 3885ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 389a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 390a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 391a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 392a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 3933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() done status %d", status); 394a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 395a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 396a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 397a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 398a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AgcEnable(preproc_effect_t *effect) 399a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 400a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 4013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcEnable agc %p", agc); 402a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->Enable(true); 403a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 404a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 405a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AgcDisable(preproc_effect_t *effect) 406a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 4073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcDisable"); 408a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 409a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->Enable(false); 410a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 411a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 412a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 413a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sAgcOps = { 414a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcCreate, 415a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcInit, 416a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 417a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcEnable, 418a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcDisable, 419a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcSetParameter, 420a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcGetParameter, 421a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 422a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 423a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 424a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 425a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 426a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Acoustic Echo Canceler (AEC) 427a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 428a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 429a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const webrtc::EchoControlMobile::RoutingMode kAecDefaultMode = 430a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile::kEarpiece; 431a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const bool kAecDefaultComfortNoise = true; 432a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 433a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecInit (preproc_effect_t *effect) 434a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 4353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecInit"); 436a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 437a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->set_routing_mode(kAecDefaultMode); 438a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->enable_comfort_noise(kAecDefaultComfortNoise); 439a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 440a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 441a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 442a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecCreate(preproc_effect_t *effect) 443a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 444a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = effect->session->apm->echo_control_mobile(); 4453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecCreate got aec %p", aec); 446a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (aec == NULL) { 4475ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcCreate Error"); 448a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 449a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 450a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(aec); 451a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecInit (effect); 452a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 453a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 454a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 455a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecGetParameter(preproc_effect_t *effect, 456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 457a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 458a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 459a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 460a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 461a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 462a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 463a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(uint32_t)) { 464a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 465a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 466a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 467a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_ECHO_DELAY: 468a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_PROPERTIES: 469a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(uint32_t *)pValue = 1000 * effect->session->apm->stream_delay_ms(); 4703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecGetParameter() echo delay %d us", *(uint32_t *)pValue); 471a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 472a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 4735ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AecGetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 474a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 475a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 476a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 477a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 478a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 479a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 480a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 481a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 482a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 483a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 484a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t value = *(uint32_t *)pValue; 485a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 486a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 487a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_ECHO_DELAY: 488a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_PROPERTIES: 489a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = effect->session->apm->set_stream_delay_ms(value/1000); 4903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecSetParameter() echo delay %d us, status %d", value, status); 491a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 492a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 4935ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AecSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 494a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 495a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 496a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 497a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 498a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 499a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 500a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AecEnable(preproc_effect_t *effect) 501a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 502a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 5033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecEnable aec %p", aec); 504a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->Enable(true); 505a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 506a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 507a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AecDisable(preproc_effect_t *effect) 508a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 5093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecDisable"); 510a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 511a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->Enable(false); 512a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 513a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 514a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecSetDevice(preproc_effect_t *effect, uint32_t device) 515a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 5163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecSetDevice %08x", device); 517a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 518a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile::RoutingMode mode = webrtc::EchoControlMobile::kQuietEarpieceOrHeadset; 519a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 5208895925e38d2521607fd2010f3f3b14ecd15962cEric Laurent if (audio_is_input_device(device)) { 5218895925e38d2521607fd2010f3f3b14ecd15962cEric Laurent return 0; 5228895925e38d2521607fd2010f3f3b14ecd15962cEric Laurent } 5238895925e38d2521607fd2010f3f3b14ecd15962cEric Laurent 524a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(device) { 525a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_EARPIECE: 526a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent mode = webrtc::EchoControlMobile::kEarpiece; 527a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 528a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_SPEAKER: 529a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent mode = webrtc::EchoControlMobile::kSpeakerphone; 530a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 531a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_WIRED_HEADSET: 532a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: 533a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 534a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 535a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 536a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->set_routing_mode(mode); 537a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 538a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 539a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 540a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sAecOps = { 541a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecCreate, 542a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecInit, 543a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 544a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecEnable, 545a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecDisable, 546a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecSetParameter, 547a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecGetParameter, 548a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecSetDevice 549a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 550a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 551a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 552a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Noise Suppression (NS) 553a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 554a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 555a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const webrtc::NoiseSuppression::Level kNsDefaultLevel = webrtc::NoiseSuppression::kModerate; 556a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 557a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsInit (preproc_effect_t *effect) 558a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 5593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsInit"); 560a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 561a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->set_level(kNsDefaultLevel); 562a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 563a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 564a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 565a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsCreate(preproc_effect_t *effect) 566a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 567a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = effect->session->apm->noise_suppression(); 5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsCreate got ns %p", ns); 569a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (ns == NULL) { 5705ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("AgcCreate Error"); 571a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 572a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 573a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(ns); 574a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsInit (effect); 575a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 576a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 577a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 578a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsGetParameter(preproc_effect_t *effect, 579a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 580a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 581a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 582a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 583a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 584a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 585a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 586a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 587a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 588a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 589a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 590a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 591a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 592a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 593a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsEnable(preproc_effect_t *effect) 594a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 595a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 5963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsEnable ns %p", ns); 597a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(true); 598a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 599a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 600a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsDisable(preproc_effect_t *effect) 601a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 6023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsDisable"); 603a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 604a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(false); 605a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 606a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 607a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sNsOps = { 608a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsCreate, 609a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsInit, 610a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 611a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsEnable, 612a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsDisable, 613a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsSetParameter, 614a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsGetParameter, 615a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 616a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 617a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 618a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 619a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t *sPreProcOps[PREPROC_NUM_EFFECTS] = { 620a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAgcOps, 621a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAecOps, 622a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sNsOps 623a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 624a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 625a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 626a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 627a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect functions 628a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 629a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 630a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled); 631a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 632a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterface; 633a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterfaceReverse; 634a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 635a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define BAD_STATE_ABORT(from, to) \ 636a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOG_ALWAYS_FATAL("Bad state transition from %d to %d", from, to); 637a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 638a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_SetState(preproc_effect_t *effect, uint32_t state) 639a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 640a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Effect_SetState proc %d, new %d old %d", effect->procId, state, effect->state); 642a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(state) { 643a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 644a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 645a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 646a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 647a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 648a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 649a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 650a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 651a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 652a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 653a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 654a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 655a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 656a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 657a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 658a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 659a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = effect->ops->create(effect); 660a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 661a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 662a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 663a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 66429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 665a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 666a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 667a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 668a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 669a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 670a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 671a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 672a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 673a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 67429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 675a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 676a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 677a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 678a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 679a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 680a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 681a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 682a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 683a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 684a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 685a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 686a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 687a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 688a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 689a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 690a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 691a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 69229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 693a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 694a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 6953f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 6963f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // enabling an already enabled effect is just ignored 6973f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 698a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 699a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->enable(effect); 700a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, true); 701a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 702a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 703a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 704a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 705a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 706a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 707a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 708a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 709a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status == 0) { 710a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = state; 711a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 712a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 713a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 714a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 715a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Init(preproc_effect_t *effect, uint32_t procId) 716a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 717a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 718a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterfaceReverse; 719a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 720a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterface; 721a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 722a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops = sPreProcOps[procId]; 723a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->procId = procId; 724a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = PREPROC_EFFECT_STATE_INIT; 725a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 726a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 727a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 728a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Create(preproc_effect_t *effect, 729a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session, 730a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 731a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 732a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session = session; 733a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *interface = (effect_handle_t)&effect->itfe; 734a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_CREATED); 735a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 736a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 737a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Release(preproc_effect_t *effect) 738a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 739a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_INIT); 740a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 741a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 742a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 743a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 744a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session functions 745a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 746a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 747a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define RESAMPLER_QUALITY SPEEX_RESAMPLER_QUALITY_VOIP 748a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 749a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreprocDefaultSr = 16000; 750a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreProcDefaultCnl = 1; 751a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 752a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_Init(preproc_session_t *session) 753a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 754a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 755a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 756a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 757a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_INIT; 758a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->id = 0; 759a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 760a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk = 0; 761a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 762a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS && status == 0; i++) { 763a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Init(&session->effects[i], i); 764a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 765a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 766a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 767a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 768a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 769a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" int Session_CreateEffect(preproc_session_t *session, 770a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t procId, 771a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 772a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 773a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = -ENOMEM; 774a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 7753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect procId %d, createdMsk %08x", procId, session->createdMsk); 776a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 777a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 778a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = webrtc::AudioProcessing::Create(session->io); 779a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->apm == NULL) { 7805ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not get apm engine"); 781a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 782a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 783a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_sample_rate_hz(kPreprocDefaultSr); 784a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_channels(kPreProcDefaultCnl, kPreProcDefaultCnl); 785a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_reverse_channels(kPreProcDefaultCnl); 786a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = new webrtc::AudioFrame(); 787a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->procFrame == NULL) { 7885ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not allocate audio frame"); 789a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 790a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 791a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = new webrtc::AudioFrame(); 792a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revFrame == NULL) { 7935ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not allocate reverse audio frame"); 794a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 795a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 796a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = kPreprocDefaultSr; 797a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = (kPreprocDefaultSr) / 100; 798a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 799a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = kPreprocDefaultSr; 800a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = kPreProcDefaultCnl; 801a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = kPreProcDefaultCnl; 802a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = kPreprocDefaultSr; 803a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = kPreProcDefaultCnl; 804a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = kPreProcDefaultCnl; 805a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = kPreprocDefaultSr; 806a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = kPreProcDefaultCnl; 807a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk = 0; 808a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 809a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk = 0; 810a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 811a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 812a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 813a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = 0; 814a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 815a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 816a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = 0; 817a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 818a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 819a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = 0; 820a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 821a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Create(&session->effects[procId], session, interface); 822a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 823a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 824a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 8253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect OK"); 826a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk |= (1<<procId); 827a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 828a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 829a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenterror: 830a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 831a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 832a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 833a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 834a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 835a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 836a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 837a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 838a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 839a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 840a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 841a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_ReleaseEffect(preproc_session_t *session, 842a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx) 843a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 8445ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW_IF(Effect_Release(fx) != 0, " Effect_Release() failed for proc ID %d", fx->procId); 845a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk &= ~(1<<fx->procId); 846a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 847a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 848a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 849a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 850a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 851a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 852a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 853a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 854a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 855a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 856a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 857a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 858a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 859a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 860a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 861a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 862a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 863a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 864a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 865a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->inBuf; 866a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 867a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->outBuf; 868a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 869a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revBuf; 870a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 871a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 872a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 873a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 874a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 875a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 876a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 877a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 878a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 879a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetConfig(preproc_session_t *session, effect_config_t *config) 880a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 881a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t sr; 882a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inCnl = popcount(config->inputCfg.channels); 883a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t outCnl = popcount(config->outputCfg.channels); 884a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 885a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 886a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 887a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 888a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 889a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 890a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 8913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetConfig sr %d cnl %08x", 892a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 893a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 894a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 89576533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent // if at least one process is enabled, do not accept configuration changes 89676533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (session->enabledMsk) { 89776533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (session->samplingRate != config->inputCfg.samplingRate || 89876533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent session->inChannelCount != inCnl || 89976533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent session->outChannelCount != outCnl) { 90076533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent return -ENOSYS; 90176533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } else { 90276533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent return 0; 90376533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 90476533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 90576533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent 906a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // AEC implementation is limited to 16kHz 907a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 32000 && !(session->createdMsk & (1 << PREPROC_AEC))) { 908a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 32000; 909a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else 910a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 16000) { 911a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 16000; 912a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else if (config->inputCfg.samplingRate >= 8000) { 913a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 8000; 914a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 915a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_sample_rate_hz(session->apmSamplingRate); 916a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 917a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 918a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 919a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_channels(inCnl, outCnl); 920a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 921a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 922a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 923a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_reverse_channels(inCnl); 924a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 925a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 926a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 927a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 928a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = config->inputCfg.samplingRate; 929a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = session->apmSamplingRate / 100; 930a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate == session->apmSamplingRate) { 931a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 932a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 933a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = (session->apmFrameCount * session->samplingRate) / 934a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate + 1; 935a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 936a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = inCnl; 937a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = outCnl; 938a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = inCnl; 939a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = session->apmSamplingRate; 940a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 941a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 942a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 943a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 944a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 9453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // force process buffer reallocation 9463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->inBufSize = 0; 9473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->outBufSize = 0; 9483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesIn = 0; 9493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesOut = 0; 9503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 9513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 952a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 953a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 954a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 955a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 956a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 957a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 958a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 959a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 960a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 961a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 962a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 963a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 964a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate != session->apmSamplingRate) { 965a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int error; 966a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = speex_resampler_init(session->inChannelCount, 967a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 968a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 969a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 970a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 971a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler == NULL) { 9725ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 973a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 974a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 975a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 976a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = speex_resampler_init(session->outChannelCount, 977a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 978a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 979a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 980a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 981a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler == NULL) { 9825ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 983a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 984a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 985a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 986a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 987a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 988a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = speex_resampler_init(session->inChannelCount, 989a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 990a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 991a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 992a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 993a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler == NULL) { 9945ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 995a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 996a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 997a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 998a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 999a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 1000a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1001a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1002a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1003a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1004a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_CONFIG; 1005a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1006a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1007a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10083d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Session_GetConfig(preproc_session_t *session, effect_config_t *config) 10093d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 10103d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent memset(config, 0, sizeof(effect_config_t)); 10113d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.samplingRate = config->outputCfg.samplingRate = session->samplingRate; 10123d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.format = config->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 1013ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten config->inputCfg.channels = audio_channel_in_mask_from_count(session->inChannelCount); 1014ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten // "out" doesn't mean output device, so this is the correct API to convert channel count to mask 1015ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten config->outputCfg.channels = audio_channel_in_mask_from_count(session->outChannelCount); 10163d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.mask = config->outputCfg.mask = 10173d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent (EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT); 10183d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} 10193d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1020a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetReverseConfig(preproc_session_t *session, effect_config_t *config) 1021a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1022a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 1023a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 1024a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 1025a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1026a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1027a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetReverseConfig sr %d cnl %08x", 1029a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 1030a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1031a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->state < PREPROC_SESSION_STATE_CONFIG) { 1032a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOSYS; 1033a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1034a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != session->samplingRate || 1035a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 1036a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1037a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1038a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inCnl = popcount(config->inputCfg.channels); 1039a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = session->apm->set_num_reverse_channels(inCnl); 1040a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 1041a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1042a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1043a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 1044a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 1045a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 10463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // force process buffer reallocation 10473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->revBufSize = 0; 10483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesRev = 0; 10493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1050a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1051a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1052a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10533d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Session_GetReverseConfig(preproc_session_t *session, effect_config_t *config) 10543d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 10553d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent memset(config, 0, sizeof(effect_config_t)); 10563d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.samplingRate = config->outputCfg.samplingRate = session->samplingRate; 10573d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.format = config->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 10583d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.channels = config->outputCfg.channels = 1059ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten audio_channel_in_mask_from_count(session->revChannelCount); 10603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.mask = config->outputCfg.mask = 10613d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent (EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT); 10623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} 10633d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1064a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled) 1065a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1066a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (enabled) { 1067a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if(session->enabledMsk == 0) { 1068a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 1069a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 1070a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->inResampler); 1071a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1072a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut = 0; 1073a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 1074a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->outResampler); 1075a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1076a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1077a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk |= (1 << procId); 1078a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1079a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 1080a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 1081a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->revResampler); 1082a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1083a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk |= (1 << procId); 1084a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1085a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1086a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk &= ~(1 << procId); 1087a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1088a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk &= ~(1 << procId); 1089a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1090a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 10913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetProcEnabled proc %d, enabled %d enabledMsk %08x revEnabledMsk %08x", 1092a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId, enabled, session->enabledMsk, session->revEnabledMsk); 1093a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 1094a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1095a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 1096a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1097a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1098a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1099a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1100a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Bundle functions 1101a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1102a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1103a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic int sInitStatus = 1; 1104a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic preproc_session_t sSessions[PREPROC_NUM_SESSIONS]; 1105a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1106a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentpreproc_session_t *PreProc_GetSession(int32_t procId, int32_t sessionId, int32_t ioId) 1107a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1108a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1109a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int free = -1; 1110a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1111a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == ioId) { 1112a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].createdMsk & (1 << procId)) { 1113a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1114a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1115a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1116a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1117a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1118a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1119a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == 0) { 1120a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].id = sessionId; 1121a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].io = ioId; 1122a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1123a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1124a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1125a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1126a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1127a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1128a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1129a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProc_Init() { 1130a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1131a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1132a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1133a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sInitStatus <= 0) { 1134a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1135a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1136a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS && status == 0; i++) { 1137a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_Init(&sSessions[i]); 1138a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1139a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sInitStatus = status; 1140a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1141a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1142a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 11435e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenconst effect_descriptor_t *PreProc_GetDescriptor(const effect_uuid_t *uuid) 1144a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1145a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1146a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS; i++) { 1147a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (memcmp(&sDescriptors[i]->uuid, uuid, sizeof(effect_uuid_t)) == 0) { 1148a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sDescriptors[i]; 1149a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1150a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1151a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1152a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1153a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1154a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1155a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" { 1156a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1157a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1158a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Control Interface Implementation 1159a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1160a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1161a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Process(effect_handle_t self, 1162a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 1163a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *outBuffer) 1164a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1165a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1166a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1167a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1168a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 11693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Process() ERROR effect == NULL"); 1170a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1171a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1172a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1173a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1174a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 1175a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer == NULL || outBuffer->raw == NULL){ 11765ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_Process() ERROR bad pointer"); 1177a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1178a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1179a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1180a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk |= (1<<effect->procId); 1181a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 11823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_Process In %d frames enabledMsk %08x processedMsk %08x", 1183a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->enabledMsk, session->processedMsk); 1184a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1185a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->processedMsk & session->enabledMsk) == session->enabledMsk) { 1186a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->processedMsk = 0; 1187a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesRq = outBuffer->frameCount; 1188a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesWr = 0; 1189a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesOut) { 1190a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1191a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (outBuffer->frameCount < fr) { 1192a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = outBuffer->frameCount; 1193a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1194a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16, 1195a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1196a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1197a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1198a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1199a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1200a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1201a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent framesWr += fr; 1202a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1203a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount = framesWr; 1204a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesWr == framesRq) { 1205a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = 0; 1206a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1207a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1208a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1209a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 1210a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1211a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1212a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1213a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1214a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inBufSize < session->framesIn + fr) { 1215a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = session->framesIn + fr; 1216a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = (int16_t *)realloc(session->inBuf, 1217a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize * session->inChannelCount * sizeof(int16_t)); 1218a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1219a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf + session->framesIn * session->inChannelCount, 1220a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1221a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 12223f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 12233f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 12243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 12253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fwrite(inBuffer->raw, 12263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fr * session->inChannelCount * sizeof(int16_t), 1, gPcmDumpFh); 12273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 12283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 12293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1230a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1231a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1232a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1233a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1234a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1235a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1236a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->framesIn; 1237a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->apmFrameCount; 1238a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1239a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->inResampler, 1240a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1241a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1242a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1243a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1244a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1245a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1246a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->inResampler, 1247a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1248a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1249a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1250a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1251a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1252a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf, 1253a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf + frIn * session->inChannelCount, 1254a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesIn - frIn) * session->inChannelCount * sizeof(int16_t)); 1255a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn -= frIn; 1256a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1257a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1258a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1259a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1260a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1261a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->procFrame->_payloadData + session->framesIn * session->inChannelCount, 1262a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1263a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 12643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 12653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 12663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 12673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 12683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fwrite(inBuffer->raw, 12693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fr * session->inChannelCount * sizeof(int16_t), 1, gPcmDumpFh); 12703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 12713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 12723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 12733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1274a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1275a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1276a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1277a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1278a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1279a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 1280a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1281a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadDataLengthInSamples = 1282a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1283a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1284a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->ProcessStream(session->procFrame); 1285a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1286a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outBufSize < session->framesOut + session->frameCount) { 1287a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = session->framesOut + session->frameCount; 1288a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = (int16_t *)realloc(session->outBuf, 1289a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize * session->outChannelCount * sizeof(int16_t)); 1290a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1291a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1292a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 1293a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->apmFrameCount; 1294a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->frameCount; 1295a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1296a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->outResampler, 1297a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1298a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1299a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1300a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1301a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1302a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1303a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->outResampler, 1304a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1305a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1306a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1307a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1308a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1309a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += frOut; 1310a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1311a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf + session->framesOut * session->outChannelCount, 1312a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1313a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount * session->outChannelCount * sizeof(int16_t)); 1314a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += session->frameCount; 1315a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1316a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1317a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesRq - framesWr < fr) { 1318a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = framesRq - framesWr; 1319a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1320a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16 + framesWr * session->outChannelCount, 1321a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1322a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1323a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1324a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1325a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1326a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1327a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount += fr; 1328a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1329a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1330a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1331a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1332a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1333a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1334a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1335a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Command(effect_handle_t self, 1336a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdCode, 1337a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdSize, 1338a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pCmdData, 1339a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t *replySize, 1340a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pReplyData) 1341a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1342a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1343a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int retsize; 1344a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1345a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1346a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 1347a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1348a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1349a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("PreProcessingFx_Command: command %d cmdSize %d",cmdCode, cmdSize); 1351a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1352a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (cmdCode){ 1353a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_INIT: 1354a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 1355a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1356a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1357a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->init) { 1358a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->init(effect); 1359a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1360a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = 0; 1361a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1362a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_SET_CONFIG: { 1364a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1365a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(effect_config_t)|| 1366a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL|| 1367a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int)){ 13683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 13693d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_SET_CONFIG: ERROR"); 1370a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1371a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 13723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 13733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // make sure that the config command is accepted by making as if all effects were 13743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // disabled: this is OK for functional tests 13753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent uint32_t enabledMsk = effect->session->enabledMsk; 13763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 13773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->session->enabledMsk = 0; 13783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 13793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1380a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetConfig(effect->session, (effect_config_t *)pCmdData); 13813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 13823f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 13833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->session->enabledMsk = enabledMsk; 13843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 13853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1386a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1387a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1388a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 138976533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (effect->state != PREPROC_EFFECT_STATE_ACTIVE) { 139076533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 139176533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 13923f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 1393a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13943d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG: 13953d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || 13963d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(effect_config_t)) { 13973d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("\tLVM_ERROR : PreProcessingFx_Command cmdCode Case: " 13983d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_GET_CONFIG: ERROR"); 13993d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 14003d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 14013d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 140294fef38613962c983c46ab0b97c58f5373412d2dEric Laurent Session_GetConfig(effect->session, (effect_config_t *)pReplyData); 14033d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 14043d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 14053d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_SET_CONFIG_REVERSE: 14063d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pCmdData == NULL || 14073d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent cmdSize != sizeof(effect_config_t) || 14083d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent pReplyData == NULL || 14093d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(int)) { 14103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 14113d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_SET_CONFIG_REVERSE: ERROR"); 1412a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1413a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1414a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetReverseConfig(effect->session, 1415a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (effect_config_t *)pCmdData); 1416a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1417a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1418a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1419a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1420a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 14213d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG_REVERSE: 14223d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || 14233d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(effect_config_t)){ 14243d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("PreProcessingFx_Command cmdCode Case: " 14253d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_GET_CONFIG_REVERSE: ERROR"); 14263d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 14273d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 14283d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Session_GetReverseConfig(effect->session, (effect_config_t *)pCmdData); 14293d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 14303d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1431a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_RESET: 1432a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->reset) { 1433a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->reset(effect); 1434a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1435a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1436a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1437a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_GET_PARAM:{ 1438a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL || 1439a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize < (int)sizeof(effect_param_t) || 1440a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL || 1441a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize < (int)sizeof(effect_param_t)){ 14423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1443a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_GET_PARAM: ERROR"); 1444a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1445a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1446a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 1447a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1448a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 1449a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1450a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p = (effect_param_t *)pReplyData; 1451a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1452a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 1453a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1454a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->get_parameter) { 1455a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->status = effect->ops->get_parameter(effect, p->data, 1456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (size_t *)&p->vsize, 1457a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + voffset); 1458a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 1459a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1460a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1461a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1462a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_PARAM:{ 1463a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1464a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize < (int)sizeof(effect_param_t) || 1465a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL || 1466a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int32_t)){ 14673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1468a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR"); 1469a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1470a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1471a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 1472a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1473a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (p->psize != sizeof(int32_t)){ 14743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1475a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 1476a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1477a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1478a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_parameter) { 1479a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = effect->ops->set_parameter(effect, 1480a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (void *)p->data, 1481a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + p->psize); 1482a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1483a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1484a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1485a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_ENABLE: 1486a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 14873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_ENABLE: ERROR"); 1488a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1489a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1490a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_ACTIVE); 1491a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1492a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1493a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_DISABLE: 1494a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 14953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_DISABLE: ERROR"); 1496a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1497a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1498a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 1499a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1500a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1501a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_DEVICE: 1502a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_INPUT_DEVICE: 1503a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL || 1504a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(uint32_t)) { 15053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_SET_DEVICE: ERROR"); 1506a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1507a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1508a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1509a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_device) { 1510a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->set_device(effect, *(uint32_t *)pCmdData); 1511a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1512a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1513a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1514a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_VOLUME: 1515a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 1516a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1517a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 15183f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 15193f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ///// test commands start 15203f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_ENABLE: { 15213f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != sizeof(uint32_t) || 15223f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL) { 15233f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_ENABLE: ERROR"); 15253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gDualMicEnabled = *(bool *)pCmdData; 15293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 15303f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->aux_channels_on = sHasAuxChannels[effect->procId]; 15313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 15323f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->aux_channels_on = false; 15333f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15343f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->cur_channel_config = (effect->session->inChannelCount == 1) ? 15353f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_MONO : CHANNEL_CFG_STEREO; 15363f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 15373f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_ENABLE: %s", gDualMicEnabled ? "enabled" : "disabled"); 15383f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15393f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15403f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15413f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: { 15423f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| pReplyData == NULL || replySize == NULL) { 15433f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15443f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: ERROR"); 15453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 15493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 15503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fclose(gPcmDumpFh); 15513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = NULL; 15523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent char *path = strndup((char *)pCmdData, cmdSize); 15543f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = fopen((char *)path, "wb"); 15553f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 15563f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: path %s gPcmDumpFh %p", 15573f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent path, gPcmDumpFh); 15583f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE_IF(gPcmDumpFh <= 0, "gPcmDumpFh open error %d %s", errno, strerror(errno)); 15593f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent free(path); 15603f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15613f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15623f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP: { 15643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pReplyData == NULL || replySize == NULL) { 15653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP: ERROR"); 15673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 15713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 15723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fclose(gPcmDumpFh); 15733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = NULL; 15743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 15763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP"); 15773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15803f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ///// test commands end 15813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 15823f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS: { 15833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 15843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15863f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != 2 * sizeof(uint32_t) || 15873f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL) { 15883f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15893f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS: ERROR"); 15903f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15913f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15923f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15933f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || 15943f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent !effect->aux_channels_on) { 15953f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command feature EFFECT_FEATURE_AUX_CHANNELS not supported by" 15963f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent " fx %d", effect->procId); 15973f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 15983f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 15993f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16003f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16013f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent size_t num_configs = *((uint32_t *)pCmdData + 1); 16023f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*replySize < (2 * sizeof(uint32_t) + 16033f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs * sizeof(channel_config_t))) { 16043f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 16053f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16063f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16073f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 16083f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *((uint32_t *)pReplyData + 1) = CHANNEL_CFG_CNT; 16093f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (num_configs < CHANNEL_CFG_CNT || 16103f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < (2 * sizeof(uint32_t) + 16113f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_CNT * sizeof(channel_config_t))) { 16123f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOMEM; 16133f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 16143f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs = CHANNEL_CFG_CNT; 16153f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16163f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16173f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS num config %d", 16183f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs); 16193f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 16203f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 2 * sizeof(uint32_t) + num_configs * sizeof(channel_config_t); 16213f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *((uint32_t *)pReplyData + 1) = num_configs; 16223f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent memcpy((uint32_t *)pReplyData + 2, &sDualMicConfigs, num_configs * sizeof(channel_config_t)); 16233f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 16243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_GET_FEATURE_CONFIG: 16253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 16263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != sizeof(uint32_t) || 16293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL || 16303f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < sizeof(uint32_t) + sizeof(channel_config_t)) { 16313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 16323f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_GET_FEATURE_CONFIG: ERROR"); 16333f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16343f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16353f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || !effect->aux_channels_on) { 16363f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 16373f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 16383f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16393f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16403f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_GET_FEATURE_CONFIG"); 16413f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16423f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t) + sizeof(channel_config_t); 16433f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent memcpy((uint32_t *)pReplyData + 1, 16443f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent &sDualMicConfigs[effect->cur_channel_config], 16453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent sizeof(channel_config_t)); 16463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_SET_FEATURE_CONFIG: { 16483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG: " 16493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "gDualMicEnabled %d effect->aux_channels_on %d", 16503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gDualMicEnabled, effect->aux_channels_on); 16513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 16523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16543f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != (sizeof(uint32_t) + sizeof(channel_config_t)) || 16553f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL || 16563f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < sizeof(uint32_t)) { 16573f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 16583f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_SET_FEATURE_CONFIG: ERROR\n" 16593f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "pCmdData %p cmdSize %d pReplyData %p replySize %p *replySize %d", 16603f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pCmdData, cmdSize, pReplyData, replySize, replySize ? *replySize : -1); 16613f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16623f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 16643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || !effect->aux_channels_on) { 16653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 16663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command cmdCode Case: " 16673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_SET_FEATURE_CONFIG: ERROR\n" 16683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "CmdData %d effect->aux_channels_on %d", 16693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pCmdData, effect->aux_channels_on); 16703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent size_t i; 16733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent for (i = 0; i < CHANNEL_CFG_CNT;i++) { 16743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (memcmp((uint32_t *)pCmdData + 1, 16753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent &sDualMicConfigs[i], sizeof(channel_config_t)) == 0) { 16763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (i == CHANNEL_CFG_CNT) { 16803f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -EINVAL; 16813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGW("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG invalid config" 16823f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "[%08x].[%08x]", *((uint32_t *)pCmdData + 1), *((uint32_t *)pCmdData + 2)); 16833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 16843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->cur_channel_config = i; 16853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16863f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG New config" 16873f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "[%08x].[%08x]", sDualMicConfigs[i].main_channels, sDualMicConfigs[i].aux_channels); 16883f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16893f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 16903f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1691a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 1692a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1693a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1694a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1695a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1696a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1697a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1698a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_GetDescriptor(effect_handle_t self, 1699a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) 1700a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1701a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1702a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1703a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL || pDescriptor == NULL) { 1704a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1705a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1706a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1707a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *sDescriptors[effect->procId]; 1708a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1709a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1710a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1711a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1712a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_ProcessReverse(effect_handle_t self, 1713a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 1714a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *outBuffer) 1715a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1716a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1717a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1718a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1719a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 17205ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_ProcessReverse() ERROR effect == NULL"); 1721a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1722a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1723a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1724a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1725a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL){ 17265ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_ProcessReverse() ERROR bad pointer"); 1727a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1728a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1729a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1730a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk |= (1<<effect->procId); 1731a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 17323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_ProcessReverse In %d frames revEnabledMsk %08x revProcessedMsk %08x", 1733a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->revEnabledMsk, session->revProcessedMsk); 1734a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1735a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1736a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->revProcessedMsk & session->revEnabledMsk) == session->revEnabledMsk) { 1737a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->revProcessedMsk = 0; 1738a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 1739a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1740a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1741a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1742a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1743a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revBufSize < session->framesRev + fr) { 1744a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = session->framesRev + fr; 1745a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = (int16_t *)realloc(session->revBuf, 1746a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize * session->inChannelCount * sizeof(int16_t)); 1747a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1748a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf + session->framesRev * session->inChannelCount, 1749a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1750a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1751a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1752a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1753a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1754a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1755a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1756a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1757a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->framesRev; 1758a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->apmFrameCount; 1759a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1760a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->revResampler, 1761a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1762a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1763a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1764a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1765a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1766a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1767a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->revResampler, 1768a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1769a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1770a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1771a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1772a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1773a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf, 1774a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf + frIn * session->inChannelCount, 1775a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesRev - frIn) * session->inChannelCount * sizeof(int16_t)); 1776a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev -= frIn; 1777a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1778a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1779a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1780a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1781a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1782a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revFrame->_payloadData + session->framesRev * session->inChannelCount, 1783a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1784a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1785a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1786a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1787a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1788a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1789a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1790a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 1791a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1792a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadDataLengthInSamples = 1793a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1794a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->AnalyzeReverseStream(session->revFrame); 1795a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1796a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1797a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1798a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1799a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1800a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1801a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1802a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// effect_handle_t interface implementation for effect 1803a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterface = { 1804a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1805a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1806a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1807a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 1808a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1809a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1810a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterfaceReverse = { 1811a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1812a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1813a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1814a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_ProcessReverse 1815a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1816a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1817a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1818a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Library Interface Implementation 1819a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1820a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18215e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint PreProcessingLib_Create(const effect_uuid_t *uuid, 1822a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t sessionId, 1823a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t ioId, 1824a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *pInterface) 1825a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 18263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate: uuid: %08x session %d IO: %d", uuid->timeLow, sessionId, ioId); 1827a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1828a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1829a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc; 1830a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session; 1831a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t procId; 1832a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1833a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1834a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1835a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1836a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent desc = PreProc_GetDescriptor(uuid); 1837a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 18385ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate: fx not found uuid: %08x", uuid->timeLow); 1839a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1840a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1841a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId = UuidToProcId(&desc->type); 1842a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1843a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session = PreProc_GetSession(procId, sessionId, ioId); 1844a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session == NULL) { 18455ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate: no more session available"); 1846a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1847a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1848a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1849a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_CreateEffect(session, procId, pInterface); 1850a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1851a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0 && session->createdMsk == 0) { 1852a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 1853a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1854a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 1855a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1856a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1857a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_Release(effect_handle_t interface) 1858a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1859a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 18603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectRelease start %p", interface); 1861a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1862a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1863a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1864a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1865a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx = (preproc_effect_t *)interface; 1866a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1867a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (fx->session->io == 0) { 1868a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1869a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1870a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Session_ReleaseEffect(fx->session, fx); 1871a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1872a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18735e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint PreProcessingLib_GetDescriptor(const effect_uuid_t *uuid, 1874a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) { 1875a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1876a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 1877a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1878a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1879a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1880a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc = PreProc_GetDescriptor(uuid); 1881a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 18823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() not found"); 1883a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1884a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1885a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() got fx %s", desc->name); 1887a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1888a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *desc; 1889a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1890a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1891a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18927f16b197c76fbae9399242f055a7ee16dcd0fd6dMarco Nelissen// This is the only symbol that needs to be exported 18937f16b197c76fbae9399242f055a7ee16dcd0fd6dMarco Nelissen__attribute__ ((visibility ("default"))) 1894a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 1895a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent tag : AUDIO_EFFECT_LIBRARY_TAG, 1896a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent version : EFFECT_LIBRARY_API_VERSION, 1897a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent name : "Audio Preprocessing Library", 1898a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent implementor : "The Android Open Source Project", 1899a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent create_effect : PreProcessingLib_Create, 1900a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent release_effect : PreProcessingLib_Release, 1901a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent get_descriptor : PreProcessingLib_GetDescriptor 1902a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1903a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1904a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; // extern "C" 1905