IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Audio代码分析(4): audiohalservice 启动 -> 正文阅读

[移动开发]Android Audio代码分析(4): audiohalservice 启动

hal interface

?IDeviceFactory openDevice得到IDevice, IDevice openInput/outputStream得到IStream

?android.hardware.audio.service

存在形式

hardware/interfaces/audio/common/all-versions/default/service/android.hardware.audio.service.rc
service vendor.audio-hal /vendor/bin/hw/android.hardware.audio.service
? ? class hal
? ? user audioserver


hardware/interfaces/audio/common/all-versions/default/service/Android.bp
cc_binary {
? ? name: "android.hardware.audio.service",
? ? init_rc: ["android.hardware.audio.service.rc"],
? ? vendor: true,
? ? srcs: ["service.cpp"],
}

在同一个进程启动了多个service

int main(int /* argc */, char* /* argv */ []) {
? ? ::android::ProcessState::initWithDriver("/dev/vndbinder");
? ? // start a threadpool for vndbinder interactions
? ? ::android::ProcessState::self()->startThreadPool();
? ? const std::vector<InterfacesList> mandatoryInterfaces = {
? ? ? ? {
? ? ? ? ? ? "Audio Core API",
? ? ? ? ? ? "android.hardware.audio@6.0::IDevicesFactory",
? ? ? ? ? ? "android.hardware.audio@5.0::IDevicesFactory",
? ? ? ? ? ? "android.hardware.audio@4.0::IDevicesFactory",
? ? ? ? ? ? "android.hardware.audio@2.0::IDevicesFactory"
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "Audio Effect API",
? ? ? ? ? ? "android.hardware.audio.effect@6.0::IEffectsFactory",
? ? ? ? ? ? "android.hardware.audio.effect@5.0::IEffectsFactory",
? ? ? ? ? ? "android.hardware.audio.effect@4.0::IEffectsFactory",
? ? ? ? ? ? "android.hardware.audio.effect@2.0::IEffectsFactory",
? ? ? ? }
? ? };

? ? const std::vector<InterfacesList> optionalInterfaces = {
? ? ? ? {
? ? ? ? ? ? "Soundtrigger API",
? ? ? ? ? ? "android.hardware.soundtrigger@2.3::ISoundTriggerHw",
? ? ? ? ? ? "android.hardware.soundtrigger@2.2::ISoundTriggerHw",
? ? ? ? ? ? "android.hardware.soundtrigger@2.1::ISoundTriggerHw",
? ? ? ? ? ? "android.hardware.soundtrigger@2.0::ISoundTriggerHw",
? ? ? ? },
? ? ? ? {
? ? ? ? ? ? "Bluetooth Audio API",
? ? ? ? ? ? "android.hardware.bluetooth.audio@2.0::IBluetoothAudioProvidersFactory"
? ? ? ? },
? ? ? ? // remove the old HIDL when Bluetooth Audio Hal V2 has offloading supported
? ? ? ? {
? ? ? ? ? ? "Bluetooth Audio Offload API",
? ? ? ? ? ? "android.hardware.bluetooth.a2dp@1.0::IBluetoothAudioOffload"
? ? ? ? }
? ? };

? ? for (const auto& listIter : mandatoryInterfaces) {
? ? ? ? auto iter = listIter.begin();
? ? ? ? const std::string& interfaceFamilyName = *iter++;
? ? ? ? LOG_ALWAYS_FATAL_IF(!registerPassthroughServiceImplementations(iter, listIter.end()),
? ? ? ? ? ? ? ? ? ? ? ? ? ? "Could not register %s", interfaceFamilyName.c_str());
? ? }

? ? for (const auto& listIter : optionalInterfaces) {
? ? ? ? auto iter = listIter.begin();
? ? ? ? const std::string& interfaceFamilyName = *iter++;
? ? ? ? ALOGW_IF(!registerPassthroughServiceImplementations(iter, listIter.end()),
? ? ? ? ? ? ? ? ?"Could not register %s", interfaceFamilyName.c_str());
? ? }

? ? joinRpcThreadpool();
}
?

registerPassthroughServiceImplementation的实现

https://www.programminghunter.com/article/7441427492/
https://blog.csdn.net/u013928208/article/details/81667162

HIDL_FETCH_IDevicesFactory是怎样别调到的?
registerPassthroughServiceImplementation的实现
system/libhidl/transport/LegacySupport.cpp

registerPassthroughServiceImplementation ->?
getRawServiceInternal ->?
getPassthroughServiceManager ->
(system/libhidl/transport/ServiceManagement.cpp)
IServiceManager1_1::openLibs {
? ? ? ? const std::string prefix = packageAndVersion + "-impl";
? ? ? ? const std::string sym = "HIDL_FETCH_" + ifaceName;
}

