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#ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 18#define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 19 20#include <android/hardware/audio/4.0/types.h> 21#include <hidl/HidlSupport.h> 22#include <system/audio.h> 23#include <utils/String8.h> 24 25using ::android::hardware::audio::V4_0::ParameterValue; 26using ::android::hardware::audio::V4_0::MicrophoneInfo; 27using ::android::hardware::Return; 28using ::android::hardware::hidl_string; 29using ::android::hardware::hidl_vec; 30 31namespace android { 32namespace V4_0 { 33 34class ConversionHelperHidl { 35 protected: 36 static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys); 37 static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams); 38 static void parametersToHal(const hidl_vec<ParameterValue>& parameters, String8 *values); 39 static void microphoneInfoToHal(const MicrophoneInfo& src, 40 audio_microphone_characteristic_t *pDst); 41 42 ConversionHelperHidl(const char* className); 43 44 template<typename R, typename T> 45 status_t processReturn(const char* funcName, const Return<R>& ret, T *retval) { 46 if (ret.isOk()) { 47 // This way it also works for enum class to unscoped enum conversion. 48 *retval = static_cast<T>(static_cast<R>(ret)); 49 return OK; 50 } 51 return processReturn(funcName, ret); 52 } 53 54 template<typename T> 55 status_t processReturn(const char* funcName, const Return<T>& ret) { 56 if (!ret.isOk()) { 57 emitError(funcName, ret.description().c_str()); 58 } 59 return ret.isOk() ? OK : FAILED_TRANSACTION; 60 } 61 62 status_t processReturn(const char* funcName, const Return<hardware::audio::V4_0::Result>& ret) { 63 if (!ret.isOk()) { 64 emitError(funcName, ret.description().c_str()); 65 } 66 return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION; 67 } 68 69 template<typename T> 70 status_t processReturn( 71 const char* funcName, const Return<T>& ret, hardware::audio::V4_0::Result retval) { 72 if (!ret.isOk()) { 73 emitError(funcName, ret.description().c_str()); 74 } 75 return ret.isOk() ? analyzeResult(retval) : FAILED_TRANSACTION; 76 } 77 78 private: 79 const char* mClassName; 80 81 static status_t analyzeResult(const hardware::audio::V4_0::Result& result); 82 83 void emitError(const char* funcName, const char* description); 84}; 85 86} // namespace V4_0 87} // namespace android 88 89#endif // ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 90