1135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* 2135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Copyright (C) 2010 The Android Open Source Project 3135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 4135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * you may not use this file except in compliance with the License. 6135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * You may obtain a copy of the License at 7135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 8135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 10135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Unless required by applicable law or agreed to in writing, software 11135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * See the License for the specific language governing permissions and 14135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * limitations under the License. 15135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 16135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 17135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define LOG_TAG "EffectsFactory" 18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//#define LOG_NDEBUG 0 19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 20135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "EffectsFactory.h" 2117217ab46e12fbdaad9e1d7460c48937f76fa0e2Eric Laurent#include <string.h> 2217217ab46e12fbdaad9e1d7460c48937f76fa0e2Eric Laurent#include <stdlib.h> 23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <dlfcn.h> 24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 25e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent#include <cutils/misc.h> 26e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent#include <cutils/config_utils.h> 277c7f10bd4fda9a084e5e7f0eb3a040dfcbf01745Eric Laurent#include <audio_effects/audio_effects_conf.h> 28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic list_elem_t *gEffectList; // list of effect_entry_t: all currently created effects 30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic list_elem_t *gLibraryList; // list of lib_entry_t: all currently loaded libraries 31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic pthread_mutex_t gLibLock = PTHREAD_MUTEX_INITIALIZER; // controls access to gLibraryList 32ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentstatic uint32_t gNumEffects; // total number number of effects 33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic list_elem_t *gCurLib; // current library in enumeration process 34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic list_elem_t *gCurEffect; // current effect in enumeration process 35ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentstatic uint32_t gCurEffectIdx; // current effect index in enumeration process 36e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic lib_entry_t *gCachedLibrary; // last library accessed by getLibrary() 37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 38135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int gInitDone; // true is global initialization has been preformed 39ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentstatic int gCanQueryEffect; // indicates that call to EffectQueryEffect() is valid, i.e. that the list of effects 40ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent // was not modified since last call to EffectQueryNumberEffects() 41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 42e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Local functions prototypes 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int init(); 48e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int loadEffectConfigFile(const char *path); 49e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int loadLibraries(cnode *root); 50e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int loadLibrary(cnode *root, const char *name); 51e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int loadEffects(cnode *root); 52e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int loadEffect(cnode *node); 53e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic lib_entry_t *getLibrary(const char *path); 54ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentstatic void resetEffectEnumeration(); 55ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentstatic uint32_t updateNumEffects(); 565e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenstatic int findEffect(const effect_uuid_t *type, 575e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten const effect_uuid_t *uuid, 58e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent lib_entry_t **lib, 59e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t **desc); 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic void dumpEffectDescriptor(effect_descriptor_t *desc, char *str, size_t len); 61e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int stringToUuid(const char *str, effect_uuid_t *uuid); 62e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentstatic int uuidToString(const effect_uuid_t *uuid, char *str, size_t maxLen); 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Effect Control Interface functions 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 68e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint Effect_Process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_entry_t *fx = (effect_entry_t *)self; 75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (fx->lib == NULL) { 77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EPIPE; 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&fx->lib->lock); 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = (*fx->subItfe)->process(fx->subItfe, inBuffer, outBuffer); 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&fx->lib->lock); 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 88e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint Effect_Command(effect_handle_t self, 8925f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t cmdCode, 9025f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t cmdSize, 9125f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pCmdData, 9225f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent uint32_t *replySize, 9325f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pReplyData) 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_entry_t *fx = (effect_entry_t *)self; 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (fx->lib == NULL) { 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EPIPE; 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&fx->lib->lock); 106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = (*fx->subItfe)->command(fx->subItfe, cmdCode, cmdSize, pCmdData, replySize, pReplyData); 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&fx->lib->lock); 110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 113e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint Effect_GetDescriptor(effect_handle_t self, 114e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *desc) 115e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 116e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int ret = init(); 117e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (ret < 0) { 118e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return ret; 119e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 120e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_entry_t *fx = (effect_entry_t *)self; 121e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_lock(&gLibLock); 122e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (fx->lib == NULL) { 123e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_unlock(&gLibLock); 124e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EPIPE; 125e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 126e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_lock(&fx->lib->lock); 127e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_unlock(&gLibLock); 128e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 129e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent ret = (*fx->subItfe)->get_descriptor(fx->subItfe, desc); 130e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_unlock(&fx->lib->lock); 131e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return ret; 132e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 133e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 134ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurentint Effect_ProcessReverse(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 135ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent{ 136ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent int ret = init(); 137ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent if (ret < 0) { 138ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent return ret; 139ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } 140ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent effect_entry_t *fx = (effect_entry_t *)self; 141ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent pthread_mutex_lock(&gLibLock); 142ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent if (fx->lib == NULL) { 143ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent pthread_mutex_unlock(&gLibLock); 144ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent return -EPIPE; 145ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } 146ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent pthread_mutex_lock(&fx->lib->lock); 147ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent pthread_mutex_unlock(&gLibLock); 148ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent 149ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent if ((*fx->subItfe)->process_reverse != NULL) { 150ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent ret = (*fx->subItfe)->process_reverse(fx->subItfe, inBuffer, outBuffer); 151ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } else { 152ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent ret = -ENOSYS; 153ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } 154ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent pthread_mutex_unlock(&fx->lib->lock); 155ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent return ret; 156ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent} 157ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent 158ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent 159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gInterface = { 160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Effect_Process, 161e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent Effect_Command, 162ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Effect_GetDescriptor, 163ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent NULL 164ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent}; 165ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent 166ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurentconst struct effect_interface_s gInterfaceWithReverse = { 167ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Effect_Process, 168ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Effect_Command, 169ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Effect_GetDescriptor, 170ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Effect_ProcessReverse 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Effect Factory Interface functions 175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 177be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentint EffectQueryNumberEffects(uint32_t *pNumEffects) 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pNumEffects == NULL) { 184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 188ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *pNumEffects = gNumEffects; 189ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCanQueryEffect = 1; 190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 1913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectQueryNumberEffects(): %d", *pNumEffects); 192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 195ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentint EffectQueryEffect(uint32_t index, effect_descriptor_t *pDescriptor) 196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 201ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pDescriptor == NULL || 202ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent index >= gNumEffects) { 203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 205ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (gCanQueryEffect == 0) { 206ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -ENOSYS; 207ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = -ENOENT; 211ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (index < gCurEffectIdx) { 212ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent resetEffectEnumeration(); 213ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (gCurLib) { 215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (gCurEffect) { 216ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (index == gCurEffectIdx) { 217a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *(effect_descriptor_t *)gCurEffect->object; 218ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent ret = 0; 219ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 220ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } else { 221ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurEffect = gCurEffect->next; 222ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurEffectIdx++; 223ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gCurLib = gCurLib->next; 226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gCurEffect = ((lib_entry_t *)gCurLib->object)->effects; 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 229ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 230ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent#if (LOG_NDEBUG == 0) 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char str[256]; 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent dumpEffectDescriptor(pDescriptor, str, 256); 2333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectQueryEffect() desc:%s", str); 234ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent#endif 235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2395e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint EffectGetDescriptor(const effect_uuid_t *uuid, effect_descriptor_t *pDescriptor) 240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent lib_entry_t *l = NULL; 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_descriptor_t *d = NULL; 243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pDescriptor == NULL || uuid == NULL) { 249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 252e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent ret = findEffect(NULL, uuid, &l, &d); 253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret == 0) { 254a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = *d; 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2605e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint EffectCreate(const effect_uuid_t *uuid, int32_t sessionId, int32_t ioId, effect_handle_t *pHandle) 261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *e = gLibraryList; 263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent lib_entry_t *l = NULL; 264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_descriptor_t *d = NULL; 265e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_handle_t itfe; 266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_entry_t *fx; 267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int found = 0; 268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 270e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (uuid == NULL || pHandle == NULL) { 271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate() UUID: %08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\n", 275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uuid->timeLow, uuid->timeMid, uuid->timeHiAndVersion, 276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uuid->clockSeq, uuid->node[0], uuid->node[1],uuid->node[2], 277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uuid->node[3],uuid->node[4],uuid->node[5]); 278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = init(); 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 2825ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate() init error: %d", ret); 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 288e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent ret = findEffect(NULL, uuid, &l, &d); 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0){ 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent goto exit; 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // create effect in library 294342484f01824ab45af953c7c9193b1e5ad6326deEric Laurent ret = l->desc->create_effect(uuid, sessionId, ioId, &itfe); 295ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (ret != 0) { 2965ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectCreate() library %s: could not create fx %s, error %d", l->name, d->name, ret); 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent goto exit; 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // add entry to effect list 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent fx = (effect_entry_t *)malloc(sizeof(effect_entry_t)); 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent fx->subItfe = itfe; 303ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent if ((*itfe)->process_reverse != NULL) { 304ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent fx->itfe = (struct effect_interface_s *)&gInterfaceWithReverse; 3053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate() gInterfaceWithReverse"); 306ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } else { 307ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent fx->itfe = (struct effect_interface_s *)&gInterface; 3083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate() gInterface"); 309ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent } 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent fx->lib = l; 311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e = (list_elem_t *)malloc(sizeof(list_elem_t)); 313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e->object = fx; 314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e->next = gEffectList; 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEffectList = e; 316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 317e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *pHandle = (effect_handle_t)fx; 318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 3193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectCreate() created entry %p with sub itfe %p in library %s", *pHandle, itfe, l->name); 320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentexit: 322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 326e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint EffectRelease(effect_handle_t handle) 327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_entry_t *fx; 329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *e1; 330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *e2; 331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = init(); 333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // remove effect from effect list 338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&gLibLock); 339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e1 = gEffectList; 340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e2 = NULL; 341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (e1) { 342e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (e1->object == handle) { 343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (e2) { 344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e2->next = e1->next; 345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEffectList = e1->next; 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent fx = (effect_entry_t *)e1->object; 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent free(e1); 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e2 = e1; 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e1 = e1->next; 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (e1 == NULL) { 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = -ENOENT; 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent goto exit; 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // release effect in library 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (fx->lib == NULL) { 3625ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectRelease() fx %p library already unloaded", handle); 363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_lock(&fx->lib->lock); 365e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent fx->lib->desc->release_effect(fx->subItfe); 366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&fx->lib->lock); 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent free(fx); 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentexit: 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 3755e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint EffectIsNullUuid(const effect_uuid_t *uuid) 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, EFFECT_UUID_NULL, sizeof(effect_uuid_t))) { 378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 1; 381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Local functions 385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent///////////////////////////////////////////////// 386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint init() { 388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int hdl; 389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (gInitDone) { 391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_init(&gLibLock, NULL); 395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 396e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) { 397e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadEffectConfigFile(AUDIO_EFFECT_VENDOR_CONFIG_FILE); 398e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } else if (access(AUDIO_EFFECT_DEFAULT_CONFIG_FILE, R_OK) == 0) { 399e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadEffectConfigFile(AUDIO_EFFECT_DEFAULT_CONFIG_FILE); 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 401e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 402ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent updateNumEffects(); 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gInitDone = 1; 4043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("init() done"); 405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 408e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint loadEffectConfigFile(const char *path) 409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 410e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cnode *root; 411e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent char *data; 412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 413e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent data = load_file(path, NULL); 414e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (data == NULL) { 415e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -ENODEV; 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 417e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent root = config_node("", ""); 418e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent config_load(root, data); 419e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadLibraries(root); 420e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadEffects(root); 421e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent config_free(root); 422e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent free(root); 423e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent free(data); 424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 425e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 426e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 428e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint loadLibraries(cnode *root) 429e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 430e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cnode *node; 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 432e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = config_find(root, LIBRARIES_TAG); 433e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (node == NULL) { 434e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -ENOENT; 435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 436e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = node->first_child; 437e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent while (node) { 438e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadLibrary(node, node->name); 439e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = node->next; 440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 441e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 442e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 443e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 444e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint loadLibrary(cnode *root, const char *name) 445e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 446e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cnode *node; 447e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent void *hdl; 448e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent audio_effect_library_t *desc; 449e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent list_elem_t *e; 450e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent lib_entry_t *l; 451e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 452e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = config_find(root, PATH_TAG); 453e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (node == NULL) { 454e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 456e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 457e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent hdl = dlopen(node->value, RTLD_NOW); 458e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (hdl == NULL) { 4595ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("loadLibrary() failed to open %s", node->value); 460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent goto error; 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 463e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent desc = (audio_effect_library_t *)dlsym(hdl, AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR); 464e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (desc == NULL) { 4655ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("loadLibrary() could not find symbol %s", AUDIO_EFFECT_LIBRARY_INFO_SYM_AS_STR); 466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent goto error; 467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 469e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (AUDIO_EFFECT_LIBRARY_TAG != desc->tag) { 4705ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("getLibrary() bad tag %08x in lib info struct", desc->tag); 471e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent goto error; 472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 473ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 474e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (EFFECT_API_VERSION_MAJOR(desc->version) != 475e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EFFECT_API_VERSION_MAJOR(EFFECT_LIBRARY_API_VERSION)) { 4765ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("loadLibrary() bad lib version %08x", desc->version); 477e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent goto error; 478e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 479ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // add entry for library in gLibraryList 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent l = malloc(sizeof(lib_entry_t)); 482e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l->name = strndup(name, PATH_MAX); 483e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l->path = strndup(node->value, PATH_MAX); 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent l->handle = hdl; 485e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l->desc = desc; 486e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l->effects = NULL; 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_init(&l->lock, NULL); 488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e = malloc(sizeof(list_elem_t)); 490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e->object = l; 491e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pthread_mutex_lock(&gLibLock); 492e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e->next = gLibraryList; 493135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gLibraryList = e; 494135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pthread_mutex_unlock(&gLibLock); 4953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getLibrary() linked library %p for path %s", l, node->value); 496135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 497135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 498135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 499135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenterror: 500e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (hdl != NULL) { 501e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent dlclose(hdl); 502e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 503e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 505135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 506e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint loadEffects(cnode *root) 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 508e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cnode *node; 509e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 510e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = config_find(root, EFFECTS_TAG); 511e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (node == NULL) { 512e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -ENOENT; 513e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 514e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = node->first_child; 515e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent while (node) { 516e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent loadEffect(node); 517e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = node->next; 518e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 519e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 520e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 521e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 522e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint loadEffect(cnode *root) 523e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 524e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cnode *node; 525e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_uuid_t uuid; 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent lib_entry_t *l; 527e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *d; 528e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent list_elem_t *e; 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 530e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = config_find(root, LIBRARY_TAG); 531e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (node == NULL) { 532e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 534e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 535e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l = getLibrary(node->value); 536e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (l == NULL) { 5375ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("loadEffect() could not get library %s", node->value); 538e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 541e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent node = config_find(root, UUID_TAG); 542e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (node == NULL) { 543e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 544e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 545e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (stringToUuid(node->value, &uuid) != 0) { 5465ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("loadEffect() invalid uuid %s", node->value); 547e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 548e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 549e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 550e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent d = malloc(sizeof(effect_descriptor_t)); 551e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (l->desc->get_descriptor(&uuid, d) != 0) { 552e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent char s[40]; 553e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuidToString(&uuid, s, 40); 5545ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Error querying effect %s on lib %s", s, l->name); 555e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent free(d); 556e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 557e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 558e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent#if (LOG_NDEBUG==0) 559e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent char s[256]; 560e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent dumpEffectDescriptor(d, s, 256); 5613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("loadEffect() read descriptor %p:%s",d, s); 562e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent#endif 563e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (EFFECT_API_VERSION_MAJOR(d->apiVersion) != 564e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EFFECT_API_VERSION_MAJOR(EFFECT_CONTROL_API_VERSION)) { 5655ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Bad API version %08x on lib %s", d->apiVersion, l->name); 566e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent free(d); 567e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 568135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 569e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e = malloc(sizeof(list_elem_t)); 570e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e->object = d; 571e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e->next = l->effects; 572e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent l->effects = e; 573e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 574e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 575e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 576135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 577e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentlib_entry_t *getLibrary(const char *name) 578e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 579e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent list_elem_t *e; 580ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 581e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (gCachedLibrary && 582e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent !strncmp(gCachedLibrary->name, name, PATH_MAX)) { 583e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return gCachedLibrary; 584e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 585e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 586e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e = gLibraryList; 587e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent while (e) { 588e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent lib_entry_t *l = (lib_entry_t *)e->object; 589e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (!strcmp(l->name, name)) { 590e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent gCachedLibrary = l; 591e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return l; 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 593e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent e = e->next; 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 596e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return NULL; 597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 599e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 600ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentvoid resetEffectEnumeration() 601ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent{ 602ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurLib = gLibraryList; 603ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurEffect = NULL; 604ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (gCurLib) { 605ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurEffect = ((lib_entry_t *)gCurLib->object)->effects; 606ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 607ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCurEffectIdx = 0; 608ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent} 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 610ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentuint32_t updateNumEffects() { 611ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent list_elem_t *e; 612be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent uint32_t cnt = 0; 613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 614ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent resetEffectEnumeration(); 615ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 616ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent e = gLibraryList; 617135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (e) { 618135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent lib_entry_t *l = (lib_entry_t *)e->object; 619135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *efx = l->effects; 620135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (efx) { 621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent cnt++; 622135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent efx = efx->next; 623135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 624135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e = e->next; 625135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 626ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gNumEffects = cnt; 627ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent gCanQueryEffect = 0; 628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return cnt; 629135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 630135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 6315e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenint findEffect(const effect_uuid_t *type, 6325e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kasten const effect_uuid_t *uuid, 633e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent lib_entry_t **lib, 634e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t **desc) 635135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *e = gLibraryList; 637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent lib_entry_t *l = NULL; 638135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_descriptor_t *d = NULL; 639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int found = 0; 640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret = 0; 641135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (e && !found) { 643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent l = (lib_entry_t *)e->object; 644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent list_elem_t *efx = l->effects; 645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (efx) { 646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent d = (effect_descriptor_t *)efx->object; 647e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (type != NULL && memcmp(&d->type, type, sizeof(effect_uuid_t)) == 0) { 648e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent found = 1; 649e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent break; 650e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 651e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (uuid != NULL && memcmp(&d->uuid, uuid, sizeof(effect_uuid_t)) == 0) { 652135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent found = 1; 653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 655135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent efx = efx->next; 656135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 657135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent e = e->next; 658135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 659135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!found) { 6603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("findEffect() effect not found"); 661135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = -ENOENT; 662135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 6633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("findEffect() found effect: %s in lib %s", d->name, l->name); 664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *lib = l; 665e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (desc) { 666e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *desc = d; 667e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 668135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 669135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentvoid dumpEffectDescriptor(effect_descriptor_t *desc, char *str, size_t len) { 674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char s[256]; 675135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 676135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent snprintf(str, len, "\nEffect Descriptor %p:\n", desc); 677e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent strncat(str, "- TYPE: ", len); 678e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuidToString(&desc->uuid, s, 256); 679e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent snprintf(str, len, "- UUID: %s\n", s); 680e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuidToString(&desc->type, s, 256); 681e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent snprintf(str, len, "- TYPE: %s\n", s); 682e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent sprintf(s, "- apiVersion: %08X\n- flags: %08X\n", 683135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent desc->apiVersion, desc->flags); 684135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncat(str, s, len); 685135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent sprintf(s, "- name: %s\n", desc->name); 686135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncat(str, s, len); 687135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent sprintf(s, "- implementor: %s\n", desc->implementor); 688135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncat(str, s, len); 689135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 690135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 691e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint stringToUuid(const char *str, effect_uuid_t *uuid) 692e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 693e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int tmp[10]; 694e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 695e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (sscanf(str, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x", 696e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent tmp, tmp+1, tmp+2, tmp+3, tmp+4, tmp+5, tmp+6, tmp+7, tmp+8, tmp+9) < 10) { 697e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 698e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 699e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeLow = (uint32_t)tmp[0]; 700e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeMid = (uint16_t)tmp[1]; 701e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeHiAndVersion = (uint16_t)tmp[2]; 702e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->clockSeq = (uint16_t)tmp[3]; 703e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[0] = (uint8_t)tmp[4]; 704e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[1] = (uint8_t)tmp[5]; 705e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[2] = (uint8_t)tmp[6]; 706e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[3] = (uint8_t)tmp[7]; 707e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[4] = (uint8_t)tmp[8]; 708e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[5] = (uint8_t)tmp[9]; 709e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 710e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 711e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 712e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 713e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentint uuidToString(const effect_uuid_t *uuid, char *str, size_t maxLen) 714e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 715e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 716e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent snprintf(str, maxLen, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x", 717e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeLow, 718e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeMid, 719e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->timeHiAndVersion, 720e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->clockSeq, 721e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[0], 722e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[1], 723e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[2], 724e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[3], 725e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[4], 726e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent uuid->node[5]); 727e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 728e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 729e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 730e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 731