14bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard/* 24bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Copyright (C) 2016 The Android Open Source Project 34bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 44bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Licensed under the Apache License, Version 2.0 (the "License"); 54bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * you may not use this file except in compliance with the License. 64bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * You may obtain a copy of the License at 74bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 84bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * http://www.apache.org/licenses/LICENSE-2.0 94bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * 104bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * Unless required by applicable law or agreed to in writing, software 114bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * distributed under the License is distributed on an "AS IS" BASIS, 124bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * See the License for the specific language governing permissions and 144bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard * limitations under the License. 154bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard */ 164bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 1751e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard#ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 1851e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard#define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 194bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 2051e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard#include <android/hardware/audio/4.0/types.h> 214bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#include <hidl/HidlSupport.h> 229ff780e58ff96ff98acaae4166bb218880bf9e73jiabin#include <system/audio.h> 234bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard#include <utils/String8.h> 244bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 2551e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocardusing ::android::hardware::audio::V4_0::ParameterValue; 269ff780e58ff96ff98acaae4166bb218880bf9e73jiabinusing ::android::hardware::audio::V4_0::MicrophoneInfo; 274bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::Return; 284bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::hidl_string; 294bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardusing ::android::hardware::hidl_vec; 304bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 314bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardnamespace android { 3251e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocardnamespace V4_0 { 334bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 344bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocardclass ConversionHelperHidl { 354bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard protected: 364bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys); 374bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams); 384bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard static void parametersToHal(const hidl_vec<ParameterValue>& parameters, String8 *values); 399ff780e58ff96ff98acaae4166bb218880bf9e73jiabin static void microphoneInfoToHal(const MicrophoneInfo& src, 409ff780e58ff96ff98acaae4166bb218880bf9e73jiabin audio_microphone_characteristic_t *pDst); 414bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 424bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard ConversionHelperHidl(const char* className); 434bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 444bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename R, typename T> 454bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn(const char* funcName, const Return<R>& ret, T *retval) { 464bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (ret.isOk()) { 474bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard // This way it also works for enum class to unscoped enum conversion. 484bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard *retval = static_cast<T>(static_cast<R>(ret)); 494bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return OK; 504bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 514bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return processReturn(funcName, ret); 524bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 534bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 544bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename T> 554bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn(const char* funcName, const Return<T>& ret) { 564bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 574bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 584bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 594bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? OK : FAILED_TRANSACTION; 604bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 614bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 6251e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard status_t processReturn(const char* funcName, const Return<hardware::audio::V4_0::Result>& ret) { 634bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 644bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 654bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 664bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION; 674bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 684bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 694bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard template<typename T> 704bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard status_t processReturn( 7151e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard const char* funcName, const Return<T>& ret, hardware::audio::V4_0::Result retval) { 724bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard if (!ret.isOk()) { 734bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard emitError(funcName, ret.description().c_str()); 744bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 754bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard return ret.isOk() ? analyzeResult(retval) : FAILED_TRANSACTION; 764bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard } 774bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 784bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard private: 794bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard const char* mClassName; 804bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 8151e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard static status_t analyzeResult(const hardware::audio::V4_0::Result& result); 824bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 834bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard void emitError(const char* funcName, const char* description); 844bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard}; 854bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 8651e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard} // namespace V4_0 874bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard} // namespace android 884bcd67fbb4eca3654ea929742bdf6ccc7c70daecKevin Rocard 8951e076a8fc69d4275cabc3e6d54eab44d590280dKevin Rocard#endif // ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_4_0_H 90