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