EffectsFactoryHalHidl.cpp revision f558e0218d2677a813c9c600886f673894eec927
1f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov/* 2f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Copyright (C) 2016 The Android Open Source Project 3f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 4f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 5f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * you may not use this file except in compliance with the License. 6f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * You may obtain a copy of the License at 7f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 8f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 9f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 10f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Unless required by applicable law or agreed to in writing, software 11f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 12f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * See the License for the specific language governing permissions and 14f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * limitations under the License. 15f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov */ 16f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 17f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#define LOG_TAG "EffectsFactoryHalHidl" 18f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov//#define LOG_NDEBUG 0 19f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 20f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <cutils/native_handle.h> 21f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <media/EffectsFactoryApi.h> 22f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 23f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectHalHidl.h" 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectsFactoryHalHidl.h" 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "HidlUtils.h" 26f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::common::V2_0::Uuid; 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::IEffect; 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::Result; 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Return; 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Status; 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 34f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 36f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovsp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() { 37f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return new EffectsFactoryHalHidl(); 38f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 39f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 40f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 41f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovbool EffectsFactoryHalInterface::isNullUuid(const effect_uuid_t *pEffectUuid) { 42f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return EffectIsNullUuid(pEffectUuid); 43f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 44f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 45f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectsFactoryHalHidl::EffectsFactoryHalHidl() { 46f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mEffectsFactory = IEffectsFactory::getService("audio_effects_factory"); 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 48f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 49f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectsFactoryHalHidl::~EffectsFactoryHalHidl() { 50f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryAllDescriptors() { 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getAllDescriptors( 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors = result; 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (ret.getStatus().isOk()) { 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return retval == Result::OK ? OK : NO_INIT; 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors.resize(0); 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return ret.getStatus().transactionError(); 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryNumberEffects(uint32_t *pNumEffects) { 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult == OK) { 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *pNumEffects = mLastDescriptors.size(); 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return queryResult; 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint32_t index, effect_descriptor_t *pDescriptor) { 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: We need somehow to track the changes on the server side 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // or figure out how to convert everybody to query all the descriptors at once. 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mLastDescriptors.size() == 0) { 83f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult != OK) return queryResult; 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (index >= mLastDescriptors.size()) return NAME_NOT_FOUND; 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(mLastDescriptors[index], pDescriptor); 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, effect_descriptor_t *pDescriptor) { 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 96f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 97f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 98f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getDescriptor(hidlUuid, 99f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const EffectDescriptor& result) { 100f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(result, pDescriptor); 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 105f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (ret.getStatus().isOk()) { 106f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 107f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 108f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 109f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 110f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return ret.getStatus().transactionError(); 111f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 112f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 113f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::createEffect( 114f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t ioId, 115f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov sp<EffectHalInterface> *effect) { 116f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 117f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 118f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 119f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 120f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->createEffect( 121f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlUuid, sessionId, ioId, 122f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const sp<IEffect>& result, uint64_t effectId) { 123f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 124f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 125f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *effect = new EffectHalHidl(result, effectId); 126f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 127f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 128f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (ret.getStatus().isOk()) { 129f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 130f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 131f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 132f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 133f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return ret.getStatus().transactionError(); 134f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 135f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 136f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::dumpEffects(int fd) { 137f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 138f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_t* hidlHandle = native_handle_create(1, 0); 139f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlHandle->data[0] = fd; 140f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->debugDump(hidlHandle); 141f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_delete(hidlHandle); 142f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return ret.getStatus().transactionError(); 143f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 144f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 145f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 146