110548295023bee99108e418499aff09fe578211eMikhail Naganov/* 210548295023bee99108e418499aff09fe578211eMikhail Naganov * Copyright (C) 2016 The Android Open Source Project 310548295023bee99108e418499aff09fe578211eMikhail Naganov * 410548295023bee99108e418499aff09fe578211eMikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 510548295023bee99108e418499aff09fe578211eMikhail Naganov * you may not use this file except in compliance with the License. 610548295023bee99108e418499aff09fe578211eMikhail Naganov * You may obtain a copy of the License at 710548295023bee99108e418499aff09fe578211eMikhail Naganov * 810548295023bee99108e418499aff09fe578211eMikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 910548295023bee99108e418499aff09fe578211eMikhail Naganov * 1010548295023bee99108e418499aff09fe578211eMikhail Naganov * Unless required by applicable law or agreed to in writing, software 1110548295023bee99108e418499aff09fe578211eMikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 1210548295023bee99108e418499aff09fe578211eMikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1310548295023bee99108e418499aff09fe578211eMikhail Naganov * See the License for the specific language governing permissions and 1410548295023bee99108e418499aff09fe578211eMikhail Naganov * limitations under the License. 1510548295023bee99108e418499aff09fe578211eMikhail Naganov */ 1610548295023bee99108e418499aff09fe578211eMikhail Naganov 1710548295023bee99108e418499aff09fe578211eMikhail Naganov#define LOG_TAG "DevicesFactoryHAL" 1810548295023bee99108e418499aff09fe578211eMikhail Naganov 1910548295023bee99108e418499aff09fe578211eMikhail Naganov#include <string.h> 2010548295023bee99108e418499aff09fe578211eMikhail Naganov 21f9d303435d80161fabb16cdff3b8f2f75f362480Yifan Hong#include <android/log.h> 2210548295023bee99108e418499aff09fe578211eMikhail Naganov 2310548295023bee99108e418499aff09fe578211eMikhail Naganov#include "Device.h" 2410548295023bee99108e418499aff09fe578211eMikhail Naganov#include "DevicesFactory.h" 2510548295023bee99108e418499aff09fe578211eMikhail Naganov#include "PrimaryDevice.h" 2610548295023bee99108e418499aff09fe578211eMikhail Naganov 2710548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace android { 2810548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace hardware { 2910548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace audio { 3010548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace V2_0 { 3110548295023bee99108e418499aff09fe578211eMikhail Naganovnamespace implementation { 3210548295023bee99108e418499aff09fe578211eMikhail Naganov 3310548295023bee99108e418499aff09fe578211eMikhail Naganov// static 3410548295023bee99108e418499aff09fe578211eMikhail Naganovconst char* DevicesFactory::deviceToString(IDevicesFactory::Device device) { 3510548295023bee99108e418499aff09fe578211eMikhail Naganov switch (device) { 3610548295023bee99108e418499aff09fe578211eMikhail Naganov case IDevicesFactory::Device::PRIMARY: return AUDIO_HARDWARE_MODULE_ID_PRIMARY; 3710548295023bee99108e418499aff09fe578211eMikhail Naganov case IDevicesFactory::Device::A2DP: return AUDIO_HARDWARE_MODULE_ID_A2DP; 3810548295023bee99108e418499aff09fe578211eMikhail Naganov case IDevicesFactory::Device::USB: return AUDIO_HARDWARE_MODULE_ID_USB; 3910548295023bee99108e418499aff09fe578211eMikhail Naganov case IDevicesFactory::Device::R_SUBMIX: return AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX; 40f247b8df085d6b2a50f981a062f9d376148acd5bEric Laurent case IDevicesFactory::Device::STUB: return AUDIO_HARDWARE_MODULE_ID_STUB; 4110548295023bee99108e418499aff09fe578211eMikhail Naganov } 428604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov return nullptr; 4310548295023bee99108e418499aff09fe578211eMikhail Naganov} 4410548295023bee99108e418499aff09fe578211eMikhail Naganov 4510548295023bee99108e418499aff09fe578211eMikhail Naganov// static 4610548295023bee99108e418499aff09fe578211eMikhail Naganovint DevicesFactory::loadAudioInterface(const char *if_name, audio_hw_device_t **dev) 4710548295023bee99108e418499aff09fe578211eMikhail Naganov{ 4810548295023bee99108e418499aff09fe578211eMikhail Naganov const hw_module_t *mod; 4910548295023bee99108e418499aff09fe578211eMikhail Naganov int rc; 5010548295023bee99108e418499aff09fe578211eMikhail Naganov 5110548295023bee99108e418499aff09fe578211eMikhail Naganov rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod); 5210548295023bee99108e418499aff09fe578211eMikhail Naganov if (rc) { 5310548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s couldn't load audio hw module %s.%s (%s)", __func__, 5410548295023bee99108e418499aff09fe578211eMikhail Naganov AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 5510548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 5610548295023bee99108e418499aff09fe578211eMikhail Naganov } 5710548295023bee99108e418499aff09fe578211eMikhail Naganov rc = audio_hw_device_open(mod, dev); 5810548295023bee99108e418499aff09fe578211eMikhail Naganov if (rc) { 5910548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s couldn't open audio hw device in %s.%s (%s)", __func__, 6010548295023bee99108e418499aff09fe578211eMikhail Naganov AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 6110548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 6210548295023bee99108e418499aff09fe578211eMikhail Naganov } 6310548295023bee99108e418499aff09fe578211eMikhail Naganov if ((*dev)->common.version < AUDIO_DEVICE_API_VERSION_MIN) { 6410548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version); 6510548295023bee99108e418499aff09fe578211eMikhail Naganov rc = -EINVAL; 6610548295023bee99108e418499aff09fe578211eMikhail Naganov audio_hw_device_close(*dev); 6710548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 6810548295023bee99108e418499aff09fe578211eMikhail Naganov } 6910548295023bee99108e418499aff09fe578211eMikhail Naganov return OK; 7010548295023bee99108e418499aff09fe578211eMikhail Naganov 7110548295023bee99108e418499aff09fe578211eMikhail Naganovout: 7210548295023bee99108e418499aff09fe578211eMikhail Naganov *dev = NULL; 7310548295023bee99108e418499aff09fe578211eMikhail Naganov return rc; 7410548295023bee99108e418499aff09fe578211eMikhail Naganov} 7510548295023bee99108e418499aff09fe578211eMikhail Naganov 7610548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IDevicesFactory follow. 7710548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> DevicesFactory::openDevice(IDevicesFactory::Device device, openDevice_cb _hidl_cb) { 7810548295023bee99108e418499aff09fe578211eMikhail Naganov audio_hw_device_t *halDevice; 798604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov Result retval(Result::INVALID_ARGUMENTS); 8010548295023bee99108e418499aff09fe578211eMikhail Naganov sp<IDevice> result; 818604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov const char* moduleName = deviceToString(device); 828604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov if (moduleName != nullptr) { 838604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov int halStatus = loadAudioInterface(moduleName, &halDevice); 848604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov if (halStatus == OK) { 858604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov if (device == IDevicesFactory::Device::PRIMARY) { 868604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov result = new PrimaryDevice(halDevice); 878604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov } else { 888604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov result = new ::android::hardware::audio::V2_0::implementation:: 89f811acf049b785ccce05a9fca9e01aa2031ab357Mikhail Naganov Device(halDevice); 908604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov } 918604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov retval = Result::OK; 928604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov } else if (halStatus == -EINVAL) { 938604a738a79d9caf8b57773a7bcc2ef99a8a624dMikhail Naganov retval = Result::NOT_INITIALIZED; 9410548295023bee99108e418499aff09fe578211eMikhail Naganov } 9510548295023bee99108e418499aff09fe578211eMikhail Naganov } 9610548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, result); 9710548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 9810548295023bee99108e418499aff09fe578211eMikhail Naganov} 9910548295023bee99108e418499aff09fe578211eMikhail Naganov 10010548295023bee99108e418499aff09fe578211eMikhail NaganovIDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* /* name */) { 10110548295023bee99108e418499aff09fe578211eMikhail Naganov return new DevicesFactory(); 10210548295023bee99108e418499aff09fe578211eMikhail Naganov} 10310548295023bee99108e418499aff09fe578211eMikhail Naganov 10410548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 10510548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 10610548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 10710548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 10810548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 109