EffectHalHidl.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 "EffectHalHidl" 18f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov//#define LOG_NDEBUG 0 19f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 20f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <media/EffectsFactoryApi.h> 21f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <utils/Log.h> 22f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 239f57e3c9da8923649adff62e63c644537f565e90Mikhail Naganov#include "ConversionHelperHidl.h" 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "EffectHalHidl.h" 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "HidlUtils.h" 26f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::effect::V2_0::Result; 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::hidl_vec; 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Return; 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Status; 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 34f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectHalHidl::EffectHalHidl(const sp<IEffect>& effect, uint64_t effectId) 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov : mEffect(effect), mEffectId(effectId) { 36f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 37f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 38f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovEffectHalHidl::~EffectHalHidl() { 39f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 40f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 41f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 42f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovvoid EffectHalHidl::effectDescriptorToHal( 43f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const EffectDescriptor& descriptor, effect_descriptor_t* halDescriptor) { 44f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidToHal(descriptor.type, &halDescriptor->type); 45f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov HidlUtils::uuidToHal(descriptor.uuid, &halDescriptor->uuid); 46f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov halDescriptor->flags = static_cast<uint32_t>(descriptor.flags); 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov halDescriptor->cpuLoad = descriptor.cpuLoad; 48f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov halDescriptor->memoryUsage = descriptor.memoryUsage; 49f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov memcpy(halDescriptor->name, descriptor.name.data(), descriptor.name.size()); 50f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov memcpy(halDescriptor->implementor, 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov descriptor.implementor.data(), descriptor.implementor.size()); 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectHalHidl::analyzeResult(const Result& result) { 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov switch (result) { 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::OK: return OK; 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::INVALID_ARGUMENTS: return BAD_VALUE; 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::INVALID_STATE: return NOT_ENOUGH_DATA; 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::NOT_INITIALIZED: return NO_INIT; 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::NOT_SUPPORTED: return INVALID_OPERATION; 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::RESULT_TOO_BIG: return NO_MEMORY; 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov default: return NO_INIT; 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectHalHidl::process(audio_buffer_t */*inBuffer*/, audio_buffer_t */*outBuffer*/) { 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // Idea -- intercept set buffer config command, capture audio format, use it 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov // for determining frame size in bytes on input and output. 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectHalHidl::processReverse(audio_buffer_t */*inBuffer*/, audio_buffer_t */*outBuffer*/) { 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectHalHidl::command(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov uint32_t *replySize, void *pReplyData) { 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffect == 0) return NO_INIT; 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidl_vec<uint8_t> hidlData; 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlData.setToExternal(reinterpret_cast<uint8_t*>(pCmdData), cmdSize); 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t status; 83f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffect->command(cmdCode, hidlData, *replySize, 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](int32_t s, const hidl_vec<uint8_t>& result) { 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status = s; 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (status == 0) { 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (*replySize > result.size()) *replySize = result.size(); 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (pReplyData && *replySize > 0) { 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov memcpy(pReplyData, &result[0], *replySize); 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return status; 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 96f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t EffectHalHidl::getDescriptor(effect_descriptor_t *pDescriptor) { 97f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mEffect == 0) return NO_INIT; 98f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 99f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mEffect->getDescriptor( 100f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const EffectDescriptor& result) { 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov effectDescriptorToHal(result, pDescriptor); 104f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 105f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 106e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return ret.isOk() ? analyzeResult(retval) : UNKNOWN_ERROR; 107f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 108f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 109f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 110