Home | History | Annotate | Download | only in default
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include <common/all-versions/IncludeGuard.h>
     18 #include <core/all-versions/default/Conversions.h>
     19 #include <system/audio.h>
     20 
     21 namespace android {
     22 namespace hardware {
     23 namespace audio {
     24 namespace AUDIO_HAL_VERSION {
     25 namespace implementation {
     26 
     27 /** Converts a status_t in Result according to the rules of AudioParameter::get*
     28  * Note: Static method and not private method to avoid leaking status_t dependency
     29  */
     30 static Result getHalStatusToResult(status_t status) {
     31     switch (status) {
     32         case OK:
     33             return Result::OK;
     34         case BAD_VALUE:  // Nothing was returned, probably because the HAL does
     35                          // not handle it
     36             return Result::NOT_SUPPORTED;
     37         case INVALID_OPERATION:  // Conversion from string to the requested type
     38                                  // failed
     39             return Result::INVALID_ARGUMENTS;
     40         default:  // Should not happen
     41             ALOGW("Unexpected status returned by getParam: %u", status);
     42             return Result::INVALID_ARGUMENTS;
     43     }
     44 }
     45 
     46 Result ParametersUtil::getParam(const char* name, bool* value) {
     47     String8 halValue;
     48     Result retval = getParam(name, &halValue);
     49     *value = false;
     50     if (retval == Result::OK) {
     51         if (halValue.empty()) {
     52             return Result::NOT_SUPPORTED;
     53         }
     54         *value = !(halValue == AudioParameter::valueOff);
     55     }
     56     return retval;
     57 }
     58 
     59 Result ParametersUtil::getParam(const char* name, int* value) {
     60     const String8 halName(name);
     61     AudioParameter keys;
     62     keys.addKey(halName);
     63     std::unique_ptr<AudioParameter> params = getParams(keys);
     64     return getHalStatusToResult(params->getInt(halName, *value));
     65 }
     66 
     67 Result ParametersUtil::getParam(const char* name, String8* value, AudioParameter context) {
     68     const String8 halName(name);
     69     context.addKey(halName);
     70     std::unique_ptr<AudioParameter> params = getParams(context);
     71     return getHalStatusToResult(params->get(halName, *value));
     72 }
     73 
     74 void ParametersUtil::getParametersImpl(
     75     const hidl_vec<ParameterValue>& context, const hidl_vec<hidl_string>& keys,
     76     std::function<void(Result retval, const hidl_vec<ParameterValue>& parameters)> cb) {
     77     AudioParameter halKeys;
     78     for (auto& pair : context) {
     79         halKeys.add(String8(pair.key.c_str()), String8(pair.value.c_str()));
     80     }
     81     for (size_t i = 0; i < keys.size(); ++i) {
     82         halKeys.addKey(String8(keys[i].c_str()));
     83     }
     84     std::unique_ptr<AudioParameter> halValues = getParams(halKeys);
     85     Result retval =
     86         (keys.size() == 0 || halValues->size() != 0) ? Result::OK : Result::NOT_SUPPORTED;
     87     hidl_vec<ParameterValue> result;
     88     result.resize(halValues->size());
     89     String8 halKey, halValue;
     90     for (size_t i = 0; i < halValues->size(); ++i) {
     91         status_t status = halValues->getAt(i, halKey, halValue);
     92         if (status != OK) {
     93             result.resize(0);
     94             retval = getHalStatusToResult(status);
     95             break;
     96         }
     97         result[i].key = halKey.string();
     98         result[i].value = halValue.string();
     99     }
    100     cb(retval, result);
    101 }
    102 
    103 std::unique_ptr<AudioParameter> ParametersUtil::getParams(const AudioParameter& keys) {
    104     String8 paramsAndValues;
    105     char* halValues = halGetParameters(keys.keysToString().string());
    106     if (halValues != NULL) {
    107         paramsAndValues.setTo(halValues);
    108         free(halValues);
    109     } else {
    110         paramsAndValues.clear();
    111     }
    112     return std::unique_ptr<AudioParameter>(new AudioParameter(paramsAndValues));
    113 }
    114 
    115 Result ParametersUtil::setParam(const char* name, const char* value) {
    116     AudioParameter param;
    117     param.add(String8(name), String8(value));
    118     return setParams(param);
    119 }
    120 
    121 Result ParametersUtil::setParam(const char* name, bool value) {
    122     AudioParameter param;
    123     param.add(String8(name), String8(value ? AudioParameter::valueOn : AudioParameter::valueOff));
    124     return setParams(param);
    125 }
    126 
    127 Result ParametersUtil::setParam(const char* name, int value) {
    128     AudioParameter param;
    129     param.addInt(String8(name), value);
    130     return setParams(param);
    131 }
    132 
    133 Result ParametersUtil::setParam(const char* name, float value) {
    134     AudioParameter param;
    135     param.addFloat(String8(name), value);
    136     return setParams(param);
    137 }
    138 
    139 Result ParametersUtil::setParametersImpl(const hidl_vec<ParameterValue>& context,
    140                                          const hidl_vec<ParameterValue>& parameters) {
    141     AudioParameter params;
    142     for (auto& pair : context) {
    143         params.add(String8(pair.key.c_str()), String8(pair.value.c_str()));
    144     }
    145     for (size_t i = 0; i < parameters.size(); ++i) {
    146         params.add(String8(parameters[i].key.c_str()), String8(parameters[i].value.c_str()));
    147     }
    148     return setParams(params);
    149 }
    150 Result ParametersUtil::setParam(const char* name, const DeviceAddress& address) {
    151     AudioParameter params(String8(deviceAddressToHal(address).c_str()));
    152     params.addInt(String8(name), int(address.device));
    153     return setParams(params);
    154 }
    155 
    156 Result ParametersUtil::setParams(const AudioParameter& param) {
    157     int halStatus = halSetParameters(param.toString().string());
    158     return util::analyzeStatus(halStatus);
    159 }
    160 
    161 }  // namespace implementation
    162 }  // namespace AUDIO_HAL_VERSION
    163 }  // namespace audio
    164 }  // namespace hardware
    165 }  // namespace android
    166