PreProcessing.cpp revision 3856b090cd04ba5dd4a59a12430ed724d5995909
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> 27a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include "modules/interface/module_common_types.h" 28a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include "modules/audio_processing/main/interface/audio_processing.h" 29a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#include "speex/speex_resampler.h" 30a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 31a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 32a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 33a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// local definitions 34a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 35a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 36a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// maximum number of sessions 37a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define PREPROC_NUM_SESSIONS 8 38a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 39a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// types of pre processing modules 40a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_id 41a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 42a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_AGC, // Automatic Gain Control 43a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_AEC, // Acoustic Echo Canceler 44a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_NS, // Noise Suppressor 45a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_NUM_EFFECTS 46a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 47a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 48a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session state 49a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_session_state { 50a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_SESSION_STATE_INIT, // initialized 51a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_SESSION_STATE_CONFIG // configuration received 52a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 53a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 54a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect/Preprocessor state 55a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentenum preproc_effect_state { 56a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_INIT, // initialized 57a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_CREATED, // webRTC engine created 58a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_CONFIG, // configuration received/disabled 59a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PREPROC_EFFECT_STATE_ACTIVE // active/enabled 60a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 61a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 62a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// handle on webRTC engine 63a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef void* preproc_fx_handle_t; 64a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 65a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_session_s preproc_session_t; 66a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_effect_s preproc_effect_t; 67a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenttypedef struct preproc_ops_s preproc_ops_t; 68a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 69a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect operation table. Functions for all pre processors are declared in sPreProcOps[] table. 70a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Function pointer can be null if no action required. 71a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_ops_s { 72a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* create)(preproc_effect_t *fx); 73a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* init)(preproc_effect_t *fx); 74a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* reset)(preproc_effect_t *fx); 75a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void (* enable)(preproc_effect_t *fx); 76a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void (* disable)(preproc_effect_t *fx); 77a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* set_parameter)(preproc_effect_t *fx, void *param, void *value); 78a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* get_parameter)(preproc_effect_t *fx, void *param, size_t *size, void *value); 79a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int (* set_device)(preproc_effect_t *fx, uint32_t device); 80a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 81a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 82a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect context 83a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_effect_s { 84a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const struct effect_interface_s *itfe; 85a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t procId; // type of pre processor (enum preproc_id) 86a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t state; // current state (enum preproc_effect_state) 87a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session; // session the effect is on 88a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const preproc_ops_t *ops; // effect ops table 89a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_fx_handle_t engine; // handle on webRTC engine 90a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 91a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 92a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session context 93a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstruct preproc_session_s { 94a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent struct preproc_effect_s effects[PREPROC_NUM_EFFECTS]; // effects in this session 95a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t state; // current state (enum preproc_session_state) 96a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int id; // audio session ID 97a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int io; // handle of input stream this session is on 98a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing* apm; // handle on webRTC audio processing module (APM) 99a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t apmFrameCount; // buffer size for webRTC process (10 ms) 100a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t apmSamplingRate; // webRTC APM sampling rate (8/16 or 32 kHz) 101a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frameCount; // buffer size before input resampler ( <=> apmFrameCount) 102a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t samplingRate; // sampling rate at effect process interface 103a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inChannelCount; // input channel count 104a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t outChannelCount; // output channel count 105a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t createdMsk; // bit field containing IDs of crested pre processors 106a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t enabledMsk; // bit field containing IDs of enabled pre processors 107a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t processedMsk; // bit field containing IDs of pre processors already 108a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // processed in current round 109a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioFrame *procFrame; // audio frame passed to webRTC AMP ProcessStream() 110a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *inBuf; // input buffer used when resampling 111a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t inBufSize; // input buffer size in frames 112a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesIn; // number of frames in input buffer 113a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *inResampler; // handle on input speex resampler 114a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *outBuf; // output buffer used when resampling 115a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t outBufSize; // output buffer size in frames 116a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesOut; // number of frames in output buffer 117a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *outResampler; // handle on output speex resampler 118a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revChannelCount; // number of channels on reverse stream 119a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revEnabledMsk; // bit field containing IDs of enabled pre processors 120a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // with reverse channel 121a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t revProcessedMsk; // bit field containing IDs of pre processors with reverse 122a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // channel already processed in current round 123a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioFrame *revFrame; // audio frame passed to webRTC AMP AnalyzeReverseStream() 124a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int16_t *revBuf; // reverse channel input buffer 125a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t revBufSize; // reverse channel input buffer size 126a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesRev; // number of frames in reverse channel input buffer 127a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent SpeexResamplerState *revResampler; // handle on reverse channel input speex resampler 128a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 129a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 130a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 131a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect descriptors 132a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 133a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 134a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// UUIDs for effect types have been generated from http://www.itu.int/ITU-T/asn1/uuid.html 135a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// as the pre processing effects are not defined by OpenSL ES 136a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 137a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Automatic Gain Control 138a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sAgcDescriptor = { 139a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x0a8abfe0, 0x654c, 0x11e0, 0xba26, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 140a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xaa8130e0, 0x66fc, 0x11e0, 0xbad0, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 141a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 142a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 143a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 144a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 145a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Automatic Gain Control", 146a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 147a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 148a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 149a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Acoustic Echo Cancellation 150a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sAecDescriptor = { 151a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x7b491460, 0x8d4d, 0x11e0, 0xbd61, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 152a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xbb392ec0, 0x8d4d, 0x11e0, 0xa896, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 153a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 154a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 155a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 156a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 157a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Acoustic Echo Canceler", 158a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 159a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 160a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 161a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Noise suppression 162a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t sNsDescriptor = { 163a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0x58b4b260, 0x8e06, 0x11e0, 0xaa8e, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type 164a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent { 0xc06c8400, 0x8e06, 0x11e0, 0x9cb6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // uuid 165a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent EFFECT_CONTROL_API_VERSION, 166a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (EFFECT_FLAG_TYPE_PRE_PROC|EFFECT_FLAG_DEVICE_IND), 167a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate CPU load 168a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, //FIXME indicate memory usage 169a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "Noise Suppression", 170a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "The Android Open Source Project" 171a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 172a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 173a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 174a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const effect_descriptor_t *sDescriptors[PREPROC_NUM_EFFECTS] = { 175a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAgcDescriptor, 176a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAecDescriptor, 177a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sNsDescriptor 178a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 179a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 180a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 181a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Helper functions 182a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 183a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 184a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst effect_uuid_t * const sUuidToPreProcTable[PREPROC_NUM_EFFECTS] = { 185a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_AGC, 186a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_AEC, 187a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent FX_IID_NS 188a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 189a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 190a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 191a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst effect_uuid_t * ProcIdToUuid(int procId) 192a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 193a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (procId >= PREPROC_NUM_EFFECTS) { 194a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return EFFECT_UUID_NULL; 195a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 196a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sUuidToPreProcTable[procId]; 197a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 198a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 199a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentuint32_t UuidToProcId(const effect_uuid_t * uuid) 200a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 201a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 202a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS; i++) { 203a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (memcmp(uuid, sUuidToPreProcTable[i], sizeof(*uuid)) == 0) { 204a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 205a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 206a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 207a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return i; 208a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 209a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 210a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentbool HasReverseStream(uint32_t procId) 211a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 212a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (procId == PREPROC_AEC) { 213a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return true; 214a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 215a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return false; 216a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 217a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 218a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 219a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 220a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Automatic Gain Control (AGC) 221a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 222a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 223a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kAgcDefaultTargetLevel = 0; 224a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kAgcDefaultCompGain = 90; 225a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const bool kAgcDefaultLimiter = true; 226a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 227a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcInit (preproc_effect_t *effect) 228a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 2293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcInit"); 230a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 231a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_mode(webrtc::GainControl::kFixedDigital); 232a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_target_level_dbfs(kAgcDefaultTargetLevel); 233a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->set_compression_gain_db(kAgcDefaultCompGain); 234a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->enable_limiter(kAgcDefaultLimiter); 235a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 236a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 237a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 238a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcCreate(preproc_effect_t *effect) 239a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 240a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = effect->session->apm->gain_control(); 2413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcCreate got agc %p", agc); 242a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (agc == NULL) { 243a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcCreate Error"); 244a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 245a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 246a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(agc); 247a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcInit(effect); 248a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 249a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 250a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 251a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcGetParameter(preproc_effect_t *effect, 252a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 253a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 254a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 255a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 256a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 257a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 258a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent t_agc_settings *pProperties = (t_agc_settings *)pValue; 259a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 260a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 261a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 262a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 263a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 264a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(int16_t)) { 265a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 266a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 267a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 268a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 269a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 270a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(bool)) { 271a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 272a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 273a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 274a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 275a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 276a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(t_agc_settings)) { 277a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pValueSize = 0; 278a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 279a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 280a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 281a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 282a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 283a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcGetParameter() unknown param %08x", param); 284a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 285a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 286a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 287a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 288a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 289a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 290a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int16_t *) pValue = (int16_t)(agc->target_level_dbfs() * -100); 2913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() target level %d milliBels", *(int16_t *) pValue); 292a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 293a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 294a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int16_t *) pValue = (int16_t)(agc->compression_gain_db() * 100); 2953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() comp gain %d milliBels", *(int16_t *) pValue); 296a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 297a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 298a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(bool *) pValue = (bool)agc->is_limiter_enabled(); 2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcGetParameter() limiter enabled %s", 300a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (*(int16_t *) pValue != 0) ? "true" : "false"); 301a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 302a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 303a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->targetLevel = (int16_t)(agc->target_level_dbfs() * -100); 304a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->compGain = (int16_t)(agc->compression_gain_db() * 100); 305a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->limiterEnabled = (bool)agc->is_limiter_enabled(); 306a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 307a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 308a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcGetParameter() unknown param %d", param); 309a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 310a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 311a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 312a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 313a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 314a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 315a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AgcSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 316a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 317a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 318a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 319a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent t_agc_settings *pProperties = (t_agc_settings *)pValue; 320a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 321a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 322a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 323a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_TARGET_LEVEL: 3243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() target level %d milliBels", *(int16_t *)pValue); 325a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_target_level_dbfs(-(*(int16_t *)pValue / 100)); 326a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 327a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_COMP_GAIN: 3283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() comp gain %d milliBels", *(int16_t *)pValue); 329a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_compression_gain_db(*(int16_t *)pValue / 100); 330a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 331a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_LIMITER_ENA: 3323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() limiter enabled %s", *(bool *)pValue ? "true" : "false"); 333a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->enable_limiter(*(bool *)pValue); 334a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 335a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AGC_PARAM_PROPERTIES: 3363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() properties level %d, gain %d limiter %d", 337a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->targetLevel, 338a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->compGain, 339a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pProperties->limiterEnabled); 340a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_target_level_dbfs(-(pProperties->targetLevel / 100)); 341a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status != 0) break; 342a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->set_compression_gain_db(pProperties->compGain / 100); 343a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status != 0) break; 344a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = agc->enable_limiter(pProperties->limiterEnabled); 345a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 346a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 347a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 348a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 349a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 350a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 351a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 3523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcSetParameter() done status %d", status); 353a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 354a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 355a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 356a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 357a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AgcEnable(preproc_effect_t *effect) 358a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 359a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 3603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcEnable agc %p", agc); 361a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->Enable(true); 362a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 363a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 364a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AgcDisable(preproc_effect_t *effect) 365a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 3663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AgcDisable"); 367a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::GainControl *agc = static_cast<webrtc::GainControl *>(effect->engine); 368a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent agc->Enable(false); 369a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 370a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 371a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 372a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sAgcOps = { 373a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcCreate, 374a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcInit, 375a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 376a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcEnable, 377a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcDisable, 378a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcSetParameter, 379a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AgcGetParameter, 380a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 381a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 382a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 383a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 384a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 385a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Acoustic Echo Canceler (AEC) 386a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 387a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 388a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const webrtc::EchoControlMobile::RoutingMode kAecDefaultMode = 389a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile::kEarpiece; 390a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const bool kAecDefaultComfortNoise = true; 391a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 392a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecInit (preproc_effect_t *effect) 393a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecInit"); 395a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 396a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->set_routing_mode(kAecDefaultMode); 397a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->enable_comfort_noise(kAecDefaultComfortNoise); 398a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 399a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 400a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 401a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecCreate(preproc_effect_t *effect) 402a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 403a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = effect->session->apm->echo_control_mobile(); 4043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecCreate got aec %p", aec); 405a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (aec == NULL) { 406a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcCreate Error"); 407a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 408a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 409a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(aec); 410a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecInit (effect); 411a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 412a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 413a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 414a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecGetParameter(preproc_effect_t *effect, 415a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 416a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 417a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 418a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 419a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 420a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 421a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 422a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*pValueSize < sizeof(uint32_t)) { 423a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 424a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 425a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 426a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_ECHO_DELAY: 427a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_PROPERTIES: 428a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(uint32_t *)pValue = 1000 * effect->session->apm->stream_delay_ms(); 4293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecGetParameter() echo delay %d us", *(uint32_t *)pValue); 430a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 431a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 432a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AecGetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 433a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 434a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 435a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 436a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 437a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 438a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 439a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 440a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 441a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 442a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t param = *(uint32_t *)pParam; 443a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t value = *(uint32_t *)pValue; 444a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 445a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (param) { 446a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_ECHO_DELAY: 447a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AEC_PARAM_PROPERTIES: 448a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = effect->session->apm->set_stream_delay_ms(value/1000); 4493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecSetParameter() echo delay %d us, status %d", value, status); 450a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 451a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 452a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AecSetParameter() unknown param %08x value %08x", param, *(uint32_t *)pValue); 453a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -EINVAL; 454a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 455a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 457a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 458a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 459a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AecEnable(preproc_effect_t *effect) 460a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 461a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 4623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecEnable aec %p", aec); 463a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->Enable(true); 464a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 465a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 466a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid AecDisable(preproc_effect_t *effect) 467a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 4683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecDisable"); 469a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 470a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->Enable(false); 471a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 472a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 473a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint AecSetDevice(preproc_effect_t *effect, uint32_t device) 474a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("AecSetDevice %08x", device); 476a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile *aec = static_cast<webrtc::EchoControlMobile *>(effect->engine); 477a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::EchoControlMobile::RoutingMode mode = webrtc::EchoControlMobile::kQuietEarpieceOrHeadset; 478a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 479a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(device) { 480a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_EARPIECE: 481a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent mode = webrtc::EchoControlMobile::kEarpiece; 482a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 483a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_SPEAKER: 484a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent mode = webrtc::EchoControlMobile::kSpeakerphone; 485a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 486a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_WIRED_HEADSET: 487a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: 488a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 489a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 490a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 491a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent aec->set_routing_mode(mode); 492a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 493a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 494a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 495a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sAecOps = { 496a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecCreate, 497a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecInit, 498a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 499a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecEnable, 500a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecDisable, 501a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecSetParameter, 502a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecGetParameter, 503a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent AecSetDevice 504a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 505a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 506a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 507a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Noise Suppression (NS) 508a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 509a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 510a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const webrtc::NoiseSuppression::Level kNsDefaultLevel = webrtc::NoiseSuppression::kModerate; 511a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 512a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsInit (preproc_effect_t *effect) 513a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 5143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsInit"); 515a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 516a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->set_level(kNsDefaultLevel); 517a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 518a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 519a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 520a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsCreate(preproc_effect_t *effect) 521a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 522a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = effect->session->apm->noise_suppression(); 5233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsCreate got ns %p", ns); 524a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (ns == NULL) { 525a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("AgcCreate Error"); 526a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOMEM; 527a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 528a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->engine = static_cast<preproc_fx_handle_t>(ns); 529a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsInit (effect); 530a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 531a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 532a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 533a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsGetParameter(preproc_effect_t *effect, 534a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pParam, 535a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t *pValueSize, 536a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pValue) 537a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 538a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 539a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 540a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 541a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 542a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint NsSetParameter (preproc_effect_t *effect, void *pParam, void *pValue) 543a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 544a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 545a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 546a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 547a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 548a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsEnable(preproc_effect_t *effect) 549a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 550a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 5513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsEnable ns %p", ns); 552a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(true); 553a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 554a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 555a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid NsDisable(preproc_effect_t *effect) 556a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 5573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("NsDisable"); 558a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::NoiseSuppression *ns = static_cast<webrtc::NoiseSuppression *>(effect->engine); 559a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent ns->Enable(false); 560a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 561a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 562a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t sNsOps = { 563a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsCreate, 564a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsInit, 565a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL, 566a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsEnable, 567a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsDisable, 568a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsSetParameter, 569a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NsGetParameter, 570a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 571a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 572a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 573a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 574a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const preproc_ops_t *sPreProcOps[PREPROC_NUM_EFFECTS] = { 575a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAgcOps, 576a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sAecOps, 577a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &sNsOps 578a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 579a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 580a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 581a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 582a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect functions 583a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 584a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 585a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled); 586a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 587a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterface; 588a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" const struct effect_interface_s sEffectInterfaceReverse; 589a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 590a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define BAD_STATE_ABORT(from, to) \ 591a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOG_ALWAYS_FATAL("Bad state transition from %d to %d", from, to); 592a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 593a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_SetState(preproc_effect_t *effect, uint32_t state) 594a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 595a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 5963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Effect_SetState proc %d, new %d old %d", effect->procId, state, effect->state); 597a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(state) { 598a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 599a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 600a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 601a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 602a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 603a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 604a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 605a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 606a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 607a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 608a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 609a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 610a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 611a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 612a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 613a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 614a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = effect->ops->create(effect); 615a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 616a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 617a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 618a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 619a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGE("Effect_SetState invalid transition"); 620a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 621a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 622a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 623a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 624a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 625a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 626a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 627a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 628a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 629a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGE("Effect_SetState invalid transition"); 630a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 631a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 632a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 633a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->disable(effect); 634a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, false); 635a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 636a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 637a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 638a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 639a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 640a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 641a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 642a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 643a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 644a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch(effect->state) { 645a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_INIT: 646a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CREATED: 647a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_ACTIVE: 648a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGE("Effect_SetState invalid transition"); 649a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = -ENOSYS; 650a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 651a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case PREPROC_EFFECT_STATE_CONFIG: 652a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->enable(effect); 653a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent Session_SetProcEnabled(effect->session, effect->procId, true); 654a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 655a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 656a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 657a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 658a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 659a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 660a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent BAD_STATE_ABORT(effect->state, state); 661a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 662a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status == 0) { 663a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = state; 664a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 665a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 666a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 667a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 668a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Init(preproc_effect_t *effect, uint32_t procId) 669a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 670a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 671a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterfaceReverse; 672a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 673a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->itfe = &sEffectInterface; 674a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 675a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops = sPreProcOps[procId]; 676a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->procId = procId; 677a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->state = PREPROC_EFFECT_STATE_INIT; 678a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 679a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 680a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 681a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Create(preproc_effect_t *effect, 682a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session, 683a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 684a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 685a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session = session; 686a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *interface = (effect_handle_t)&effect->itfe; 687a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_CREATED); 688a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 689a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 690a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Effect_Release(preproc_effect_t *effect) 691a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 692a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Effect_SetState(effect, PREPROC_EFFECT_STATE_INIT); 693a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 694a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 695a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 696a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 697a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Session functions 698a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 699a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 700a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent#define RESAMPLER_QUALITY SPEEX_RESAMPLER_QUALITY_VOIP 701a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 702a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreprocDefaultSr = 16000; 703a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic const int kPreProcDefaultCnl = 1; 704a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 705a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_Init(preproc_session_t *session) 706a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 707a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 708a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 709a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 710a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_INIT; 711a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->id = 0; 712a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 713a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk = 0; 714a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 715a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS && status == 0; i++) { 716a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Init(&session->effects[i], i); 717a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 718a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 719a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 720a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 721a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 722a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" int Session_CreateEffect(preproc_session_t *session, 723a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t procId, 724a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *interface) 725a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 726a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = -ENOMEM; 727a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 7283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect procId %d, createdMsk %08x", procId, session->createdMsk); 729a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 730a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 731a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = webrtc::AudioProcessing::Create(session->io); 732a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->apm == NULL) { 733a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_CreateEffect could not get apm engine"); 734a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 735a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 736a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_sample_rate_hz(kPreprocDefaultSr); 737a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_channels(kPreProcDefaultCnl, kPreProcDefaultCnl); 738a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm->set_num_reverse_channels(kPreProcDefaultCnl); 739a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = new webrtc::AudioFrame(); 740a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->procFrame == NULL) { 741a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_CreateEffect could not allocate audio frame"); 742a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 743a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 744a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = new webrtc::AudioFrame(); 745a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revFrame == NULL) { 746a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_CreateEffect could not allocate reverse audio frame"); 747a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 748a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 749a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = kPreprocDefaultSr; 750a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = (kPreprocDefaultSr) / 100; 751a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 752a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = kPreprocDefaultSr; 753a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = kPreProcDefaultCnl; 754a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = kPreProcDefaultCnl; 755a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = kPreprocDefaultSr; 756a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = kPreProcDefaultCnl; 757a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = kPreProcDefaultCnl; 758a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = kPreprocDefaultSr; 759a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = kPreProcDefaultCnl; 760a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk = 0; 761a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 762a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk = 0; 763a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 764a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 765a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 766a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = 0; 767a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 768a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 769a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = 0; 770a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 771a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 772a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = 0; 773a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 774a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Effect_Create(&session->effects[procId], session, interface); 775a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 776a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent goto error; 777a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 7783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_CreateEffect OK"); 779a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk |= (1<<procId); 780a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 781a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 782a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurenterror: 783a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 784a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 785a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 786a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 787a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 788a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 789a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 790a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 791a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 792a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 793a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 794a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_ReleaseEffect(preproc_session_t *session, 795a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx) 796a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 797a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW_IF(Effect_Release(fx) != 0, " Effect_Release() failed for proc ID %d", fx->procId); 798a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->createdMsk &= ~(1<<fx->procId); 799a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->createdMsk == 0) { 800a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent webrtc::AudioProcessing::Destroy(session->apm); 801a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apm = NULL; 802a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->procFrame; 803a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame = NULL; 804a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revFrame; 805a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame = NULL; 806a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 807a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 808a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 809a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 810a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 811a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 812a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 813a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 814a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 815a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 816a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 817a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 818a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->inBuf; 819a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = NULL; 820a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->outBuf; 821a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = NULL; 822a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent delete session->revBuf; 823a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = NULL; 824a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 825a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 826a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 827a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 828a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 829a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 830a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 831a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 832a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetConfig(preproc_session_t *session, effect_config_t *config) 833a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 834a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t sr; 835a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inCnl = popcount(config->inputCfg.channels); 836a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t outCnl = popcount(config->outputCfg.channels); 837a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 838a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 839a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 840a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 841a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 842a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 843a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 8443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetConfig sr %d cnl %08x", 845a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 846a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 847a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 848a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent // AEC implementation is limited to 16kHz 849a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 32000 && !(session->createdMsk & (1 << PREPROC_AEC))) { 850a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 32000; 851a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else 852a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate >= 16000) { 853a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 16000; 854a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else if (config->inputCfg.samplingRate >= 8000) { 855a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate = 8000; 856a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 857a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_sample_rate_hz(session->apmSamplingRate); 858a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 859a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 860a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 861a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_channels(inCnl, outCnl); 862a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 863a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 864a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 865a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = session->apm->set_num_reverse_channels(inCnl); 866a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 867a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 868a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 869a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 870a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate = config->inputCfg.samplingRate; 871a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount = session->apmSamplingRate / 100; 872a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate == session->apmSamplingRate) { 873a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = session->apmFrameCount; 874a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 875a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount = (session->apmFrameCount * session->samplingRate) / 876a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate + 1; 877a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 878a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inChannelCount = inCnl; 879a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outChannelCount = outCnl; 880a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_audioChannel = inCnl; 881a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_frequencyInHz = session->apmSamplingRate; 882a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 883a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 884a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 885a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 886a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 887a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 888a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 889a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 890a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 891a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 892a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 893a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 894a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 895a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 896a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->revResampler); 897a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = NULL; 898a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 899a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->samplingRate != session->apmSamplingRate) { 900a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int error; 901a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = speex_resampler_init(session->inChannelCount, 902a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 903a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 904a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 905a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 906a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler == NULL) { 907a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_SetConfig Cannot create speex resampler: %s", 908a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 909a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 910a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 911a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = speex_resampler_init(session->outChannelCount, 912a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 913a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 914a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 915a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 916a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler == NULL) { 917a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_SetConfig Cannot create speex resampler: %s", 918a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 919a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 920a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 921a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 922a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 923a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revResampler = speex_resampler_init(session->inChannelCount, 924a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->samplingRate, 925a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmSamplingRate, 926a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent RESAMPLER_QUALITY, 927a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &error); 928a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler == NULL) { 929a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("Session_SetConfig Cannot create speex resampler: %s", 930a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_strerror(error)); 931a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->inResampler); 932a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inResampler = NULL; 933a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_destroy(session->outResampler); 934a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outResampler = NULL; 935a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 936a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 937a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 938a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 939a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->state = PREPROC_SESSION_STATE_CONFIG; 940a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 941a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 942a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 943a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint Session_SetReverseConfig(preproc_session_t *session, effect_config_t *config) 944a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 945a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != config->outputCfg.samplingRate || 946a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != config->outputCfg.format || 947a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 948a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 949a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 950a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 9513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetReverseConfig sr %d cnl %08x", 952a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.samplingRate, config->inputCfg.channels); 953a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 954a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->state < PREPROC_SESSION_STATE_CONFIG) { 955a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENOSYS; 956a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 957a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (config->inputCfg.samplingRate != session->samplingRate || 958a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent config->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) { 959a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 960a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 961a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t inCnl = popcount(config->inputCfg.channels); 962a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = session->apm->set_num_reverse_channels(inCnl); 963a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0) { 964a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 965a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 966a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revChannelCount = inCnl; 967a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_audioChannel = inCnl; 968a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_frequencyInHz = session->apmSamplingRate; 969a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 970a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 971a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 972a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentvoid Session_SetProcEnabled(preproc_session_t *session, uint32_t procId, bool enabled) 973a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 974a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (enabled) { 975a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if(session->enabledMsk == 0) { 976a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 977a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 978a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->inResampler); 979a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 980a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut = 0; 981a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 982a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->outResampler); 983a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 984a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 985a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk |= (1 << procId); 986a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 987a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 988a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 989a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_reset_mem(session->revResampler); 990a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 991a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk |= (1 << procId); 992a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 993a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 994a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->enabledMsk &= ~(1 << procId); 995a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 996a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revEnabledMsk &= ~(1 << procId); 997a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 998a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 9993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Session_SetProcEnabled proc %d, enabled %d enabledMsk %08x revEnabledMsk %08x", 1000a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId, enabled, session->enabledMsk, session->revEnabledMsk); 1001a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk = 0; 1002a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (HasReverseStream(procId)) { 1003a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk = 0; 1004a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1005a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1006a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1007a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1008a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Bundle functions 1009a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1010a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1011a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic int sInitStatus = 1; 1012a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentstatic preproc_session_t sSessions[PREPROC_NUM_SESSIONS]; 1013a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1014a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentpreproc_session_t *PreProc_GetSession(int32_t procId, int32_t sessionId, int32_t ioId) 1015a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1016a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1017a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int free = -1; 1018a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1019a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == ioId) { 1020a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].createdMsk & (1 << procId)) { 1021a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1022a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1023a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1024a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1025a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1026a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS; i++) { 1027a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sSessions[i].io == 0) { 1028a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].id = sessionId; 1029a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sSessions[i].io = ioId; 1030a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return &sSessions[i]; 1031a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1032a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1033a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1034a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1035a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1036a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1037a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProc_Init() { 1038a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1039a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1040a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1041a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (sInitStatus <= 0) { 1042a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1043a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1044a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_SESSIONS && status == 0; i++) { 1045a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_Init(&sSessions[i]); 1046a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1047a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent sInitStatus = status; 1048a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1049a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1050a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1051a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst effect_descriptor_t *PreProc_GetDescriptor(effect_uuid_t *uuid) 1052a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1053a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t i; 1054a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent for (i = 0; i < PREPROC_NUM_EFFECTS; i++) { 1055a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (memcmp(&sDescriptors[i]->uuid, uuid, sizeof(effect_uuid_t)) == 0) { 1056a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sDescriptors[i]; 1057a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1058a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1059a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return NULL; 1060a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1061a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1062a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1063a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentextern "C" { 1064a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1065a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1066a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Control Interface Implementation 1067a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1068a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1069a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Process(effect_handle_t self, 1070a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 1071a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *outBuffer) 1072a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1073a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1074a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1075a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1076a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 10773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Process() ERROR effect == NULL"); 1078a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1079a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1080a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1081a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1082a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 1083a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer == NULL || outBuffer->raw == NULL){ 1084a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("PreProcessingFx_Process() ERROR bad pointer"); 1085a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1086a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1087a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1088a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->processedMsk |= (1<<effect->procId); 1089a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 10903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_Process In %d frames enabledMsk %08x processedMsk %08x", 1091a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->enabledMsk, session->processedMsk); 1092a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1093a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->processedMsk & session->enabledMsk) == session->enabledMsk) { 1094a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->processedMsk = 0; 1095a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesRq = outBuffer->frameCount; 1096a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t framesWr = 0; 1097a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesOut) { 1098a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1099a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (outBuffer->frameCount < fr) { 1100a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = outBuffer->frameCount; 1101a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1102a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16, 1103a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1104a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1105a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1106a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1107a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1108a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1109a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent framesWr += fr; 1110a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1111a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount = framesWr; 1112a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesWr == framesRq) { 1113a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = 0; 1114a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1115a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1116a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1117a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inResampler != NULL) { 1118a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1119a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1120a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1121a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1122a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inBufSize < session->framesIn + fr) { 1123a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize = session->framesIn + fr; 1124a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf = (int16_t *)realloc(session->inBuf, 1125a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBufSize * session->inChannelCount * sizeof(int16_t)); 1126a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1127a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf + session->framesIn * session->inChannelCount, 1128a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1129a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1130a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1131a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1132a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1133a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1134a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1135a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1136a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->framesIn; 1137a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->apmFrameCount; 1138a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1139a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->inResampler, 1140a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1141a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1142a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1143a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1144a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1145a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1146a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->inResampler, 1147a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf, 1148a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1149a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1150a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1151a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1152a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->inBuf, 1153a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->inBuf + frIn * session->inChannelCount, 1154a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesIn - frIn) * session->inChannelCount * sizeof(int16_t)); 1155a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn -= frIn; 1156a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1157a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesIn; 1158a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1159a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1160a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1161a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->procFrame->_payloadData + session->framesIn * session->inChannelCount, 1162a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1163a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1164a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn += fr; 1165a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1166a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesIn < session->frameCount) { 1167a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1168a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1169a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesIn = 0; 1170a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1171a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadDataLengthInSamples = 1172a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1173a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1174a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->ProcessStream(session->procFrame); 1175a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1176a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outBufSize < session->framesOut + session->frameCount) { 1177a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize = session->framesOut + session->frameCount; 1178a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf = (int16_t *)realloc(session->outBuf, 1179a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBufSize * session->outChannelCount * sizeof(int16_t)); 1180a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1181a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1182a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->outResampler != NULL) { 1183a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->apmFrameCount; 1184a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->frameCount; 1185a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1186a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->outResampler, 1187a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1188a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1189a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1190a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1191a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1192a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1193a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->outResampler, 1194a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1195a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1196a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + session->framesOut * session->outChannelCount, 1197a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1198a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1199a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += frOut; 1200a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1201a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf + session->framesOut * session->outChannelCount, 1202a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->procFrame->_payloadData, 1203a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->frameCount * session->outChannelCount * sizeof(int16_t)); 1204a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut += session->frameCount; 1205a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1206a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->framesOut; 1207a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (framesRq - framesWr < fr) { 1208a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = framesRq - framesWr; 1209a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1210a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(outBuffer->s16 + framesWr * session->outChannelCount, 1211a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf, 1212a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->outChannelCount * sizeof(int16_t)); 1213a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->outBuf, 1214a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->outBuf + fr * session->outChannelCount, 1215a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesOut - fr) * session->outChannelCount * sizeof(int16_t)); 1216a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesOut -= fr; 1217a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent outBuffer->frameCount += fr; 1218a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1219a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1220a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1221a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1222a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1223a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1224a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1225a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_Command(effect_handle_t self, 1226a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdCode, 1227a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t cmdSize, 1228a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pCmdData, 1229a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t *replySize, 1230a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent void *pReplyData) 1231a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1232a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1233a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int retsize; 1234a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1235a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1236a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 1237a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1238a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1239a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 12403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block //ALOGV("PreProcessingFx_Command: command %d cmdSize %d",cmdCode, cmdSize); 1241a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1242a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent switch (cmdCode){ 1243a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_INIT: 1244a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 1245a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1246a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1247a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->init) { 1248a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->init(effect); 1249a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1250a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = 0; 1251a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1252a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1253a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_CONFIGURE: 1254a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1255a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(effect_config_t)|| 1256a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL|| 1257a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int)){ 12583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1259a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_CONFIGURE: ERROR"); 1260a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1261a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1262a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetConfig(effect->session, (effect_config_t *)pCmdData); 1263a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1264a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1265a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1266a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 1267a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1268a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1269a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_CONFIGURE_REVERSE: 1270a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1271a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(effect_config_t)|| 1272a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL|| 1273a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int)){ 12743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1275a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_CONFIGURE_REVERSE: ERROR"); 1276a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1277a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1278a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Session_SetReverseConfig(effect->session, 1279a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (effect_config_t *)pCmdData); 1280a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (*(int *)pReplyData != 0) { 1281a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1282a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1283a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1284a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1285a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_RESET: 1286a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->reset) { 1287a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->reset(effect); 1288a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1289a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1290a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1291a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_GET_PARAM:{ 1292a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL || 1293a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize < (int)sizeof(effect_param_t) || 1294a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL || 1295a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize < (int)sizeof(effect_param_t)){ 12963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1297a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_GET_PARAM: ERROR"); 1298a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1299a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1300a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 1301a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1302a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 1303a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1304a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p = (effect_param_t *)pReplyData; 1305a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1306a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 1307a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1308a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->get_parameter) { 1309a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->status = effect->ops->get_parameter(effect, p->data, 1310a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (size_t *)&p->vsize, 1311a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + voffset); 1312a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 1313a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1314a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1315a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1316a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_PARAM:{ 1317a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL|| 1318a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize < (int)sizeof(effect_param_t) || 1319a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent pReplyData == NULL || 1320a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *replySize != sizeof(int32_t)){ 13213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1322a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR"); 1323a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1324a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1325a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 1326a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1327a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (p->psize != sizeof(int32_t)){ 13283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: " 1329a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 1330a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1331a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1332a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_parameter) { 1333a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = effect->ops->set_parameter(effect, 1334a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (void *)p->data, 1335a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent p->data + p->psize); 1336a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1337a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } break; 1338a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1339a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_ENABLE: 1340a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 13413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_ENABLE: ERROR"); 1342a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1343a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1344a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_ACTIVE); 1345a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1346a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1347a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_DISABLE: 1348a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)){ 13493856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_DISABLE: ERROR"); 1350a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1351a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1352a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *(int *)pReplyData = Effect_SetState(effect, PREPROC_EFFECT_STATE_CONFIG); 1353a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1354a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1355a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_DEVICE: 1356a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_INPUT_DEVICE: 1357a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pCmdData == NULL || 1358a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent cmdSize != sizeof(uint32_t)) { 13593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingFx_Command cmdCode Case: EFFECT_CMD_SET_DEVICE: ERROR"); 1360a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1361a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1362a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1363a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect->ops->set_device) { 1364a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->ops->set_device(effect, *(uint32_t *)pCmdData); 1365a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1366a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1367a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1368a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_VOLUME: 1369a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 1370a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent break; 1371a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1372a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent default: 1373a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1374a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1375a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1376a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1377a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1378a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1379a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_GetDescriptor(effect_handle_t self, 1380a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) 1381a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1382a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *) self; 1383a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1384a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL || pDescriptor == NULL) { 1385a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1386a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1387a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1388a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pDescriptor, sDescriptors[effect->procId], sizeof(effect_descriptor_t)); 1389a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1390a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1391a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1392a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1393a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingFx_ProcessReverse(effect_handle_t self, 1394a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *inBuffer, 1395a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent audio_buffer_t *outBuffer) 1396a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1397a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t * effect = (preproc_effect_t *)self; 1398a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status = 0; 1399a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1400a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (effect == NULL){ 1401a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("PreProcessingFx_ProcessReverse() ERROR effect == NULL"); 1402a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1403a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1404a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t * session = (preproc_session_t *)effect->session; 1405a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1406a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL){ 1407a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("PreProcessingFx_ProcessReverse() ERROR bad pointer"); 1408a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1409a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1410a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1411a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revProcessedMsk |= (1<<effect->procId); 1412a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 14133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block// ALOGV("PreProcessingFx_ProcessReverse In %d frames revEnabledMsk %08x revProcessedMsk %08x", 1414a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// inBuffer->frameCount, session->revEnabledMsk, session->revProcessedMsk); 1415a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1416a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1417a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if ((session->revProcessedMsk & session->revEnabledMsk) == session->revEnabledMsk) { 1418a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->revProcessedMsk = 0; 1419a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revResampler != NULL) { 1420a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1421a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1422a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1423a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1424a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->revBufSize < session->framesRev + fr) { 1425a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize = session->framesRev + fr; 1426a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf = (int16_t *)realloc(session->revBuf, 1427a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBufSize * session->inChannelCount * sizeof(int16_t)); 1428a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1429a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf + session->framesRev * session->inChannelCount, 1430a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1431a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1432a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1433a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1434a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1435a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1436a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1437a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1438a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frIn = session->framesRev; 1439a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t frOut = session->apmFrameCount; 1440a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->inChannelCount == 1) { 1441a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_int(session->revResampler, 1442a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 0, 1443a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1444a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1445a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1446a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1447a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1448a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent speex_resampler_process_interleaved_int(session->revResampler, 1449a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf, 1450a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frIn, 1451a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadData, 1452a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent &frOut); 1453a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1454a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revBuf, 1455a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revBuf + frIn * session->inChannelCount, 1456a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent (session->framesRev - frIn) * session->inChannelCount * sizeof(int16_t)); 1457a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev -= frIn; 1458a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1459a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent size_t fr = session->frameCount - session->framesRev; 1460a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (inBuffer->frameCount < fr) { 1461a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr = inBuffer->frameCount; 1462a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1463a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(session->revFrame->_payloadData + session->framesRev * session->inChannelCount, 1464a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->s16, 1465a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent fr * session->inChannelCount * sizeof(int16_t)); 1466a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev += fr; 1467a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent inBuffer->frameCount = fr; 1468a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session->framesRev < session->frameCount) { 1469a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1470a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1471a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->framesRev = 0; 1472a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1473a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->revFrame->_payloadDataLengthInSamples = 1474a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->apmFrameCount * session->inChannelCount; 1475a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect->session->apm->AnalyzeReverseStream(session->revFrame); 1476a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1477a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } else { 1478a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -ENODATA; 1479a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1480a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1481a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1482a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1483a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// effect_handle_t interface implementation for effect 1484a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterface = { 1485a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1486a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1487a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1488a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent NULL 1489a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1490a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1491a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentconst struct effect_interface_s sEffectInterfaceReverse = { 1492a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Process, 1493a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_Command, 1494a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_GetDescriptor, 1495a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent PreProcessingFx_ProcessReverse 1496a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1497a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1498a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1499a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent// Effect Library Interface Implementation 1500a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent//------------------------------------------------------------------------------ 1501a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1502a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_QueryNumberEffects(uint32_t *pNumEffects) 1503a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1504a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1505a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1506a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1507a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pNumEffects == NULL) { 1508a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1509a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1510a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent *pNumEffects = PREPROC_NUM_EFFECTS; 1511a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1512a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1513a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1514a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_QueryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 1515a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1516a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1517a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1518a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1519a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (index >= PREPROC_NUM_EFFECTS) { 1520a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1521a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1522a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pDescriptor, sDescriptors[index], sizeof(effect_descriptor_t)); 1523a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1524a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1525a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1526a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_Create(effect_uuid_t *uuid, 1527a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t sessionId, 1528a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int32_t ioId, 1529a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_handle_t *pInterface) 1530a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 15313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate: uuid: %08x session %d IO: %d", uuid->timeLow, sessionId, ioId); 1532a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1533a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 1534a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc; 1535a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_session_t *session; 1536a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent uint32_t procId; 1537a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1538a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1539a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1540a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1541a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent desc = PreProc_GetDescriptor(uuid); 1542a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 1543a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("EffectCreate: fx not found uuid: %08x", uuid->timeLow); 1544a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1545a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1546a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent procId = UuidToProcId(&desc->type); 1547a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1548a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session = PreProc_GetSession(procId, sessionId, ioId); 1549a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (session == NULL) { 1550a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent LOGW("EffectCreate: no more session available"); 1551a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1552a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1553a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1554a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent status = Session_CreateEffect(session, procId, pInterface); 1555a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1556a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (status < 0 && session->createdMsk == 0) { 1557a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent session->io = 0; 1558a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1559a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return status; 1560a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1561a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1562a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_Release(effect_handle_t interface) 1563a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent{ 1564a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent int status; 15653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectRelease start %p", interface); 1566a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (PreProc_Init() != 0) { 1567a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return sInitStatus; 1568a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1569a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1570a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent preproc_effect_t *fx = (preproc_effect_t *)interface; 1571a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1572a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (fx->session->io == 0) { 1573a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1574a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1575a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return Session_ReleaseEffect(fx->session, fx); 1576a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1577a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1578a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentint PreProcessingLib_GetDescriptor(effect_uuid_t *uuid, 1579a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent effect_descriptor_t *pDescriptor) { 1580a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1581a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 1582a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1583a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1584a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1585a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent const effect_descriptor_t *desc = PreProc_GetDescriptor(uuid); 1586a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent if (desc == NULL) { 15873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() not found"); 1588a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return -EINVAL; 1589a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent } 1590a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 15913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("PreProcessingLib_GetDescriptor() got fx %s", desc->name); 1592a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1593a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent memcpy(pDescriptor, desc, sizeof(effect_descriptor_t)); 1594a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent return 0; 1595a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent} 1596a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1597a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 1598a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent tag : AUDIO_EFFECT_LIBRARY_TAG, 1599a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent version : EFFECT_LIBRARY_API_VERSION, 1600a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent name : "Audio Preprocessing Library", 1601a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent implementor : "The Android Open Source Project", 1602a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent query_num_effects : PreProcessingLib_QueryNumberEffects, 1603a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent query_effect : PreProcessingLib_QueryEffect, 1604a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent create_effect : PreProcessingLib_Create, 1605a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent release_effect : PreProcessingLib_Release, 1606a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent get_descriptor : PreProcessingLib_GetDescriptor 1607a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; 1608a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent 1609a9390d4d571817cdb1d659b4b22b04130dc77a48Eric Laurent}; // extern "C" 1610