【AudioPolicy To AudioHAL笔记(一)】AudioPolicy启动过程

AudioPolicy启动过程

  • 一、总体启动过程
  • 二、代码分析
  • 三、动态分析

/*****************************************************************************************************************/

声明: 本博客内容均由https://blog.csdn.net/weixin_47702410原创,转载or引用请注明出处,谢谢!

创作不易,如果文章对你有帮助,麻烦点赞 收藏支持~感谢

/*****************************************************************************************************************/

一、总体启动过程

1、init.rc启动到main_audioserver.cpp,这个文件会启动AudioPolicyService

2、AudioPolicyService创建AudioPolicyClient、AudioPolicyManager

二、代码分析

  • 1、在/frameworks/av/media/audioserver/main_audioserver.cpp中会进行启动AudioServer的进程
int main(int argc __unused, char **argv)
{...AudioFlinger::instantiate();        -->AudioFlinger的启动ALOGE("Mylog_AP:AudioPolicyService::instantiate!!");        AudioPolicyService::instantiate();    -->AudioPolicyService的启动ALOGE("Mylog_AP:AudioPolicyService::instantiate  done!!");...
}

2、这个AudioPolicyService::instantiate(); 最终会通过BindService调用到AudioPolicyService,其构造函数便会起作用:

/frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
AudioPolicyService::AudioPolicyService(): BnAudioPolicyService(),mAudioPolicyManager(NULL),mAudioPolicyClient(NULL),mPhoneState(AUDIO_MODE_INVALID),mCaptureStateNotifier(false),mCreateAudioPolicyManager(createAudioPolicyManager),mDestroyAudioPolicyManager(destroyAudioPolicyManager) {Initialize_IC_manu_name_LogLevel("vendor.af.policy.debug");ALOGE("%s Mylog_AP: AudioPolicyService::AudioPolicyService() done !", __func__);
}

3、注意上面函数是继承了AudioPolicyService::AudioPolicyService(): BnAudioPolicyService(),这个继承关系会导致AudioPolicyService::onFirstRef()的调用
(BnAudioPolicyService继承了BnInterface,而BnInterface又继承了IBinder,IBinder又继承了IInterface,IInterface最终继承了RefBase…)。

/frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
void AudioPolicyService::onFirstRef()
{...ALOGE("%s Mylog_AP:new AudioPolicyClient !", __func__);mAudioPolicyClient = new AudioPolicyClient(this);ALOGE("%s Mylog_AP:new AudioPolicyClient Done!", __func__);loadAudioPolicyManager();ALOGE("%s Mylog_AP:mCreateAudioPolicyManager !", __func__);mAudioPolicyManager = mCreateAudioPolicyManager(mAudioPolicyClient);ALOGE("%s Mylog_AP:mCreateAudioPolicyManager Done!", __func__);...
}

其先会new一个AudioPolicyClient,然后再调用mCreateAudioPolicyManager:

4、创建AudioPolicyManager:

/frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp
static AudioPolicyInterface* createAudioPolicyManager(AudioPolicyClientInterface *clientInterface)
{ALOGE("%s Mylog_AP: new AudioPolicyManager !!! !", __func__);AudioPolicyManager *apm = new AudioPolicyManager(clientInterface, audiopolicymanager_IC_manu_name);ALOGE("%s Mylog_AP: new AudioPolicyManager done !", __func__);status_t status = apm->initialize();ALOGE("%s Mylog_AP: apm->initialize() !", __func__);...
}

这个CreateAudioPolicyManager函数其实也是new一个AudioPolicyManager(clientInterface, audiopolicymanager_IC_manu_name);
从这开始算是从AudioPolicyService创建出AudioPolicyManager了

下面再分析一下AudioPolicyManager.

5、从上面的代码可以直接看出构造函数又启动了IC_manu_name客制化的AudioPolicyManager,同时也将onFirstRef函数中new AudioPolicyClient作为参数传入,代码如下:

/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface,bool /*forTesting*/):mUidCached(AID_AUDIOSERVER), // no need to call getuid(), there's only one of us running.mpClientInterface(clientInterface),mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),mA2dpSuspended(false),mBLESuspended(false),mConfig(mHwModulesAll, mOutputDevicesAll, mInputDevicesAll, mDefaultOutputDevice),mAudioPortGeneration(1),mBeaconMuteRefCount(0),mBeaconPlayingRefCount(0),mBeaconMuted(false),mTtsOutputAvailable(false),mMasterMono(false),mMusicEffectOutput(AUDIO_IO_HANDLE_NONE)
{//...
}AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface, AudioPolicyManagerCustomInterface *customInterface): AudioPolicyManager(clientInterface, false /*forTesting*/)
{//...loadConfig();
}

6、然后就会走到loadConfig,加载策略文件(*.xml)

/frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
void AudioPolicyManager::loadConfig() {ALOGE("Mylog_AP:AudioPolicyManager::loadConfig() !");if (deserializeAudioPolicyXmlConfig(getConfig()) != NO_ERROR) {ALOGE("could not load audio policy configuration file, setting defaults");getConfig().setDefault();}
}

