【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的进程。
c 复制代码
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,其构造函数便会起作用:

c 复制代码
/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...)。

c 复制代码
/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:

c 复制代码
/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作为参数传入,代码如下:

c 复制代码
/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)

c 复制代码
/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.cpp

                       AudioPolicyService 构造函数继承了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.cpp

                         CreateAudioPolicyManager函数会new一个AudioPolicyManager


    行  2002: 07-26 11:18:03.256507   707   707 E APM_AudioPolicyManager: Mylog_AP:AudioPolicyManager::loadConfig() !

                   →   /frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp

                         AudioPolicyManager的构造函数会加载配置



    行  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.cpp

                        onFirstRef 函数创建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的实例化完成
相关推荐
凡人叶枫44 分钟前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp1 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的1 小时前
C++纯虚函数
开发语言·c++·网络安全
凡人叶枫2 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
袁小皮皮不皮4 小时前
1.HCIP BFD 学习笔记(优化版)
服务器·网络·笔记·网络协议·学习·智能路由器·ip
坚果派·白晓明4 小时前
【鸿蒙PC】SDL3 移植:AtomCode Skills 4 步速通多媒体库适配
c++·华为·ai编程·harmonyos·atomcode·c/c++三方库
luoyayun3614 小时前
Qt/QML + FFmpeg 实现多音频文件顺序拼接功能
qt·ffmpeg·音频拼接
赴生-5 小时前
C++进阶 C++11(下)
开发语言·c++
有点。5 小时前
C++(贪心算法一)
c++·贪心算法
WBluuue5 小时前
数据结构与算法:有序表(二):跳表
数据结构·c++·算法·skiplist