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#include <string.h> 18f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 19f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#define LOG_TAG "HalHidl" 20f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <media/AudioParameter.h> 21f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <utils/Log.h> 22f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 23f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "ConversionHelperHidl.h" 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::V2_0::Result; 26f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t ConversionHelperHidl::keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys) { 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov AudioParameter halKeys(keys); 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (halKeys.size() == 0) return BAD_VALUE; 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlKeys->resize(halKeys.size()); 343ed9daf7766fac289c891387479648052390f1daEric Laurent //FIXME: keyStreamSupportedChannels and keyStreamSupportedSamplingRates come with a 353ed9daf7766fac289c891387479648052390f1daEric Laurent // "keyFormat=<value>" pair. We need to transform it into a single key string so that it is 363ed9daf7766fac289c891387479648052390f1daEric Laurent // carried over to the legacy HAL via HIDL. 373ed9daf7766fac289c891387479648052390f1daEric Laurent String8 value; 383ed9daf7766fac289c891387479648052390f1daEric Laurent bool keepFormatValue = halKeys.size() == 2 && 393ed9daf7766fac289c891387479648052390f1daEric Laurent (halKeys.get(String8(AudioParameter::keyStreamSupportedChannels), value) == NO_ERROR || 403ed9daf7766fac289c891387479648052390f1daEric Laurent halKeys.get(String8(AudioParameter::keyStreamSupportedSamplingRates), value) == NO_ERROR); 413ed9daf7766fac289c891387479648052390f1daEric Laurent 42f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov for (size_t i = 0; i < halKeys.size(); ++i) { 43f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov String8 key; 44f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t status = halKeys.getAt(i, key); 45f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (status != OK) return status; 463ed9daf7766fac289c891387479648052390f1daEric Laurent if (keepFormatValue && key == AudioParameter::keyFormat) { 473ed9daf7766fac289c891387479648052390f1daEric Laurent AudioParameter formatParam; 483ed9daf7766fac289c891387479648052390f1daEric Laurent halKeys.getAt(i, key, value); 493ed9daf7766fac289c891387479648052390f1daEric Laurent formatParam.add(key, value); 503ed9daf7766fac289c891387479648052390f1daEric Laurent key = formatParam.toString(); 513ed9daf7766fac289c891387479648052390f1daEric Laurent } 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov (*hidlKeys)[i] = key.string(); 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t ConversionHelperHidl::parametersFromHal( 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams) { 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov AudioParameter params(kvPairs); 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (params.size() == 0) return BAD_VALUE; 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlParams->resize(params.size()); 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov for (size_t i = 0; i < params.size(); ++i) { 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov String8 key, value; 65f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t status = params.getAt(i, key, value); 66f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (status != OK) return status; 67f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov (*hidlParams)[i].key = key.string(); 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov (*hidlParams)[i].value = value.string(); 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovvoid ConversionHelperHidl::parametersToHal( 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov const hidl_vec<ParameterValue>& parameters, String8 *values) { 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov AudioParameter params; 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov for (size_t i = 0; i < parameters.size(); ++i) { 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov params.add(String8(parameters[i].key.c_str()), String8(parameters[i].value.c_str())); 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov values->setTo(params.toString()); 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 83f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovConversionHelperHidl::ConversionHelperHidl(const char* className) 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov : mClassName(className) { 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 87f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t ConversionHelperHidl::analyzeResult(const Result& result) { 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov switch (result) { 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::OK: return OK; 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::INVALID_ARGUMENTS: return BAD_VALUE; 92f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::INVALID_STATE: return NOT_ENOUGH_DATA; 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::NOT_INITIALIZED: return NO_INIT; 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov case Result::NOT_SUPPORTED: return INVALID_OPERATION; 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov default: return NO_INIT; 96f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 97f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 98f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 99e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Morelandvoid ConversionHelperHidl::emitError(const char* funcName, const char* description) { 100e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("%s %p %s: %s (from rpc)", mClassName, this, funcName, description); 101f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 102f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 103f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 104