这个函数主要就是将调用deserializeAudioPolicyXmlConfig加载并解析一些策略文件(例如"audio_policy_configuration.xml"),这个文件是如何加载,我们后面再分析。

三、动态分析

代码加入上面的log, 编译烧录镜像,抓取开机log:

    行  1996: 07-26 11:18:03.254630   707   707 E audioserver: Mylog_AP:AudioPolicyService::instantiate!!→   /frameworks/av/media/audioserver/main_audioserver.cpp开始进行AudioPolicyService的实例化行  1997: 07-26 11:18:03.254764   707   707 E AudioPolicyService: AudioPolicyService Mylog_AP: AudioPolicyService::AudioPolicyService() done !→   /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp  AudioPolicyService构造函数的执行行  1998: 07-26 11:18:03.255591   707   707 E AudioPolicyService: onFirstRef Mylog_AP:new AudioPolicyClient !→ /frameworks/av/services/audiopolicy/service/AudioPolicyService.cppAudioPolicyService 构造函数继承了BnAudioPolicyService,间接调用到AudioPolicyService: onFirstRef,此处new AudioPolicyClient 行  1999: 07-26 11:18:03.255644   707   707 E AudioPolicyService: onFirstRef Mylog_AP:new AudioPolicyClient Done!→   /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp  new AudioPolicyClient done行  2000: 07-26 11:18:03.256189   707   707 E AudioPolicyService: onFirstRef Mylog_AP:mCreateAudioPolicyManager !→   /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp  AudioPolicyService: onFirstRef还会创建AudioPolicyManager行  2001: 07-26 11:18:03.256387   707   707 E AudioPolicyService: createAudioPolicyManager Mylog_AP: new AudioPolicyManager !!! !→   /frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cppCreateAudioPolicyManager函数会new一个AudioPolicyManager行  2002: 07-26 11:18:03.256507   707   707 E APM_AudioPolicyManager: Mylog_AP:AudioPolicyManager::loadConfig() !→   /frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cppAudioPolicyManager的构造函数会加载配置行  2223: 07-26 11:18:03.378245   707   707 E AudioPolicyService: createAudioPolicyManager Mylog_AP: new AudioPolicyManager done !→   /frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp创建完成AudioPolicyManager行  3628: 07-26 11:18:06.125142   707   707 E AudioPolicyService: createAudioPolicyManager Mylog_AP: apm->initialize() !→    /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpp  AudioPolicyManager初始化行  3629: 07-26 11:18:06.125199   707   707 E AudioPolicyService: onFirstRef Mylog_AP:mCreateAudioPolicyManager Done!→   /frameworks/av/services/audiopolicy/service/AudioPolicyService.cpponFirstRef 函数创建AudioPolicyManager完成行  3796: 07-26 11:18:06.616405   707   707 E audioserver: Mylog_AP:AudioPolicyService::instantiate  done!!→   /frameworks/av/media/audioserver/main_audioserver.cpp中AudioPolicyService的实例化完成

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

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

相关文章

week03day04(正则表达式2)

一. 正则表达式 1. 匹配次数相关的正则符号 a. 一次或多次(至少一次) ,控制 前面元素的次数,看下面事例 from re import fullmatch a 至少一个a , \d 至少一个数字字符 result fullmatch(r1a2,1aaaaaaaa2) #1和2中间至少要有一个a…

wsl + vscode 离线配置 ERROR: Faild to download https://update.code.visualstudio.com

内网情况配置 wsl 和 vscode。在wsl中下载不了 vscode 的核心。 报错: ERROR: Faild to download https://update.code.visualstudio.com/commit:8b3775030ed1a69b13e4f4c628c612102e30a681/server-linux-x64/stable 很多情况下是没有现成的VS Code Server程序的&…

三好夫人:真爱战胜一切

真爱如同飞蛾扑火,明知前方是毁灭,却仍心甘情愿地奔赴。如果一个男人真心爱你,他会倾尽所有,不遗余力地满足你的需求。这份爱,会在他的言行举止中流露出来。男人对你的爱,常常表现在他的言语之中。 如果他爱…

桌面显示器应用Type-C接口有什么好处

随着科技的不断发展,桌面显示器作为我们日常工作中不可或缺的设备之一,也在不断更新换代。其中,Type-C接口的应用成为了桌面显示器发展的一个重要趋势。那么,桌面显示器应用Type-C接口究竟有什么好处呢? 首先&#xff…

本地运行面壁智能的“贺岁模型”:MiniCPM 2B

简单聊聊可以在端侧运行的 Mini CPM 2B SFT / DPO 版本的模型。 写在前面 模型是好是坏,其实不用看公众号们的营销,小马过河问题,自己试试就知道了。当然,2B 参数量的模型,适合的场景肯定不是 34B / 70B 所擅长的&am…

