| /* |
| * Copyright (C) 2017 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #define LOG_TAG "EffectsFactoryState" |
| |
| #include "EffectsFactoryState.h" |
| |
| #include "log/log.h" |
| |
| list_elem_t *gLibraryList; |
| list_elem_t *gSkippedEffects; |
| list_sub_elem_t *gSubEffectList; |
| pthread_mutex_t gLibLock = PTHREAD_MUTEX_INITIALIZER; |
| |
| list_elem_t *gLibraryFailedList; //list of lib_failed_entry_t: libraries failed to load |
| |
| |
| int findEffect(const effect_uuid_t *type, |
| const effect_uuid_t *uuid, |
| lib_entry_t **lib, |
| effect_descriptor_t **desc) |
| { |
| list_elem_t *e = gLibraryList; |
| lib_entry_t *l = NULL; |
| effect_descriptor_t *d = NULL; |
| int found = 0; |
| int ret = 0; |
| |
| while (e && !found) { |
| l = (lib_entry_t *)e->object; |
| list_elem_t *efx = l->effects; |
| while (efx) { |
| d = (effect_descriptor_t *)efx->object; |
| if (type != NULL && memcmp(&d->type, type, sizeof(effect_uuid_t)) == 0) { |
| found = 1; |
| break; |
| } |
| if (uuid != NULL && memcmp(&d->uuid, uuid, sizeof(effect_uuid_t)) == 0) { |
| found = 1; |
| break; |
| } |
| efx = efx->next; |
| } |
| e = e->next; |
| } |
| if (!found) { |
| ALOGV("findEffect() effect not found"); |
| ret = -ENOENT; |
| } else { |
| ALOGV("findEffect() found effect: %s in lib %s", d->name, l->name); |
| *lib = l; |
| if (desc) { |
| *desc = d; |
| } |
| } |
| |
| return ret; |
| } |
| |
| int stringToUuid(const char *str, effect_uuid_t *uuid) |
| { |
| int tmp[10]; |
| |
| if (sscanf(str, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x", |
| tmp, tmp+1, tmp+2, tmp+3, tmp+4, tmp+5, tmp+6, tmp+7, tmp+8, tmp+9) < 10) { |
| return -EINVAL; |
| } |
| uuid->timeLow = (uint32_t)tmp[0]; |
| uuid->timeMid = (uint16_t)tmp[1]; |
| uuid->timeHiAndVersion = (uint16_t)tmp[2]; |
| uuid->clockSeq = (uint16_t)tmp[3]; |
| uuid->node[0] = (uint8_t)tmp[4]; |
| uuid->node[1] = (uint8_t)tmp[5]; |
| uuid->node[2] = (uint8_t)tmp[6]; |
| uuid->node[3] = (uint8_t)tmp[7]; |
| uuid->node[4] = (uint8_t)tmp[8]; |
| uuid->node[5] = (uint8_t)tmp[9]; |
| |
| return 0; |
| } |
| |
| int uuidToString(const effect_uuid_t *uuid, char *str, size_t maxLen) |
| { |
| |
| snprintf(str, maxLen, "%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x", |
| uuid->timeLow, |
| uuid->timeMid, |
| uuid->timeHiAndVersion, |
| uuid->clockSeq, |
| uuid->node[0], |
| uuid->node[1], |
| uuid->node[2], |
| uuid->node[3], |
| uuid->node[4], |
| uuid->node[5]); |
| |
| return 0; |
| } |
| |
| |
| void dumpEffectDescriptor(effect_descriptor_t *desc, char *str, size_t len, int indent) { |
| char s[256]; |
| char ss[256]; |
| char idt[indent + 1]; |
| |
| memset(idt, ' ', indent); |
| idt[indent] = 0; |
| |
| str[0] = 0; |
| |
| snprintf(s, sizeof(s), "%s%s / %s\n", idt, desc->name, desc->implementor); |
| strlcat(str, s, len); |
| |
| uuidToString(&desc->uuid, s, sizeof(s)); |
| snprintf(ss, sizeof(ss), "%s UUID: %s\n", idt, s); |
| strlcat(str, ss, len); |
| |
| uuidToString(&desc->type, s, sizeof(s)); |
| snprintf(ss, sizeof(ss), "%s TYPE: %s\n", idt, s); |
| strlcat(str, ss, len); |
| |
| sprintf(s, "%s apiVersion: %08X\n%s flags: %08X\n", idt, |
| desc->apiVersion, idt, desc->flags); |
| strlcat(str, s, len); |
| } |