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); 80b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat int (* get_parameter)(preproc_effect_t *fx, void *param, uint32_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, 294b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat uint32_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 455b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint AecGetParameter(preproc_effect_t *effect, 456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 457b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat uint32_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 5780f714a464d2425afe00d6450535e763131b40844Eric Laurentint NsGetParameter(preproc_effect_t *effect __unused, 5790f714a464d2425afe00d6450535e763131b40844Eric Laurent void *pParam __unused, 5800f714a464d2425afe00d6450535e763131b40844Eric Laurent uint32_t *pValueSize __unused, 5810f714a464d2425afe00d6450535e763131b40844Eric Laurent void *pValue __unused) 582a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 583a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 584a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 585a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 586a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 5870f714a464d2425afe00d6450535e763131b40844Eric Laurentint NsSetParameter (preproc_effect_t *effect __unused, 5880f714a464d2425afe00d6450535e763131b40844Eric Laurent void *pParam __unused, 5890f714a464d2425afe00d6450535e763131b40844Eric Laurent void *pValue __unused) 590a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 591a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 592a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 593a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 594a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 595a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsEnable(preproc_effect_t *effect) 596a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 597a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 5983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsEnable ns %p", ns); 599a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(true); 600a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 601a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 602a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsDisable(preproc_effect_t *effect) 603a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 6043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsDisable"); 605a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 606a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(false); 607a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 608a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 609a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sNsOps = { 610a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsCreate, 611a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsInit, 612a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 613a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsEnable, 614a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsDisable, 615a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsSetParameter, 616a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsGetParameter, 617a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 618a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 619a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 620a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 621a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t *sPreProcOps[PREPROC_NUM_EFFECTS] = { 622a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAgcOps, 623a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAecOps, 624a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sNsOps 625a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 626a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 627a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 628a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 629a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect functions 630a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 631a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 632a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled); 633a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 634a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterface; 635a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterfaceReverse; 636a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 637a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define BAD_STATE_ABORT(from, to) \ 638a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOG_ALWAYS_FATAL("Bad state transition from %d to %d", from, to); 639a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 640a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_SetState(preproc_effect_t *effect, uint32_t state) 641a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 642a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 6433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Effect_SetState proc %d, new %d old %d", effect->procId, state, effect->state); 644a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(state) { 645a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 646a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 647a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 648a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 649a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 650a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 651a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 652a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 653a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 654a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 655a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 656a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 657a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 658a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 659a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 660a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 661a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = effect->ops->create(effect); 662a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 663a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 664a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 665a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 66629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 667a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 668a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 669a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 670a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 671a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 672a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 673a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 674a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 675a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 67629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 677a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 678a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 679a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 680a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 681a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 682a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 683a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 684a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 685a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 686a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 687a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 688a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 689a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 690a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 691a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 692a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 693a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 69429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Effect_SetState invalid transition"); 695a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 696a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 6973f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 6983f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // enabling an already enabled effect is just ignored 6993f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 700a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 701a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->enable(effect); 702a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, true); 703a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 704a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 705a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 706a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 707a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 708a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 709a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 710a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 711a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status == 0) { 712a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = state; 713a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 714a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 715a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 716a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 717a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Init(preproc_effect_t *effect, uint32_t procId) 718a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 719a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 720a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterfaceReverse; 721a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 722a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterface; 723a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 724a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops = sPreProcOps[procId]; 725a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->procId = procId; 726a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = PREPROC_EFFECT_STATE_INIT; 727a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 728a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 729a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 730a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Create(preproc_effect_t *effect, 731a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session, 732a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 733a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 734a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session = session; 735a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *interface = (effect_handle_t)&effect->itfe; 736a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_CREATED); 737a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 738a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 739a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Release(preproc_effect_t *effect) 740a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 741a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_INIT); 742a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 743a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 744a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 745a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 746a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session functions 747a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 748a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 749a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define RESAMPLER_QUALITY SPEEX_RESAMPLER_QUALITY_VOIP 750a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 751a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreprocDefaultSr = 16000; 752a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreProcDefaultCnl = 1; 753a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 754a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_Init(preproc_session_t *session) 755a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 756a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 757a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 758a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 759a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_INIT; 760a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->id = 0; 761a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 762a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk = 0; 763a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 764a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS && status == 0; i++) { 765a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Init(&session->effects[i], i); 766a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 767a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 768a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 769a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 770a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 771a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" int Session_CreateEffect(preproc_session_t *session, 772a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t procId, 773a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 774a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 775a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = -ENOMEM; 776a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 7773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect procId %d, createdMsk %08x", procId, session->createdMsk); 778a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 779a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 780a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = webrtc::AudioProcessing::Create(session->io); 781a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->apm == NULL) { 7825ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not get apm engine"); 783a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 784a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 785a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_sample_rate_hz(kPreprocDefaultSr); 786a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_channels(kPreProcDefaultCnl, kPreProcDefaultCnl); 787a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_reverse_channels(kPreProcDefaultCnl); 788a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = new webrtc::AudioFrame(); 789a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->procFrame == NULL) { 7905ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not allocate audio frame"); 791a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 792a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 793a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = new webrtc::AudioFrame(); 794a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revFrame == NULL) { 7955ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_CreateEffect could not allocate reverse audio frame"); 796a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 797a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 798a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = kPreprocDefaultSr; 799a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = (kPreprocDefaultSr) / 100; 800a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 801a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = kPreprocDefaultSr; 802a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = kPreProcDefaultCnl; 803a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = kPreProcDefaultCnl; 804a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = kPreprocDefaultSr; 805a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = kPreProcDefaultCnl; 806a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = kPreProcDefaultCnl; 807a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = kPreprocDefaultSr; 808a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = kPreProcDefaultCnl; 809a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk = 0; 810a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 811a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk = 0; 812a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 813a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 814a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 815a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = 0; 816a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 817a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 818a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = 0; 819a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 820a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 821a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = 0; 822a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 823a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Create(&session->effects[procId], session, interface); 824a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 825a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 826a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 8273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect OK"); 828a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk |= (1<<procId); 829a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 830a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 831a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenterror: 832a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 833a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 834a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 835a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 836a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 837a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 838a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 839a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 840a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 841a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 842a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 843a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_ReleaseEffect(preproc_session_t *session, 844a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx) 845a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 8465ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW_IF(Effect_Release(fx) != 0, " Effect_Release() failed for proc ID %d", fx->procId); 847a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk &= ~(1<<fx->procId); 848a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 849a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 850a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 851a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 852a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 853a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 854a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 855a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 856a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 857a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 858a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 859a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 860a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 861a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 862a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 863a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 864a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 865a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 866a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 867a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->inBuf; 868a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 869a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->outBuf; 870a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 871a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revBuf; 872a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 873a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 874a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 875a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 876a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 877a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 878a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 879a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 880a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 881a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetConfig(preproc_session_t *session, effect_config_t *config) 882a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 883a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t sr; 884e541269be94f3a1072932d51537905b120ef4733Andy Hung uint32_t inCnl = audio_channel_count_from_out_mask(config->inputCfg.channels); 885e541269be94f3a1072932d51537905b120ef4733Andy Hung uint32_t outCnl = audio_channel_count_from_out_mask(config->outputCfg.channels); 886a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 887a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 888a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 889a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 890a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 891a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 892a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 8933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetConfig sr %d cnl %08x", 894a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 895a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 896a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 89776533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent // if at least one process is enabled, do not accept configuration changes 89876533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (session->enabledMsk) { 89976533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (session->samplingRate != config->inputCfg.samplingRate || 90076533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent session->inChannelCount != inCnl || 90176533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent session->outChannelCount != outCnl) { 90276533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent return -ENOSYS; 90376533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } else { 90476533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent return 0; 90576533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 90676533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 90776533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent 908a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // AEC implementation is limited to 16kHz 909a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 32000 && !(session->createdMsk & (1 << PREPROC_AEC))) { 910a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 32000; 911a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else 912a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 16000) { 913a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 16000; 914a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else if (config->inputCfg.samplingRate >= 8000) { 915a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 8000; 916a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 917a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_sample_rate_hz(session->apmSamplingRate); 918a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 919a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 920a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 921a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_channels(inCnl, outCnl); 922a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 923a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 924a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 925a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_reverse_channels(inCnl); 926a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 927a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 928a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 929a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 930a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = config->inputCfg.samplingRate; 931a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = session->apmSamplingRate / 100; 932a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate == session->apmSamplingRate) { 933a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 934a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 935a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = (session->apmFrameCount * session->samplingRate) / 936a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate + 1; 937a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 938a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = inCnl; 939a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = outCnl; 940a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = inCnl; 941a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = session->apmSamplingRate; 942a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 943a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 944a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 945a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 946a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 9473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // force process buffer reallocation 9483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->inBufSize = 0; 9493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->outBufSize = 0; 9503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesIn = 0; 9513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesOut = 0; 9523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 9533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 954a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 955a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 956a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 957a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 958a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 959a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 960a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 961a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 962a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 963a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 964a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 965a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 966a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate != session->apmSamplingRate) { 967a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int error; 968a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = speex_resampler_init(session->inChannelCount, 969a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 970a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 971a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 972a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 973a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler == NULL) { 9745ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 975a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 976a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 977a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 978a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = speex_resampler_init(session->outChannelCount, 979a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 980a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 981a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 982a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 983a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler == NULL) { 9845ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 985a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 986a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 987a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 988a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 989a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 990a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = speex_resampler_init(session->inChannelCount, 991a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 992a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 993a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 994a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 995a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler == NULL) { 9965ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Session_SetConfig Cannot create speex resampler: %s", 997a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 998a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 999a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 1000a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 1001a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 1002a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1003a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1004a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1005a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1006a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_CONFIG; 1007a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1008a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1009a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10103d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Session_GetConfig(preproc_session_t *session, effect_config_t *config) 10113d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 10123d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent memset(config, 0, sizeof(effect_config_t)); 10133d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.samplingRate = config->outputCfg.samplingRate = session->samplingRate; 10143d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.format = config->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 1015ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten config->inputCfg.channels = audio_channel_in_mask_from_count(session->inChannelCount); 1016ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten // "out" doesn't mean output device, so this is the correct API to convert channel count to mask 1017ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten config->outputCfg.channels = audio_channel_in_mask_from_count(session->outChannelCount); 10183d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.mask = config->outputCfg.mask = 10193d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent (EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT); 10203d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} 10213d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1022a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetReverseConfig(preproc_session_t *session, effect_config_t *config) 1023a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1024a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 1025a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 1026a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 1027a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1028a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1029a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetReverseConfig sr %d cnl %08x", 1031a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 1032a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1033a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->state < PREPROC_SESSION_STATE_CONFIG) { 1034a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOSYS; 1035a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1036a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != session->samplingRate || 1037a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 1038a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1039a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1040e541269be94f3a1072932d51537905b120ef4733Andy Hung uint32_t inCnl = audio_channel_count_from_out_mask(config->inputCfg.channels); 1041a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = session->apm->set_num_reverse_channels(inCnl); 1042a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 1043a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1044a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1045a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 1046a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 1047a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 10483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // force process buffer reallocation 10493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->revBufSize = 0; 10503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent session->framesRev = 0; 10513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1052a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1053a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1054a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10553d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Session_GetReverseConfig(preproc_session_t *session, effect_config_t *config) 10563d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 10573d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent memset(config, 0, sizeof(effect_config_t)); 10583d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.samplingRate = config->outputCfg.samplingRate = session->samplingRate; 10593d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.format = config->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 10603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.channels = config->outputCfg.channels = 1061ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten audio_channel_in_mask_from_count(session->revChannelCount); 10623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent config->inputCfg.mask = config->outputCfg.mask = 10633d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent (EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT); 10643d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} 10653d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1066a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled) 1067a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1068a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (enabled) { 1069a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if(session->enabledMsk == 0) { 1070a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 1071a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 1072a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->inResampler); 1073a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1074a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut = 0; 1075a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 1076a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->outResampler); 1077a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1078a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1079a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk |= (1 << procId); 1080a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1081a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 1082a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 1083a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->revResampler); 1084a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1085a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk |= (1 << procId); 1086a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1087a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1088a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk &= ~(1 << procId); 1089a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1090a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk &= ~(1 << procId); 1091a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1092a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 10933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetProcEnabled proc %d, enabled %d enabledMsk %08x revEnabledMsk %08x", 1094a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId, enabled, session->enabledMsk, session->revEnabledMsk); 1095a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 1096a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1097a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 1098a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1099a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1100a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1101a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1102a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Bundle functions 1103a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1104a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1105a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic int sInitStatus = 1; 1106a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic preproc_session_t sSessions[PREPROC_NUM_SESSIONS]; 1107a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1108a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentpreproc_session_t *PreProc_GetSession(int32_t procId, int32_t sessionId, int32_t ioId) 1109a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1110a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1111a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int free = -1; 1112a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1113a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == ioId) { 1114a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].createdMsk & (1 << procId)) { 1115a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1116a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1117a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1118a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1119a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1120a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1121a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == 0) { 1122a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].id = sessionId; 1123a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].io = ioId; 1124a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1125a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1126a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1127a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1128a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1129a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1130a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1131a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProc_Init() { 1132a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1133a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1134a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1135a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sInitStatus <= 0) { 1136a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1137a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1138a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS && status == 0; i++) { 1139a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_Init(&sSessions[i]); 1140a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1141a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sInitStatus = status; 1142a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1143a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1144a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 11455e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenconst effect_descriptor_t *PreProc_GetDescriptor(const effect_uuid_t *uuid) 1146a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1147a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1148a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS; i++) { 1149a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (memcmp(&sDescriptors[i]->uuid, uuid, sizeof(effect_uuid_t)) == 0) { 1150a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sDescriptors[i]; 1151a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1152a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1153a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1154a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1155a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1156a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1157a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" { 1158a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1159a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1160a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Control Interface Implementation 1161a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1162a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1163a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Process(effect_handle_t self, 1164a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 1165a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *outBuffer) 1166a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1167a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1168a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1169a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1170a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 11713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Process() ERROR effect == NULL"); 1172a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1173a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1174a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1175a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1176a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 1177a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer == NULL || outBuffer->raw == NULL){ 11785ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_Process() ERROR bad pointer"); 1179a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1180a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1181a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1182a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk |= (1<<effect->procId); 1183a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 11843856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_Process In %d frames enabledMsk %08x processedMsk %08x", 1185a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->enabledMsk, session->processedMsk); 1186a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1187a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->processedMsk & session->enabledMsk) == session->enabledMsk) { 1188a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->processedMsk = 0; 1189a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesRq = outBuffer->frameCount; 1190a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesWr = 0; 1191a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesOut) { 1192a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1193a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (outBuffer->frameCount < fr) { 1194a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = outBuffer->frameCount; 1195a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1196a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16, 1197a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1198a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1199a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1200a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1201a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1202a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1203a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent framesWr += fr; 1204a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1205a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount = framesWr; 1206a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesWr == framesRq) { 1207a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = 0; 1208a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1209a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1210a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1211a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 1212a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1213a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1214a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1215a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1216a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inBufSize < session->framesIn + fr) { 1217a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = session->framesIn + fr; 1218a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = (int16_t *)realloc(session->inBuf, 1219a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize * session->inChannelCount * sizeof(int16_t)); 1220a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1221a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf + session->framesIn * session->inChannelCount, 1222a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1223a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 12243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 12253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 12263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 12273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fwrite(inBuffer->raw, 12283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fr * session->inChannelCount * sizeof(int16_t), 1, gPcmDumpFh); 12293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 12303f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 12313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1232a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1233a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1234a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1235a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1236a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1237a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1238377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frIn = session->framesIn; 1239377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frOut = session->apmFrameCount; 1240a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1241a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->inResampler, 1242a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1243a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1244a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1245a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1246a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1247a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1248a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->inResampler, 1249a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1250a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1251a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1252a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1253a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1254a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf, 1255a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf + frIn * session->inChannelCount, 1256a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesIn - frIn) * session->inChannelCount * sizeof(int16_t)); 1257a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn -= frIn; 1258a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1259a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1260a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1261a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1262a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1263a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->procFrame->_payloadData + session->framesIn * session->inChannelCount, 1264a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1265a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 12663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 12673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 12683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 12693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 12703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fwrite(inBuffer->raw, 12713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fr * session->inChannelCount * sizeof(int16_t), 1, gPcmDumpFh); 12723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 12733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 12743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 12753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 1276a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1277a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1278a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1279a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1280a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1281a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 1282a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1283a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadDataLengthInSamples = 1284a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1285a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1286a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->ProcessStream(session->procFrame); 1287a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1288a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outBufSize < session->framesOut + session->frameCount) { 1289a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = session->framesOut + session->frameCount; 1290a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = (int16_t *)realloc(session->outBuf, 1291a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize * session->outChannelCount * sizeof(int16_t)); 1292a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1293a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1294a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 1295377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frIn = session->apmFrameCount; 1296377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frOut = session->frameCount; 1297a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1298a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->outResampler, 1299a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1300a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1301a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1302a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1303a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1304a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1305a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->outResampler, 1306a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1307a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1308a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1309a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1310a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1311a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += frOut; 1312a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1313a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf + session->framesOut * session->outChannelCount, 1314a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1315a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount * session->outChannelCount * sizeof(int16_t)); 1316a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += session->frameCount; 1317a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1318a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1319a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesRq - framesWr < fr) { 1320a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = framesRq - framesWr; 1321a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1322a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16 + framesWr * session->outChannelCount, 1323a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1324a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1325a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1326a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1327a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1328a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1329a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount += fr; 1330a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1331a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1332a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1333a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1334a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1335a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1336a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1337a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Command(effect_handle_t self, 1338a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdCode, 1339a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdSize, 1340a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pCmdData, 1341a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t *replySize, 1342a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pReplyData) 1343a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1344a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1345a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int retsize; 1346a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1347a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1348a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 1349a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1350a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1351a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("PreProcessingFx_Command: command %d cmdSize %d",cmdCode, cmdSize); 1353a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1354a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (cmdCode){ 1355a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_INIT: 1356a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 1357a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1358a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1359a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->init) { 1360a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->init(effect); 1361a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1362a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = 0; 1363a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1364a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_SET_CONFIG: { 1366a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1367a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(effect_config_t)|| 1368a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL|| 1369a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int)){ 13703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 13713d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_SET_CONFIG: ERROR"); 1372a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1373a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 13743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 13753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // make sure that the config command is accepted by making as if all effects were 13763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent // disabled: this is OK for functional tests 13773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent uint32_t enabledMsk = effect->session->enabledMsk; 13783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 13793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->session->enabledMsk = 0; 13803f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 13813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1382a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetConfig(effect->session, (effect_config_t *)pCmdData); 13833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 13843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 13853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->session->enabledMsk = enabledMsk; 13863f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 13873f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1388a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1389a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1390a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 139176533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent if (effect->state != PREPROC_EFFECT_STATE_ACTIVE) { 139276533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 139376533e94500e5d221ec4a1a5d9c97ea3d75860e4Eric Laurent } 13943f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 1395a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 13963d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG: 13973d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || 13983d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(effect_config_t)) { 13993d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("\tLVM_ERROR : PreProcessingFx_Command cmdCode Case: " 14003d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_GET_CONFIG: ERROR"); 14013d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 14023d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 14033d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 140494fef38613962c983c46ab0b97c58f5373412d2dEric Laurent Session_GetConfig(effect->session, (effect_config_t *)pReplyData); 14053d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 14063d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 14073d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_SET_CONFIG_REVERSE: 14083d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pCmdData == NULL || 14093d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent cmdSize != sizeof(effect_config_t) || 14103d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent pReplyData == NULL || 14113d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(int)) { 14123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 14133d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_SET_CONFIG_REVERSE: ERROR"); 1414a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1415a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1416a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetReverseConfig(effect->session, 1417a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (effect_config_t *)pCmdData); 1418a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1419a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1420a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1421a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1422a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 14233d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG_REVERSE: 14243d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || 14253d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *replySize != sizeof(effect_config_t)){ 14263d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("PreProcessingFx_Command cmdCode Case: " 14273d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent "EFFECT_CMD_GET_CONFIG_REVERSE: ERROR"); 14283d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 14293d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 14303d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Session_GetReverseConfig(effect->session, (effect_config_t *)pCmdData); 14313d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 14323d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 1433a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_RESET: 1434a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->reset) { 1435a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->reset(effect); 1436a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1437a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1438a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 14390f714a464d2425afe00d6450535e763131b40844Eric Laurent case EFFECT_CMD_GET_PARAM: { 14400f714a464d2425afe00d6450535e763131b40844Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 14410f714a464d2425afe00d6450535e763131b40844Eric Laurent 14420f714a464d2425afe00d6450535e763131b40844Eric Laurent if (pCmdData == NULL || cmdSize < sizeof(effect_param_t) || 14430f714a464d2425afe00d6450535e763131b40844Eric Laurent cmdSize < (sizeof(effect_param_t) + p->psize) || 14440f714a464d2425afe00d6450535e763131b40844Eric Laurent pReplyData == NULL || replySize == NULL || 14450f714a464d2425afe00d6450535e763131b40844Eric Laurent *replySize < (sizeof(effect_param_t) + p->psize)){ 14463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1447a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_GET_PARAM: ERROR"); 1448a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1449a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1450a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1451a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 1452a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1453a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p = (effect_param_t *)pReplyData; 1454a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1455a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 1456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1457a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->get_parameter) { 1458a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->status = effect->ops->get_parameter(effect, p->data, 1459b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat &p->vsize, 1460a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + voffset); 1461a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 1462a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1463a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1464a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1465a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_PARAM:{ 1466a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 14670f714a464d2425afe00d6450535e763131b40844Eric Laurent cmdSize < sizeof(effect_param_t) || 14680f714a464d2425afe00d6450535e763131b40844Eric Laurent pReplyData == NULL || replySize == NULL || 1469a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int32_t)){ 14703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1471a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR"); 1472a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1473a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1474a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 1475a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1476a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (p->psize != sizeof(int32_t)){ 14773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1478a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 1479a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1480a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1481a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_parameter) { 1482a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = effect->ops->set_parameter(effect, 1483a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (void *)p->data, 1484a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + p->psize); 1485a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1486a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1487a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1488a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_ENABLE: 14890f714a464d2425afe00d6450535e763131b40844Eric Laurent if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)){ 14903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_ENABLE: ERROR"); 1491a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1492a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1493a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_ACTIVE); 1494a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1495a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1496a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_DISABLE: 14970f714a464d2425afe00d6450535e763131b40844Eric Laurent if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)){ 14983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_DISABLE: ERROR"); 1499a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1500a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1501a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 1502a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1503a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1504a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_DEVICE: 1505a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_INPUT_DEVICE: 1506a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL || 1507a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(uint32_t)) { 15083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_SET_DEVICE: ERROR"); 1509a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1510a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1511a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1512a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_device) { 1513a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->set_device(effect, *(uint32_t *)pCmdData); 1514a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1515a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1516a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1517a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_VOLUME: 1518a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 1519a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1520a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 15213f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#ifdef DUAL_MIC_TEST 15223f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ///// test commands start 15233f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_ENABLE: { 15243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != sizeof(uint32_t) || 15253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL) { 15263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_ENABLE: ERROR"); 15283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15303f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gDualMicEnabled = *(bool *)pCmdData; 15323f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gDualMicEnabled) { 15333f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->aux_channels_on = sHasAuxChannels[effect->procId]; 15343f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 15353f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->aux_channels_on = false; 15363f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15373f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->cur_channel_config = (effect->session->inChannelCount == 1) ? 15383f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_MONO : CHANNEL_CFG_STEREO; 15393f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 15403f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_ENABLE: %s", gDualMicEnabled ? "enabled" : "disabled"); 15413f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15423f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15433f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15443f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: { 15453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| pReplyData == NULL || replySize == NULL) { 15463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: ERROR"); 15483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 15523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 15533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fclose(gPcmDumpFh); 15543f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = NULL; 15553f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15563f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent char *path = strndup((char *)pCmdData, cmdSize); 15573f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = fopen((char *)path, "wb"); 15583f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 15593f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_PCM_DUMP_START: path %s gPcmDumpFh %p", 15603f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent path, gPcmDumpFh); 15613f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE_IF(gPcmDumpFh <= 0, "gPcmDumpFh open error %d %s", errno, strerror(errno)); 15623f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent free(path); 15633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP: { 15673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pReplyData == NULL || replySize == NULL) { 15683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP: ERROR"); 15703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_lock(&gPcmDumpLock); 15743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (gPcmDumpFh != NULL) { 15753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent fclose(gPcmDumpFh); 15763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gPcmDumpFh = NULL; 15773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pthread_mutex_unlock(&gPcmDumpLock); 15793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PREPROC_CMD_DUAL_MIC_PCM_DUMP_STOP"); 15803f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(int); 15813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(int *)pReplyData = 0; 15823f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 15833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ///// test commands end 15843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 15853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS: { 15863f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 15873f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15883f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15893f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != 2 * sizeof(uint32_t) || 15903f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL) { 15913f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 15923f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS: ERROR"); 15933f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 15943f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 15953f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 15963f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || 15973f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent !effect->aux_channels_on) { 15983f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command feature EFFECT_FEATURE_AUX_CHANNELS not supported by" 15993f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent " fx %d", effect->procId); 16003f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 16013f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 16023f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16033f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16043f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent size_t num_configs = *((uint32_t *)pCmdData + 1); 16053f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*replySize < (2 * sizeof(uint32_t) + 16063f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs * sizeof(channel_config_t))) { 16073f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 0; 16083f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16093f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16103f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 16113f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *((uint32_t *)pReplyData + 1) = CHANNEL_CFG_CNT; 16123f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (num_configs < CHANNEL_CFG_CNT || 16133f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < (2 * sizeof(uint32_t) + 16143f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent CHANNEL_CFG_CNT * sizeof(channel_config_t))) { 16153f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOMEM; 16163f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 16173f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs = CHANNEL_CFG_CNT; 16183f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16193f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16203f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS num config %d", 16213f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent num_configs); 16223f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent 16233f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = 2 * sizeof(uint32_t) + num_configs * sizeof(channel_config_t); 16243f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *((uint32_t *)pReplyData + 1) = num_configs; 16253f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent memcpy((uint32_t *)pReplyData + 2, &sDualMicConfigs, num_configs * sizeof(channel_config_t)); 16263f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 16273f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_GET_FEATURE_CONFIG: 16283f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 16293f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16303f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16313f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != sizeof(uint32_t) || 16323f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL || 16333f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < sizeof(uint32_t) + sizeof(channel_config_t)) { 16343f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 16353f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_GET_FEATURE_CONFIG: ERROR"); 16363f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16373f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16383f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || !effect->aux_channels_on) { 16393f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 16403f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 16413f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16423f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16433f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_GET_FEATURE_CONFIG"); 16443f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16453f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t) + sizeof(channel_config_t); 16463f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent memcpy((uint32_t *)pReplyData + 1, 16473f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent &sDualMicConfigs[effect->cur_channel_config], 16483f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent sizeof(channel_config_t)); 16493f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16503f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent case EFFECT_CMD_SET_FEATURE_CONFIG: { 16513f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG: " 16523f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "gDualMicEnabled %d effect->aux_channels_on %d", 16533f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent gDualMicEnabled, effect->aux_channels_on); 16543f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if(!gDualMicEnabled) { 16553f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16563f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16573f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (pCmdData == NULL|| cmdSize != (sizeof(uint32_t) + sizeof(channel_config_t)) || 16583f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pReplyData == NULL || replySize == NULL || 16593f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize < sizeof(uint32_t)) { 16603f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGE("PreProcessingFx_Command cmdCode Case: " 16613f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_SET_FEATURE_CONFIG: ERROR\n" 16623f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "pCmdData %p cmdSize %d pReplyData %p replySize %p *replySize %d", 16633f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent pCmdData, cmdSize, pReplyData, replySize, replySize ? *replySize : -1); 16643f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent return -EINVAL; 16653f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16663f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *replySize = sizeof(uint32_t); 16673f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (*(uint32_t *)pCmdData != EFFECT_FEATURE_AUX_CHANNELS || !effect->aux_channels_on) { 16683f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -ENOSYS; 16693f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command cmdCode Case: " 16703f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "EFFECT_CMD_SET_FEATURE_CONFIG: ERROR\n" 16713f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "CmdData %d effect->aux_channels_on %d", 16723f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pCmdData, effect->aux_channels_on); 16733f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16743f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16753f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent size_t i; 16763f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent for (i = 0; i < CHANNEL_CFG_CNT;i++) { 16773f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (memcmp((uint32_t *)pCmdData + 1, 16783f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent &sDualMicConfigs[i], sizeof(channel_config_t)) == 0) { 16793f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent break; 16803f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16813f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16823f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent if (i == CHANNEL_CFG_CNT) { 16833f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = -EINVAL; 16843f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGW("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG invalid config" 16853f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "[%08x].[%08x]", *((uint32_t *)pCmdData + 1), *((uint32_t *)pCmdData + 2)); 16863f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } else { 16873f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent effect->cur_channel_config = i; 16883f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent *(uint32_t *)pReplyData = 0; 16893f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent ALOGV("PreProcessingFx_Command EFFECT_CMD_SET_FEATURE_CONFIG New config" 16903f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent "[%08x].[%08x]", sDualMicConfigs[i].main_channels, sDualMicConfigs[i].aux_channels); 16913f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } 16923f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent } break; 16933f9c84c0a5af83fceb8669390e2d71b75ec7b550Eric Laurent#endif 1694a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 1695a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1696a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1697a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1698a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1699a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1700a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1701a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_GetDescriptor(effect_handle_t self, 1702a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) 1703a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1704a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1705a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1706a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL || pDescriptor == NULL) { 1707a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1708a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1709a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1710a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *sDescriptors[effect->procId]; 1711a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1712a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1713a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1714a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1715a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_ProcessReverse(effect_handle_t self, 1716a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 17170f714a464d2425afe00d6450535e763131b40844Eric Laurent audio_buffer_t *outBuffer __unused) 1718a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1719a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1720a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1721a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1722a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 17235ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_ProcessReverse() ERROR effect == NULL"); 1724a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1725a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1726a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1727a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1728a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL){ 17295ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("PreProcessingFx_ProcessReverse() ERROR bad pointer"); 1730a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1731a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1732a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1733a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk |= (1<<effect->procId); 1734a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 17353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_ProcessReverse In %d frames revEnabledMsk %08x revProcessedMsk %08x", 1736a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->revEnabledMsk, session->revProcessedMsk); 1737a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1738a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1739a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->revProcessedMsk & session->revEnabledMsk) == session->revEnabledMsk) { 1740a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->revProcessedMsk = 0; 1741a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 1742a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1743a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1744a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1745a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1746a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revBufSize < session->framesRev + fr) { 1747a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = session->framesRev + fr; 1748a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = (int16_t *)realloc(session->revBuf, 1749a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize * session->inChannelCount * sizeof(int16_t)); 1750a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1751a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf + session->framesRev * session->inChannelCount, 1752a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1753a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1754a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1755a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1756a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1757a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1758a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1759a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1760377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frIn = session->framesRev; 1761377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT spx_uint32_t frOut = session->apmFrameCount; 1762a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1763a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->revResampler, 1764a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1765a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1766a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1767a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1768a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1769a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1770a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->revResampler, 1771a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1772a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1773a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1774a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1775a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1776a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf, 1777a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf + frIn * session->inChannelCount, 1778a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesRev - frIn) * session->inChannelCount * sizeof(int16_t)); 1779a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev -= frIn; 1780a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1781a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1782a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1783a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1784a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1785a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revFrame->_payloadData + session->framesRev * session->inChannelCount, 1786a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1787a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1788a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1789a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1790a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1791a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1792a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1793a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 1794a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1795a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadDataLengthInSamples = 1796a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1797a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->AnalyzeReverseStream(session->revFrame); 1798a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1799a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1800a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1801a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1802a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1803a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1804a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1805a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// effect_handle_t interface implementation for effect 1806a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterface = { 1807a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1808a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1809a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1810a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 1811a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1812a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1813a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterfaceReverse = { 1814a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1815a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1816a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1817a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_ProcessReverse 1818a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1819a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1820a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1821a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Library Interface Implementation 1822a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1823a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18245e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint PreProcessingLib_Create(const effect_uuid_t *uuid, 1825a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t sessionId, 1826a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t ioId, 1827a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *pInterface) 1828a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 18293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate: uuid: %08x session %d IO: %d", uuid->timeLow, sessionId, ioId); 1830a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1831a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1832a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc; 1833a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session; 1834a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t procId; 1835a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1836a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1837a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1838a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1839a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent desc = PreProc_GetDescriptor(uuid); 1840a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 18415ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate: fx not found uuid: %08x", uuid->timeLow); 1842a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1843a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1844a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId = UuidToProcId(&desc->type); 1845a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1846a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session = PreProc_GetSession(procId, sessionId, ioId); 1847a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session == NULL) { 18485ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate: no more session available"); 1849a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1850a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1851a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1852a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_CreateEffect(session, procId, pInterface); 1853a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1854a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0 && session->createdMsk == 0) { 1855a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 1856a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1857a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 1858a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1859a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1860a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_Release(effect_handle_t interface) 1861a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1862a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 18633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectRelease start %p", interface); 1864a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1865a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1866a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1867a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1868a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx = (preproc_effect_t *)interface; 1869a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1870a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (fx->session->io == 0) { 1871a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1872a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1873a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Session_ReleaseEffect(fx->session, fx); 1874a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1875a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18765e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint PreProcessingLib_GetDescriptor(const effect_uuid_t *uuid, 1877a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) { 1878a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1879a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 1880a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1881a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1882a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1883a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc = PreProc_GetDescriptor(uuid); 1884a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 18853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() not found"); 1886a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1887a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1888a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() got fx %s", desc->name); 1890a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1891a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *desc; 1892a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1893a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1894a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 18957f16b197c76fbae9399242f055a7ee16dcd0fd6dMarco Nelissen// This is the only symbol that needs to be exported 18967f16b197c76fbae9399242f055a7ee16dcd0fd6dMarco Nelissen__attribute__ ((visibility ("default"))) 1897a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 1898c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .tag = AUDIO_EFFECT_LIBRARY_TAG, 1899c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .version = EFFECT_LIBRARY_API_VERSION, 1900c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .name = "Audio Preprocessing Library", 1901c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .implementor = "The Android Open Source Project", 1902c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .create_effect = PreProcessingLib_Create, 1903c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .release_effect = PreProcessingLib_Release, 1904c9d8ea7f8f9a1ca8ecd266695e3cac423790b2f9synergydev .get_descriptor = PreProcessingLib_GetDescriptor 1905a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1906a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1907a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; // extern "C" 1908