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 229f57e3c9da8923649adff62e63c644537f565e90Mikhail Naganov#include "ConversionHelperHidl.h" 237588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard#include "EffectBufferHalHidl.h" 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectHalHidl.h" 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectsFactoryHalHidl.h" 26f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "HidlUtils.h" 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 288f3585691717dd36d7124849e52fda983bf35618Kevin Rocardusing ::android::hardware::audio::common::V2_0::HidlUtils; 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::common::V2_0::Uuid; 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::IEffect; 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::Result; 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Return; 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 34f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 36dfa54faf298f6b617bf1d7684418fc8a2e6e4858Chris PhoenixEffectsFactoryHalHidl::EffectsFactoryHalHidl() : ConversionHelperHidl("EffectsFactory") { 37dfa54faf298f6b617bf1d7684418fc8a2e6e4858Chris Phoenix mEffectsFactory = IEffectsFactory::getService(); 381ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov if (mEffectsFactory == 0) { 391ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov ALOGE("Failed to obtain IEffectsFactory service, terminating process."); 401ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov exit(1); 411ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov } 42f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 43f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 44f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectsFactoryHalHidl::~EffectsFactoryHalHidl() { 45f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 46f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryAllDescriptors() { 48f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 49f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 50f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getAllDescriptors( 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors = result; 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 57e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return retval == Result::OK ? OK : NO_INIT; 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov mLastDescriptors.resize(0); 61e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::queryNumberEffects(uint32_t *pNumEffects) { 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult == OK) { 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *pNumEffects = mLastDescriptors.size(); 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return queryResult; 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint32_t index, effect_descriptor_t *pDescriptor) { 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: We need somehow to track the changes on the server side 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // or figure out how to convert everybody to query all the descriptors at once. 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mLastDescriptors.size() == 0) { 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t queryResult = queryAllDescriptors(); 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (queryResult != OK) return queryResult; 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (index >= mLastDescriptors.size()) return NAME_NOT_FOUND; 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(mLastDescriptors[index], pDescriptor); 83f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::getDescriptor( 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, effect_descriptor_t *pDescriptor) { 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // TODO: check for nullptr 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->getDescriptor(hidlUuid, 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const EffectDescriptor& result) { 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 96f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 97f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov EffectHalHidl::effectDescriptorToHal(result, pDescriptor); 98f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 99f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 100e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 105e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 106f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 107f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 108f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::createEffect( 109f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const effect_uuid_t *pEffectUuid, int32_t sessionId, int32_t ioId, 110f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov sp<EffectHalInterface> *effect) { 111f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 112f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Uuid hidlUuid; 113f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidFromHal(*pEffectUuid, &hidlUuid); 114f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 115f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->createEffect( 116f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlUuid, sessionId, ioId, 117f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const sp<IEffect>& result, uint64_t effectId) { 118f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 119f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 120f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *effect = new EffectHalHidl(result, effectId); 121f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 122f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 123e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 124f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 125f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return NAME_NOT_FOUND; 126f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 127f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 128e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 129f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 130f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 131f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectsFactoryHalHidl::dumpEffects(int fd) { 132f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffectsFactory == 0) return NO_INIT; 133f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_t* hidlHandle = native_handle_create(1, 0); 134f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlHandle->data[0] = fd; 135f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffectsFactory->debugDump(hidlHandle); 136f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov native_handle_delete(hidlHandle); 137e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return processReturn(__FUNCTION__, ret); 138f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 139f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 1407588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocardstatus_t EffectsFactoryHalHidl::allocateBuffer(size_t size, sp<EffectBufferHalInterface>* buffer) { 1417588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard return EffectBufferHalHidl::allocate(size, buffer); 1427588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard} 1437588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard 1447588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocardstatus_t EffectsFactoryHalHidl::mirrorBuffer(void* external, size_t size, 1457588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard sp<EffectBufferHalInterface>* buffer) { 1467588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard return EffectBufferHalHidl::mirror(external, size, buffer); 1477588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard} 1487588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard 1497588ff418aca63b1dc43a85afc1e86c40dd889a3Kevin Rocard 150f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 151