1f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov/* 2f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Copyright (C) 2016 The Android Open Source Project 3f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 4f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 5f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * you may not use this file except in compliance with the License. 6f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * You may obtain a copy of the License at 7f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 8f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 9f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * 10f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * Unless required by applicable law or agreed to in writing, software 11f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 12f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * See the License for the specific language governing permissions and 14f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov * limitations under the License. 15f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov */ 16f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 17f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <string.h> 18f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 19f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#define LOG_TAG "DevicesFactoryHalHidl" 20f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov//#define LOG_NDEBUG 0 21f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 22f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <android/hardware/audio/2.0/IDevice.h> 23d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <media/audiohal/hidl/HalDeathHandler.h> 24f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include <utils/Log.h> 25f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 269f57e3c9da8923649adff62e63c644537f565e90Mikhail Naganov#include "ConversionHelperHidl.h" 27f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "DeviceHalHidl.h" 28f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov#include "DevicesFactoryHalHidl.h" 29f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 30f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::V2_0::IDevice; 31f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::audio::V2_0::Result; 32f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovusing ::android::hardware::Return; 33f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 34f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovnamespace android { 35f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 36f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovDevicesFactoryHalHidl::DevicesFactoryHalHidl() { 37eea329e9db5244e4156f9f2a066362c47ff23c63Chris Phoenix mDevicesFactory = IDevicesFactory::getService(); 38d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov if (mDevicesFactory != 0) { 39425a50282ebdcc68a4fc01a268be87426889152eMikhail Naganov // It is assumed that DevicesFactory is owned by AudioFlinger 40d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov // and thus have the same lifespan. 41d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov mDevicesFactory->linkToDeath(HalDeathHandler::getInstance(), 0 /*cookie*/); 42425a50282ebdcc68a4fc01a268be87426889152eMikhail Naganov } else { 431ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov ALOGE("Failed to obtain IDevicesFactory service, terminating process."); 441ba4041b6248aff42c01d27832995ebdf431bbd1Mikhail Naganov exit(1); 45d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov } 46f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 47f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 48f558e0218d2677a813c9c600886f673894eec927Mikhail NaganovDevicesFactoryHalHidl::~DevicesFactoryHalHidl() { 49f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 50f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 51f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov// static 52f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t DevicesFactoryHalHidl::nameFromHal(const char *name, IDevicesFactory::Device *device) { 53f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (strcmp(name, AUDIO_HARDWARE_MODULE_ID_PRIMARY) == 0) { 54f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *device = IDevicesFactory::Device::PRIMARY; 55f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 56f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_A2DP) == 0) { 57f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *device = IDevicesFactory::Device::A2DP; 58f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 59f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_USB) == 0) { 60f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *device = IDevicesFactory::Device::USB; 61f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 62f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX) == 0) { 63f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *device = IDevicesFactory::Device::R_SUBMIX; 64f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return OK; 65cb9d2eb0a725fccc6fbee005f2e084b71279da16Eric Laurent } else if(strcmp(name, AUDIO_HARDWARE_MODULE_ID_STUB) == 0) { 66cb9d2eb0a725fccc6fbee005f2e084b71279da16Eric Laurent *device = IDevicesFactory::Device::STUB; 67cb9d2eb0a725fccc6fbee005f2e084b71279da16Eric Laurent return OK; 68f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 69f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov ALOGE("Invalid device name %s", name); 70f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov return BAD_VALUE; 71f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 72f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 73f558e0218d2677a813c9c600886f673894eec927Mikhail Naganovstatus_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterface> *device) { 74f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (mDevicesFactory == 0) return NO_INIT; 75f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov IDevicesFactory::Device hidlDevice; 76f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov status_t status = nameFromHal(name, &hidlDevice); 77f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (status != OK) return status; 78f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 79f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov Return<void> ret = mDevicesFactory->openDevice( 80f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov hidlDevice, 81f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov [&](Result r, const sp<IDevice>& result) { 82f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov retval = r; 83f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) { 84f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov *device = new DeviceHalHidl(result); 85f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 86f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov }); 87e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (ret.isOk()) { 88f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov if (retval == Result::OK) return OK; 89f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else if (retval == Result::INVALID_ARGUMENTS) return BAD_VALUE; 90f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov else return NO_INIT; 91f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov } 92d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 93f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} 94f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov 95f558e0218d2677a813c9c600886f673894eec927Mikhail Naganov} // namespace android 96