EffectsFactoryHalHidl.cpp revision e83be8af690ef1ac820a63414d522e77ca9d4db6
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 239f57e3c9da8923649adff62e63c644537f565e90Mikhail Naganov#include "ConversionHelperHidl.h" 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectHalHidl.h" 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectsFactoryHalHidl.h" 26f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "HidlUtils.h" 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::common::V2_0::Uuid; 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::IEffect; 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::Result; 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Return; 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Status; 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 34f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 36f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 37f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovsp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() { 38f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return new EffectsFactoryHalHidl(); 39f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 40f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 41f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 42f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovbool EffectsFactoryHalInterface::isNullUuid(const effect_uuid_t *pEffectUuid) { 43f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return EffectIsNullUuid(pEffectUuid); 44f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 45f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 46e83be8af690ef1ac820a63414d522e77ca9d4db6Steven MorelandEffectsFactoryHalHidl::EffectsFactoryHalHidl() : ConversionHelperHidl("EffectsFactory"){ 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mEffectsFactory = IEffectsFactory::getService("audio_effects_factory"); 48f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 49f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 50f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectsFactoryHalHidl::~EffectsFactoryHalHidl() { 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryAllDescriptors() { 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getAllDescriptors( 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors = result; 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 63e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return retval == Result::OK ? OK : NO_INIT; 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors.resize(0); 67e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryNumberEffects(uint32_t *pNumEffects) { 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult == OK) { 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *pNumEffects = mLastDescriptors.size(); 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return queryResult; 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint32_t index, effect_descriptor_t *pDescriptor) { 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: We need somehow to track the changes on the server side 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // or figure out how to convert everybody to query all the descriptors at once. 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 83f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mLastDescriptors.size() == 0) { 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult != OK) return queryResult; 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (index >= mLastDescriptors.size()) return NAME_NOT_FOUND; 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(mLastDescriptors[index], pDescriptor); 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, effect_descriptor_t *pDescriptor) { 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 96f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 97f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 98f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 99f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getDescriptor(hidlUuid, 100f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const EffectDescriptor& result) { 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(result, pDescriptor); 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 105f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 106e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 107f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 108f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 109f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 110f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 111e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 112f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 113f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 114f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::createEffect( 115f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t ioId, 116f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov sp<EffectHalInterface> *effect) { 117f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 118f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 119f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 120f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 121f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->createEffect( 122f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlUuid, sessionId, ioId, 123f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const sp<IEffect>& result, uint64_t effectId) { 124f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 125f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 126f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *effect = new EffectHalHidl(result, effectId); 127f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 128f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 129e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 130f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 131f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 132f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 133f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 134e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 135f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 136f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 137f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::dumpEffects(int fd) { 138f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 139f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_t* hidlHandle = native_handle_create(1, 0); 140f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlHandle->data[0] = fd; 141f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->debugDump(hidlHandle); 142f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_delete(hidlHandle); 143e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 144f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 145f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 146f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 147