17cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov/*
27cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * Copyright (C) 2016 The Android Open Source Project
37cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov *
47cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License");
57cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * you may not use this file except in compliance with the License.
67cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * You may obtain a copy of the License at
77cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov *
87cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov *      http://www.apache.org/licenses/LICENSE-2.0
97cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov *
107cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * Unless required by applicable law or agreed to in writing, software
117cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS,
127cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * See the License for the specific language governing permissions and
147cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov * limitations under the License.
157cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov */
167cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
177cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#define LOG_TAG "EffectFactoryHAL"
187cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <media/EffectsFactoryApi.h>
197cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_aec.h>
207cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_agc.h>
217cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_bassboost.h>
227cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_downmix.h>
237cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_environmentalreverb.h>
247cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_equalizer.h>
257cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_loudnessenhancer.h>
267cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_ns.h>
277cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_presetreverb.h>
287cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_virtualizer.h>
297cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include <system/audio_effects/effect_visualizer.h>
30f9d303435d80161fabb16cdff3b8f2f75f362480Yifan Hong#include <android/log.h>
317cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
327cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "AcousticEchoCancelerEffect.h"
337cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "AutomaticGainControlEffect.h"
347cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "BassBoostEffect.h"
357cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "Conversions.h"
367cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "DownmixEffect.h"
376e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov#include "EffectsFactory.h"
386e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov#include "HidlUtils.h"
397cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "Effect.h"
4010548295023bee99108e418499aff09fe578211eMikhail Naganov#include "EffectMap.h"
417cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "EnvironmentalReverbEffect.h"
427cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "EqualizerEffect.h"
437cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "LoudnessEnhancerEffect.h"
447cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "NoiseSuppressionEffect.h"
457cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "PresetReverbEffect.h"
467cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "VirtualizerEffect.h"
477cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov#include "VisualizerEffect.h"
487cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
497cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace android {
507cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace hardware {
517cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace audio {
527cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace effect {
537cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace V2_0 {
547cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovnamespace implementation {
557cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
567cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov// static
577cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovsp<IEffect> EffectsFactory::dispatchEffectInstanceCreation(
587cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        const effect_descriptor_t& halDescriptor, effect_handle_t handle) {
597cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    const effect_uuid_t *halUuid = &halDescriptor.type;
607cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    if (memcmp(halUuid, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
617cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new AcousticEchoCancelerEffect(handle);
627cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, FX_IID_AGC, sizeof(effect_uuid_t)) == 0) {
637cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new AutomaticGainControlEffect(handle);
647cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_BASSBOOST, sizeof(effect_uuid_t)) == 0) {
657cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new BassBoostEffect(handle);
667cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, EFFECT_UIID_DOWNMIX, sizeof(effect_uuid_t)) == 0) {
677cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new DownmixEffect(handle);
687cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_ENVIRONMENTALREVERB, sizeof(effect_uuid_t)) == 0) {
697cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new EnvironmentalReverbEffect(handle);
707cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_EQUALIZER, sizeof(effect_uuid_t)) == 0) {
717cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new EqualizerEffect(handle);
727cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, FX_IID_LOUDNESS_ENHANCER, sizeof(effect_uuid_t)) == 0) {
737cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new LoudnessEnhancerEffect(handle);
747cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, FX_IID_NS, sizeof(effect_uuid_t)) == 0) {
757cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new NoiseSuppressionEffect(handle);
767cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_PRESETREVERB, sizeof(effect_uuid_t)) == 0) {
777cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new PresetReverbEffect(handle);
787cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_VIRTUALIZER, sizeof(effect_uuid_t)) == 0) {
797cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new VirtualizerEffect(handle);
807cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    } else if (memcmp(halUuid, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) {
817cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        return new VisualizerEffect(handle);
827cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
837cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return new Effect(handle);
847cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
857cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
867cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov// Methods from ::android::hardware::audio::effect::V2_0::IEffectsFactory follow.
877cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail NaganovReturn<void> EffectsFactory::getAllDescriptors(getAllDescriptors_cb _hidl_cb)  {
887cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    Result retval(Result::OK);
897cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    hidl_vec<EffectDescriptor> result;
907cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    uint32_t numEffects;
917cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    status_t status;
927cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
937cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovrestart:
947cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    numEffects = 0;
957cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    status = EffectQueryNumberEffects(&numEffects);
967cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    if (status != OK) {
977cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        retval = Result::NOT_INITIALIZED;
989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov        ALOGE("Error querying number of effects: %s", strerror(-status));
997cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        goto exit;
1007cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
1017cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    result.resize(numEffects);
1027cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    for (uint32_t i = 0; i < numEffects; ++i) {
1037cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        effect_descriptor_t halDescriptor;
1047cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        status = EffectQueryEffect(i, &halDescriptor);
1057cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        if (status == OK) {
1067cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            effectDescriptorFromHal(halDescriptor, &result[i]);
1077cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        } else {
1089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov            ALOGE("Error querying effect at position %d / %d: %s",
1097cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    i, numEffects, strerror(-status));
1107cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            switch (status) {
1117cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                case -ENOSYS: {
1127cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    // Effect list has changed.
1137cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    goto restart;
1147cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                }
1157cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                case -ENOENT: {
1167cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    // No more effects available.
1177cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    result.resize(i);
1187cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                }
1197cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                default: {
1207cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    result.resize(0);
1217cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                    retval = Result::NOT_INITIALIZED;
1227cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                }
1237cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            }
1247cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            break;
1257cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        }
1267cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
1277cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
1287cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganovexit:
1297cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    _hidl_cb(retval, result);
1307cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return Void();
1317cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
1327cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
1337cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail NaganovReturn<void> EffectsFactory::getDescriptor(const Uuid& uid, getDescriptor_cb _hidl_cb)  {
1347cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    effect_uuid_t halUuid;
1356e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov    HidlUtils::uuidToHal(uid, &halUuid);
1367cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    effect_descriptor_t halDescriptor;
1377cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    status_t status = EffectGetDescriptor(&halUuid, &halDescriptor);
1387cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    EffectDescriptor descriptor;
1397cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    effectDescriptorFromHal(halDescriptor, &descriptor);
1407cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    Result retval(Result::OK);
1417cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    if (status != OK) {
1429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov        ALOGE("Error querying effect descriptor for %s: %s",
1437cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov                uuidToString(halUuid).c_str(), strerror(-status));
1447cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        if (status == -ENOENT) {
1457cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            retval = Result::INVALID_ARGUMENTS;
1467cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        } else {
1477cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            retval = Result::NOT_INITIALIZED;
1487cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        }
1497cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
1507cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    _hidl_cb(retval, descriptor);
1517cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return Void();
1527cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
1537cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
1547cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail NaganovReturn<void> EffectsFactory::createEffect(
1557cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        const Uuid& uid, int32_t session, int32_t ioHandle, createEffect_cb _hidl_cb)  {
1567cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    effect_uuid_t halUuid;
1576e81e9bb3c13d8c51fde503cf8be2bfb56e1ca1dMikhail Naganov    HidlUtils::uuidToHal(uid, &halUuid);
1587cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    effect_handle_t handle;
1597cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    Result retval(Result::OK);
1607cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    status_t status = EffectCreate(&halUuid, session, ioHandle, &handle);
1617cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    sp<IEffect> effect;
16210548295023bee99108e418499aff09fe578211eMikhail Naganov    uint64_t effectId = EffectMap::INVALID_ID;
1637cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    if (status == OK) {
1647cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        effect_descriptor_t halDescriptor;
1657cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        memset(&halDescriptor, 0, sizeof(effect_descriptor_t));
1667cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        status = (*handle)->get_descriptor(handle, &halDescriptor);
1677cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        if (status == OK) {
1687cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            effect = dispatchEffectInstanceCreation(halDescriptor, handle);
16910548295023bee99108e418499aff09fe578211eMikhail Naganov            effectId = EffectMap::getInstance().add(handle);
17010548295023bee99108e418499aff09fe578211eMikhail Naganov        } else {
1719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov            ALOGE("Error querying effect descriptor for %s: %s",
1729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov                    uuidToString(halUuid).c_str(), strerror(-status));
17310548295023bee99108e418499aff09fe578211eMikhail Naganov            EffectRelease(handle);
1747cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        }
1757cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
1767cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    if (status != OK) {
1779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov        ALOGE("Error creating effect %s: %s", uuidToString(halUuid).c_str(), strerror(-status));
1787cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        if (status == -ENOENT) {
1797cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            retval = Result::INVALID_ARGUMENTS;
1807cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        } else {
1817cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov            retval = Result::NOT_INITIALIZED;
1827cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        }
1837cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
18410548295023bee99108e418499aff09fe578211eMikhail Naganov    _hidl_cb(retval, effect, effectId);
1857cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return Void();
1867cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
1877cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
18870b9a15df00a42b319279d903bf5923564920e3bMartijn CoenenReturn<void> EffectsFactory::debugDump(const hidl_handle& fd)  {
1893e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov    if (fd.getNativeHandle() != nullptr && fd->numFds == 1) {
1907cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov        EffectDumpEffects(fd->data[0]);
1917cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    }
1927cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return Void();
1937cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
1947cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
1957cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
1967cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail NaganovIEffectsFactory* HIDL_FETCH_IEffectsFactory(const char* /* name */) {
1977cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov    return new EffectsFactory();
1987cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}
1997cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov
2007cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov} // namespace implementation
2017cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}  // namespace V2_0
2027cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}  // namespace effect
2037cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}  // namespace audio
2047cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}  // namespace hardware
2057cbf2f1fb15a2a7d9b8b61ca81ad93fa9ddcaea3Mikhail Naganov}  // namespace android
206