hardware/interfaces/audio/effect/all-versions/default/Android.bp
cc_library_shared {
? ? name: "android.hardware.audio.effect@6.0-impl",
? ? defaults: ["android.hardware.audio.effect-impl_default"],
? ? shared_libs: [
? ? ? ? "android.hardware.audio.common@6.0",
? ? ? ? "android.hardware.audio.common@6.0-util",
? ? ? ? "android.hardware.audio.effect@6.0",
? ? ],
}

hardware/interfaces/audio/core/all-versions/default/DevicesFactory.cpp
IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) {
? ? return strcmp(name, "default") == 0 ? new DevicesFactory() : nullptr;
}

DevicesFactoryHalHybrid::openDevice 的实现

status_t DevicesFactoryHalHybrid::openDevice(const char *name, sp<DeviceHalInterface> *device) {
? ? if (mHidlFactory != 0 && strcmp(AUDIO_HARDWARE_MODULE_ID_A2DP, name) != 0 &&
? ? ? ? strcmp(AUDIO_HARDWARE_MODULE_ID_HEARING_AID, name) != 0) {
? ? ? ? return mHidlFactory->openDevice(name, device);
? ? }
? ? return mLocalFactory->openDevice(name, device);
}

/**
?* List of known audio HAL modules. This is the base name of the audio HAL
?* library composed of the "audio." prefix, one of the base names below and
?* a suffix specific to the device.
?* e.g: audio.primary.goldfish.so or audio.a2dp.default.so
?*
?* The same module names are used in audio policy configuration files.
?*/
#define AUDIO_HARDWARE_MODULE_ID_PRIMARY "primary"
#define AUDIO_HARDWARE_MODULE_ID_A2DP "a2dp"
#define AUDIO_HARDWARE_MODULE_ID_USB "usb"
#define AUDIO_HARDWARE_MODULE_ID_REMOTE_SUBMIX "r_submix"
#define AUDIO_HARDWARE_MODULE_ID_CODEC_OFFLOAD "codec_offload"
#define AUDIO_HARDWARE_MODULE_ID_STUB "stub"
#define AUDIO_HARDWARE_MODULE_ID_HEARING_AID "hearing_aid"
#define AUDIO_HARDWARE_MODULE_ID_MSD "msd"

mHidlFactory->openDevice(name, device)的实现
status_t DevicesFactoryHalHidl::openDevice(const char *name, sp<DeviceHalInterface> *device) {
? ? auto factories = copyDeviceFactories();
? ? if (factories.empty()) return NO_INIT;
? ? status_t status;
? ? auto hidlId = idFromHal(name, &status);
? ? if (status != OK) return status;
? ? Result retval = Result::NOT_INITIALIZED;
? ? for (const auto& factory : factories) {
? ? ? ? Return<void> ret = factory->openDevice(
? ? ? ? ? ? ? ? hidlId,
? ? ? ? ? ? ? ? [&](Result r, const sp<IDevice>& result) {
? ? ? ? ? ? ? ? ? ? retval = r;
? ? ? ? ? ? ? ? ? ? if (retval == Result::OK) { //在回调函数里 hidl service 把生成的 IDevice作为参数
?? ??? ??? ??? ??? ??? ?//调用new DeviceHalHidl(IDevice)
? ? ? ? ? ? ? ? ? ? ? ? *device = new DeviceHalHidl(result);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? });
? ? }
? ? ALOGW("The specified device name is not recognized: \"%s\"", name);
? ? return BAD_VALUE;
}

hardware/interfaces/audio/core/all-versions/default/DevicesFactory.cpp
template <class DeviceShim, class Callback>
Return<void> DevicesFactory::openDevice(const char* moduleName, Callback _hidl_cb) {
? ? audio_hw_device_t* halDevice;

? ? sp<DeviceShim> result;
? ? int halStatus = loadAudioInterface(moduleName, &halDevice);
? ? if (halStatus == OK) {
? ? ? ? result = new DeviceShim(halDevice);
? ? ? ? retval = Result::OK;
? ? }

? ? _hidl_cb(retval, result);
? ? return Void();
}

hardware device的框架
int DevicesFactory::loadAudioInterface(const char* if_name, audio_hw_device_t** dev) {
? ? const hw_module_t* mod;
? ? int rc;

? ? rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID: "audio", if_name, &mod);

? ? rc = audio_hw_device_open(mod, dev);

? ? return OK;
}
?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 16:42:49  更:2021-08-12 16:45:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 21:39:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码