DevicesFactory.cpp revision f247b8df085d6b2a50f981a062f9d376148acd5b
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 } 4210548295023bee99108e418499aff09fe578211eMikhail Naganov} 4310548295023bee99108e418499aff09fe578211eMikhail Naganov 4410548295023bee99108e418499aff09fe578211eMikhail Naganov// static 4510548295023bee99108e418499aff09fe578211eMikhail Naganovint DevicesFactory::loadAudioInterface(const char *if_name, audio_hw_device_t **dev) 4610548295023bee99108e418499aff09fe578211eMikhail Naganov{ 4710548295023bee99108e418499aff09fe578211eMikhail Naganov const hw_module_t *mod; 4810548295023bee99108e418499aff09fe578211eMikhail Naganov int rc; 4910548295023bee99108e418499aff09fe578211eMikhail Naganov 5010548295023bee99108e418499aff09fe578211eMikhail Naganov rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod); 5110548295023bee99108e418499aff09fe578211eMikhail Naganov if (rc) { 5210548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s couldn't load audio hw module %s.%s (%s)", __func__, 5310548295023bee99108e418499aff09fe578211eMikhail Naganov AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 5410548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 5510548295023bee99108e418499aff09fe578211eMikhail Naganov } 5610548295023bee99108e418499aff09fe578211eMikhail Naganov rc = audio_hw_device_open(mod, dev); 5710548295023bee99108e418499aff09fe578211eMikhail Naganov if (rc) { 5810548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s couldn't open audio hw device in %s.%s (%s)", __func__, 5910548295023bee99108e418499aff09fe578211eMikhail Naganov AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc)); 6010548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 6110548295023bee99108e418499aff09fe578211eMikhail Naganov } 6210548295023bee99108e418499aff09fe578211eMikhail Naganov if ((*dev)->common.version < AUDIO_DEVICE_API_VERSION_MIN) { 6310548295023bee99108e418499aff09fe578211eMikhail Naganov ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version); 6410548295023bee99108e418499aff09fe578211eMikhail Naganov rc = -EINVAL; 6510548295023bee99108e418499aff09fe578211eMikhail Naganov audio_hw_device_close(*dev); 6610548295023bee99108e418499aff09fe578211eMikhail Naganov goto out; 6710548295023bee99108e418499aff09fe578211eMikhail Naganov } 6810548295023bee99108e418499aff09fe578211eMikhail Naganov return OK; 6910548295023bee99108e418499aff09fe578211eMikhail Naganov 7010548295023bee99108e418499aff09fe578211eMikhail Naganovout: 7110548295023bee99108e418499aff09fe578211eMikhail Naganov *dev = NULL; 7210548295023bee99108e418499aff09fe578211eMikhail Naganov return rc; 7310548295023bee99108e418499aff09fe578211eMikhail Naganov} 7410548295023bee99108e418499aff09fe578211eMikhail Naganov 7510548295023bee99108e418499aff09fe578211eMikhail Naganov// Methods from ::android::hardware::audio::V2_0::IDevicesFactory follow. 7610548295023bee99108e418499aff09fe578211eMikhail NaganovReturn<void> DevicesFactory::openDevice(IDevicesFactory::Device device, openDevice_cb _hidl_cb) { 7710548295023bee99108e418499aff09fe578211eMikhail Naganov audio_hw_device_t *halDevice; 7810548295023bee99108e418499aff09fe578211eMikhail Naganov int halStatus = loadAudioInterface(deviceToString(device), &halDevice); 7910548295023bee99108e418499aff09fe578211eMikhail Naganov Result retval(Result::OK); 8010548295023bee99108e418499aff09fe578211eMikhail Naganov sp<IDevice> result; 8110548295023bee99108e418499aff09fe578211eMikhail Naganov if (halStatus == OK) { 8210548295023bee99108e418499aff09fe578211eMikhail Naganov if (device == IDevicesFactory::Device::PRIMARY) { 8310548295023bee99108e418499aff09fe578211eMikhail Naganov result = new PrimaryDevice(halDevice); 8410548295023bee99108e418499aff09fe578211eMikhail Naganov } else { 8510548295023bee99108e418499aff09fe578211eMikhail Naganov result = new ::android::hardware::audio::V2_0::implementation::Device(halDevice); 8610548295023bee99108e418499aff09fe578211eMikhail Naganov } 8710548295023bee99108e418499aff09fe578211eMikhail Naganov } else if (halStatus == -EINVAL) { 8810548295023bee99108e418499aff09fe578211eMikhail Naganov retval = Result::NOT_INITIALIZED; 8910548295023bee99108e418499aff09fe578211eMikhail Naganov } else { 9010548295023bee99108e418499aff09fe578211eMikhail Naganov retval = Result::INVALID_ARGUMENTS; 9110548295023bee99108e418499aff09fe578211eMikhail Naganov } 9210548295023bee99108e418499aff09fe578211eMikhail Naganov _hidl_cb(retval, result); 9310548295023bee99108e418499aff09fe578211eMikhail Naganov return Void(); 9410548295023bee99108e418499aff09fe578211eMikhail Naganov} 9510548295023bee99108e418499aff09fe578211eMikhail Naganov 9610548295023bee99108e418499aff09fe578211eMikhail NaganovIDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* /* name */) { 9710548295023bee99108e418499aff09fe578211eMikhail Naganov return new DevicesFactory(); 9810548295023bee99108e418499aff09fe578211eMikhail Naganov} 9910548295023bee99108e418499aff09fe578211eMikhail Naganov 10010548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace implementation 10110548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace V2_0 10210548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace audio 10310548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace hardware 10410548295023bee99108e418499aff09fe578211eMikhail Naganov} // namespace android 105