/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ParametersUtil.h" namespace android { namespace hardware { namespace audio { namespace V2_0 { namespace implementation { Result ParametersUtil::getParam(const char* name, bool* value) { String8 halValue; Result retval = getParam(name, &halValue); *value = false; if (retval == Result::OK) { *value = !(halValue == AudioParameter::valueOff); } return retval; } Result ParametersUtil::getParam(const char* name, int* value) { const String8 halName(name); AudioParameter keys; keys.addKey(halName); std::unique_ptr params = getParams(keys); status_t halStatus = params->getInt(halName, *value); return halStatus == OK ? Result::OK : Result::INVALID_ARGUMENTS; } Result ParametersUtil::getParam(const char* name, String8* value) { const String8 halName(name); AudioParameter keys; keys.addKey(halName); std::unique_ptr params = getParams(keys); status_t halStatus = params->get(halName, *value); return halStatus == OK ? Result::OK : Result::INVALID_ARGUMENTS; } void ParametersUtil::getParametersImpl( const hidl_vec& keys, std::function& parameters)> cb) { AudioParameter halKeys; for (size_t i = 0; i < keys.size(); ++i) { halKeys.addKey(String8(keys[i].c_str())); } std::unique_ptr halValues = getParams(halKeys); Result retval(Result::INVALID_ARGUMENTS); hidl_vec result; if (halValues->size() > 0) { result.resize(halValues->size()); String8 halKey, halValue; for (size_t i = 0; i < halValues->size(); ++i) { status_t status = halValues->getAt(i, halKey, halValue); if (status != OK) { result.resize(0); break; } result[i].key = halKey.string(); result[i].value = halValue.string(); } if (result.size() != 0) { retval = Result::OK; } } cb(retval, result); } std::unique_ptr ParametersUtil::getParams(const AudioParameter& keys) { String8 paramsAndValues; char *halValues = halGetParameters(keys.keysToString().string()); if (halValues != NULL) { paramsAndValues.setTo(halValues); free(halValues); } else { paramsAndValues.clear(); } return std::unique_ptr(new AudioParameter(paramsAndValues)); } Result ParametersUtil::setParam(const char* name, bool value) { AudioParameter param; param.add(String8(name), String8(value ? AudioParameter::valueOn : AudioParameter::valueOff)); return setParams(param); } Result ParametersUtil::setParam(const char* name, int value) { AudioParameter param; param.addInt(String8(name), value); return setParams(param); } Result ParametersUtil::setParam(const char* name, const char* value) { AudioParameter param; param.add(String8(name), String8(value)); return setParams(param); } Result ParametersUtil::setParametersImpl(const hidl_vec& parameters) { AudioParameter params; for (size_t i = 0; i < parameters.size(); ++i) { params.add(String8(parameters[i].key.c_str()), String8(parameters[i].value.c_str())); } return setParams(params); } Result ParametersUtil::setParams(const AudioParameter& param) { int halStatus = halSetParameters(param.toString().string()); if (halStatus == OK) return Result::OK; else if (halStatus == -ENOSYS) return Result::INVALID_STATE; else return Result::INVALID_ARGUMENTS; } } // namespace implementation } // namespace V2_0 } // namespace audio } // namespace hardware } // namespace android