DevicesFactoryHalHidl.cpp revision eea329e9db5244e4156f9f2a066362c47ff23c63
144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin/*
244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Copyright (C) 2016 The Android Open Source Project
344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Licensed under the Apache License, Version 2.0 (the "License");
544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * you may not use this file except in compliance with the License.
644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * You may obtain a copy of the License at
744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *      http://www.apache.org/licenses/LICENSE-2.0
944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin *
1044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * Unless required by applicable law or agreed to in writing, software
1144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * distributed under the License is distributed on an "AS IS" BASIS,
1244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * See the License for the specific language governing permissions and
1444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin * limitations under the License.
1544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin */
1644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
1744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <string.h>
1844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
1944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#define LOG_TAG "DevicesFactoryHalHidl"
2044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin//#define LOG_NDEBUG 0
21e5729fac81c8a984e984fefc90afc64135817d4fColin Cross
22e5729fac81c8a984e984fefc90afc64135817d4fColin Cross#include <android/hardware/audio/2.0/IDevice.h>
2344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <media/audiohal/hidl/HalDeathHandler.h>
2444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include <utils/Log.h>
2544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
2644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "ConversionHelperHidl.h"
2744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "DeviceHalHidl.h"
2844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin#include "DevicesFactoryHalHidl.h"
2944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalausing ::android::hardware::audio::V2_0::IDevice;
317b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalausing ::android::hardware::audio::V2_0::Result;
327b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalausing ::android::hardware::Return;
33e7ee7637747371635a85fedd24d2190bb1f38651Igor Murashkinusing ::android::hardware::Status;
34d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala
3544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinnamespace android {
3644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
3744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// static
3844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinsp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
3944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return new DevicesFactoryHalHidl();
4044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}
4144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
4244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinDevicesFactoryHalHidl::DevicesFactoryHalHidl() {
4344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    mDevicesFactory = IDevicesFactory::getService();
4444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    if (mDevicesFactory != 0) {
4544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        // It is assumet that DevicesFactory is owned by AudioFlinger
4644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        // and thus have the same lifespan.
4744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        mDevicesFactory->linkToDeath(HalDeathHandler::getInstance(), 0 /*cookie*/);
4844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    }
4944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}
502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala
5144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor MurashkinDevicesFactoryHalHidl::~DevicesFactoryHalHidl() {
5244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}
5344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
5444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin// static
5544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t DevicesFactoryHalHidl::nameFromHal(const char *name, IDevicesFactory::Device *device) {
5644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    if (strcmp(name, AUDIO_HARDWARE_MODULE_ID_PRIMARY) == 0) {
57cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        *device = IDevicesFactory::Device::PRIMARY;
582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala        return OK;
59412fe56cd7cf7d73bc5d2bcc3f635bc650d18de9Eino-Ville Talvala    } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_A2DP) == 0) {
6044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        *device = IDevicesFactory::Device::A2DP;
612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala        return OK;
62b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala    } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_USB) == 0) {
6398e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin        *device = IDevicesFactory::Device::USB;
64b9d2f3333369183344aa89c7be1e643a44296d48Eino-Ville Talvala        return OK;
65d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX) == 0) {
6698e24724fb77445d4d015a5fec4ecbd5b49abc9bIgor Murashkin        *device = IDevicesFactory::Device::R_SUBMIX;
6744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        return OK;
6844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_STUB) == 0) {
6944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        *device = IDevicesFactory::Device::STUB;
7044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin        return OK;
7144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    }
7244cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    ALOGE("Invalid device name %s", name);
7344cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    return BAD_VALUE;
7444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin}
7544cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
7644cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkinstatus_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterface> *device) {
7744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    if (mDevicesFactory == 0) return NO_INIT;
7844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    IDevicesFactory::Device hidlDevice;
7944cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    status_t status = nameFromHal(name, &hidlDevice);
8044cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    if (status != OK) return status;
8144cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    Result retval = Result::NOT_INITIALIZED;
82e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh    Return<void> ret = mDevicesFactory->openDevice(
832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala            hidlDevice,
842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala            [&](Result r, const sp<IDevice>& result) {
852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala                retval = r;
862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala                if (retval == Result::OK) {
872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala                    *device = new DeviceHalHidl(result);
882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala                }
892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala            });
902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    if (ret.isOk()) {
912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala        if (retval == Result::OK) return OK;
922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala        else if (retval == Result::INVALID_ARGUMENTS) return BAD_VALUE;
932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala        else return NO_INIT;
9444cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin    }
952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala    return FAILED_TRANSACTION;
962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala}
9744cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin
9844cfcf00b9008c1c04f4c8277c6c06af039fd976Igor Murashkin} // namespace android
99e6800cea0678dbc0bf697b44c3e4548b0253085cIgor Murashkin