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