VBA_MF系列技术资料1-325

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属于…

项目安全问题及解决方法------使用合适的算法

Spring Security 已经废弃了 MessageDigestPasswordEncoder,推荐使用 BCryptPasswordEncoder private static BCryptPasswordEncoder passwordEncoder new BCryptPasswordEncoder(); GetMapping("performance")public void performance() {StopWatch st…

图数据库Neo4j集成springboot及导入数据踩坑问题

文章目录 ----------------------------------常用cql------------------------------------删除所有节点删除指定节点删除所有关系删除指定关系查看所有节点查看某种节点查看总节点数删除所有关系节点删除所有关系 ------------------------------手动导入数据---------------…

android开发---简单购物商城(JAVA) (一)

包括&#xff1a;商品展示&#xff0c;商品详情&#xff0c;购物车&#xff0c;删除&#xff0c;一键清除&#xff0c;返回 运用sqllist 另外因为一篇写不下 继续可看 源码二 下面是目录 运行样子 下面是源码 AndroidManifest.xml <?xml version"1.0" e…

代码随想录算法训练营29期Day37|LeetCode 738,968

文档讲解&#xff1a;单调递增的数字 监控二叉树 贪心算法总结 738.单调递增的数字 题目链接&#xff1a;https://leetcode.cn/problems/monotone-increasing-digits/description/ 思路&#xff1a; 题目要求小于等于N的最大单调递增的整数&#xff0c;那么拿一个两位的数字…

Android 8.1 铃声音量通话音量同步调节

Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…

统计图表在线配置服务-百度 SugarBI的学习笔记

最近&#xff0c;有个产品要支持统计图表在线可配置&#xff0c;这样&#xff0c;当用户有新增统计指标的需求时&#xff0c;运维人员通过界面化配置&#xff0c;就可以增加统计指标了&#xff0c;不用开发写代码&#xff0c;画页面了。 上网查了下相关的组件&#xff0c;感觉…

SG2520CAA汽车用晶体振荡器

爱普生SG2520CAA是简单的封装晶体振荡器&#xff08;SPXO&#xff09;&#xff0c;具有CMOS输出&#xff0c;这款SPXO是汽车和高可靠性应用的理想选择&#xff0c;符合AEC-Q200标准&#xff0c;功耗低&#xff0c;工作电压范围为1.8 V ~ 3.3 V类型&#xff0c;宽工作温度-40℃~…

VPP学习-startup.conf配置文件

背景 VPP&#xff08;Vector Packet Processing&#xff0c;矢量报文处理&#xff09;&#xff0c;作为一个开源的高性能数据包处理框架&#xff0c;旨在提供可扩展、灵活且高效的网络数据包处理能力&#xff1b;由于传统Linux 内核协议栈整体网络吞吐性能的局限性&#xff0c;…

PyTorch和TensorFlow的简介

一、PyTorch和TensorFlow的简介 1.1 Pytorch PyTorch是由Facebook开发的一个开源深度学习框架&#xff0c;它提供了一个动态计算图模型&#xff0c;可以在GPU上运行。它于2017年首次发布。PyTorch提供了一个灵活、动态的计算图&#xff0c;使得深度学习模型的构建和调试更加直…

【Linux】环境基础开发工具的使用之gcc详解(二)

前言&#xff1a;上一篇文章中我们讲解了Linux下的vim和yum的工具的使用&#xff0c;今天我们将在上一次的基础上进一步的讲解开放工具的时候。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4a…

小程序配置服务器域名:步骤与注意事项

随着移动互联网的普及&#xff0c;小程序已成为许多企业和开发者的首选应用形式。为了确保小程序的正常运行和最佳用户体验&#xff0c;服务器域名的配置至关重要。本文将详细介绍小程序配置服务器域名的步骤及注意事项。 一、为什么要配置服务器域名&#xff1f; 小程序运行…

ESU毅速丨为什么增材制造广受关注?

随着科技的飞速发展&#xff0c;增材制造3D打印技术逐渐成为制造业的新宠。包括航空航天、汽车、家电、电子等各行业都在积极拥抱3D打印&#xff0c;为什么3D打印能引起制造业广泛关注与应用&#xff1f;它的主要优势有哪些&#xff1f; 首先&#xff0c;3D打印减少浪费。3D打印…

【Linux】 Linux编译器-gcc/g++使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. Linux编译器-gcc/g使用1.1 引入1.2 初识gcc/g1.3 程序运行的四个阶段1.3.1 预处理1.3.2 编译1.3.3 汇编1.3.4 链接 1.…

【2024.2.1练习】岛屿个数(15分)

题目描述 题目思路 题目乍一看类似于“水坑个数问题”&#xff0c;是对陆地块进行DFS,上下左右4个方向分别对应了四种状态转移&#xff0c;每块陆地进行搜索后变成海洋&#xff0c;最终搜索次数就是岛屿个数。 但在子岛屿存在的情况下&#xff0c;需要先对海洋块进行DFS,由于…