android 音频加载hal so调试

1. 整个加载流程图

调用关系图

2. 加载hal so的代码位置

2.1 在audiopolicymanager中的加载位置

diff --git a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index 632290a933..54ead728ea 100644
--- a/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -4110,6 +4110,7 @@ status_t AudioPolicyManager::initialize() {audio_devices_t inputDeviceTypes = mAvailableInputDevices.types() & ~AUDIO_DEVICE_BIT_IN;for (const auto& hwModule : mHwModulesAll) {hwModule->setHandle(mpClientInterface->loadHwModule(hwModule->getName()));
+        ALOGW("===weiqifa=== loadHwModule() %s", hwModule->getName());if (hwModule->getHandle() == AUDIO_MODULE_HANDLE_NONE) {ALOGW("could not open HW module %s", hwModule->getName());continue;

在这里插入图片描述

2.2 在audioflinger中加载

AudioFlinger.cpp

audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
{if (name == NULL) {return AUDIO_MODULE_HANDLE_NONE;}if (!settingsAllowed()) {return AUDIO_MODULE_HANDLE_NONE;}Mutex::Autolock _l(mLock);return loadHwModule_l(name);
}// loadHwModule_l() must be called with AudioFlinger::mLock held
audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
{for (size_t i = 0; i < mAudioHwDevs.size(); i++) {if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {ALOGW("loadHwModule() module %s already loaded", name);return mAudioHwDevs.keyAt(i);}}sp<DeviceHalInterface> dev;int rc = mDevicesFactoryHal->openDevice(name, &dev);if (rc) {ALOGE("loadHwModule() error %d loading module %s", rc, name);return AUDIO_MODULE_HANDLE_NONE;}mHardwareStatus = AUDIO_HW_INIT;rc = dev->initCheck();mHardwareStatus = AUDIO_HW_IDLE;if (rc) {ALOGE("loadHwModule() init check error %d for module %s", rc, name);return AUDIO_MODULE_HANDLE_NONE;}// Check and cache this HAL's level of support for master mute and master// volume.  If this is the first HAL opened, and it supports the get// methods, use the initial values provided by the HAL as the current// master mute and volume settings.AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);{  // scope for auto-lock patternAutoMutex lock(mHardwareLock);if (0 == mAudioHwDevs.size()) {mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;float mv;if (OK == dev->getMasterVolume(&mv)) {mMasterVolume = mv;}mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;bool mm;if (OK == dev->getMasterMute(&mm)) {mMasterMute = mm;}}mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;if (OK == dev->setMasterVolume(mMasterVolume)) {flags = static_cast<AudioHwDevice::Flags>(flags |AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);}mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;if (OK == dev->setMasterMute(mMasterMute)) {flags = static_cast<AudioHwDevice::Flags>(flags |AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);}mHardwareStatus = AUDIO_HW_IDLE;}audio_module_handle_t handle = (audio_module_handle_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));ALOGI("loadHwModule() Loaded %s audio interface, handle %d", name, handle);return handle;}

3. 开机日志

# logcat |grep loadHwModule278   278 I AudioFlinger: loadHwModule() Loaded primary audio interface, handle 10278   278 I AudioFlinger: loadHwModule() Loaded a2dp audio interface, handle 18278   278 I AudioFlinger: loadHwModule() Loaded r_submix audio interface, handle 26

4. so 在系统的位置

0:/ # find / -iname *primary*.so 2>/dev/nul
/vendor/lib/hw/audio.primary.default.so
/vendor/lib/hw/audio.primary.mt8167.so
/vendor/lib/libaudioprimarydevicehalifclient.so
1|Knowin inSight10:/ #

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/465906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【修炼5】《基础篇》别把项目成功当目标

副标题——做对的事情&#xff0c;远比你把事情做对&#xff0c;来的重要&#xff01;&#xff08;作者&#xff1a; 孙继滨&#xff09;<?xml:namespace prefix o />【项目经理之修炼】 全文索引给大家提一个问题&#xff1a;***************************************…

每日一题(27)—— define定义一个宏表明1年中有多少秒

用预处理指令#define 声明一个常数&#xff0c;用以表明1年中有多少秒&#xff08;忽略闰年问题&#xff09; 分析&#xff1a; 1、#define 语法的基本知识&#xff08;例如&#xff1a;不能以分号结束&#xff0c;括号的使用&#xff0c;等等&#xff09; 2、懂得预处理器将…

String,StringBuffer与StringBuilder的区别??

String,StringBuffer与StringBuilder的区别?? String 字符串常量StringBuffer 字符串变量&#xff08;线程安全&#xff09;StringBuilder 字符串变量&#xff08;非线程安全&#xff09; 简要的说&#xff0c; String 类型和 StringBuffer 类型的主要性能区别其实在于 Strin…

鸿蒙的路还很长

这是昨晚看到我的老领导发的和鸿蒙有关的文章&#xff0c;我在下面评论了&#xff0c;作为科技自媒体屌丝本屌&#xff0c;我昨晚也是看了鸿蒙2.0的发布会&#xff0c;也有一些观点。鸿蒙OS是什么&#xff1f;鸿蒙os是一个操作系统&#xff0c;而且是面向智能终端的&#xff0c…

有关Accordion组件的研究——Silverlight学习笔记[27]

Accordion组件在开发中常用于信息的分类显示。本文将为大家介绍该组件的特性以及通过一个实例讲述该组件的基本运用。组件所在命名控件&#xff1a;System.Windows.Controls组件常用方法&#xff1a;SelectAll&#xff1a;选择所有位于Accordion组件中的Accordion项。&#xff…

螺旋格式输出数据

螺旋格式输出数据 问题&#xff1a;(问答题) 编程输出以下格式的数据。 When i0 1 When i1 7 8 96 1 25 4 3 When i2 21 22 23 24 2520 7 8 9 1019 6 1 2 1118 5 4 3 1217 16 15 14 13 1、Python&#xff1a; def format_…

每日一题(28)—— 引用与指针的区别

引用与指针有什么区别&#xff1f; &#xff08;1&#xff09;引用必须被初始化&#xff0c;指针不必&#xff1b; &#xff08;2&#xff09;引用初始化以后不能被改变&#xff0c;指针可以&#xff1b; &#xff08;3&#xff09;不存在指向空值的引用&#xff0c;但是存在…

聊聊 top 命令中的 CPU 使用率

之前写过cpu占用率的文章CPU占用率是什么&#xff1f;平常我们使用 top 命令来查看系统的性能情况&#xff0c;在 top 命令中可以看到很多不同类型的 CPU 使用率&#xff0c;如下图红框中标出部分&#xff1a;下面&#xff0c;我们来介绍一下这些 CPU 使用率的意义&#xff1a;…

Linux 脚本、 正则表达式 等

shell的脚步总是以这样的一行开头&#xff1a;#!/bin/bash这行叫做shebang顺序执行两个命令&#xff0c;可以$cmd1;cmd2要验证脚本语法的准确性&#xff0c;可以用bask-nscriptfilename来验证如果要debug则为bash-xscr.sh删除老的文件&#xff1a;find /home/wwwroot -type f-m…

哈尔特征Haar

哈尔特征&#xff08;Haar-like features&#xff09; 是用于物体识别的一种数字图像特征。它们因为与哈尔小波转换 极为相似而得名&#xff0c;是第一种即时的人脸检测運算。 历史上&#xff0c;直接使用图像的强度(就是图像每一个像素点的RGB值)使得特征的计算强度很大。帕帕…

乐鑫科技2022笔试面试题

来源于读者投稿&#xff0c;作者来源于牛客网的 galun 。投递方式&#xff1a;内推。岗位&#xff1a;嵌入式软件实习生。个人情况&#xff1a;本科双非电子信息工程&#xff0c;硕士华五软件工程研一在读&#xff1b;本科做过一些很水的项目 &#xff0c;也拿项目搞了一些奖&a…

每日一题(29)—— 如何引用一个已经定义过的全局变量

如何引用一个已经定义过的全局变量&#xff1f; extern关键字 可以用引用头文件的方式&#xff0c;也可以用extern关键字&#xff0c;如果用引用头文件方式来引用某个在头文件中声明的全局变理&#xff0c;假定你将那个变写错了&#xff0c;那么在编译期间会报错&#xff0c;如…

Tcpdump的使用

tcpdump采用命令行方式&#xff0c;它的命令格式为&#xff1a;tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名] [ -s snaplen ][ -T 类型 ] [ -w 文件名 ] [表达式 ] 1. tcpdump的选项介绍   -a    将网络地址和广播地址转变成名字…

同事在RTOS临界区嵌套使用栽了跟头~

1裸机与RTOS的理解首先这里只针对单核CPU架构的芯片展开讨论&#xff0c;大部分是MCU吧&#xff0c;而多核CPU的讨论相对比较复杂&#xff0c;暂不涉及~玩RTOS的朋友都知道&#xff0c;裸机与OS的最大区别就是实现多任务的并发&#xff0c;其实你说裸机就不能实现任务的并发吗 …

每日一题(30)—— 局部变量能否和全局变量重名?

局部变量能否和全局变量重名&#xff1f; 答&#xff1a;能&#xff0c;局部会屏蔽全局。要用全局变量&#xff0c;需要使用"::" 局部变量可以与全局变量同名&#xff0c;在函数内引用这个变量时&#xff0c;会用到同名的局部变量&#xff0c;而不会用到全局变量。对…

一道内存分配的面试题

这是读者在知识星球上写的面试题我之前写的文章有很完整说过这部分C语言&#xff0c;函数不可返回指向栈内存的指针C 语言内存分配堆和栈的区别&#xff08;转过无数次的文章&#xff09;看完上面的文章&#xff0c;我觉得你至少对C语言程序变量内存有一个概念了解了。然后看下…

终于解决了

困扰很长事件的问题今天终于得到解决&#xff0c;或许是思维定式的原因&#xff0c;没有及时的绕过调整思路&#xff0c;也不知道今天晚上脑子这么开窍了&#xff0c;一下把问题给解决了&#xff0c;实在是开心啊改天还是把自己的成果贴出以示奖励自己的努力。转载于:https://w…

数据可视化插件

1、前端数据可视化插件:Highcharts、Echarts和D3 &#xff1a; https://blog.csdn.net/u013511989/article/details/72236788 &#xff08;Echarts是canvas实现的&#xff0c;推荐&#xff09; 2、Echarts学习&#xff1a;http://www.echartsjs.com/tutorial.html#5%20%E5%8…

一道内存分配的面试题后续

昨天写的题目&#xff0c;在VC6.0上面测试一下一道内存分配的面试题结果发现一个问题&#xff0c;发现输出结果竟然没有问题&#xff0c;我很慌&#xff0c;如果这样的输出结果没有问题的话&#xff0c;那肯定是跟我们的理论对不上号的。所以我只能继续调试先把问题抛在printf上…

每日一题(31)—— 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

全局变量可不可以定义在可被多个.C文件包含的头文件中&#xff1f;为什么&#xff1f; 答&#xff1a;可以&#xff0c;在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量&#xff0c;前提是其中只能有一个C文件中对此变量赋初值&#…