• audiopolicy


    audiopolicy完整流程如下:

    1 AudioFlinger和AudioPolicyService属于binder服务。他们启动都是在同一个进程中,交互表面上是binder IPC交互,其实底层也是指针相互调用

    instantiate方法是发布自身服务到ServiceManager

    //framework/av/media/audioserver/main_audioserver.cpp

    int main(int argc __unused, char **argv)
    {
        .....
        AudioFlinger::instantiate();
        AudioPolicyService::instantiate();

    2 AudioPolicyManager是AudioPolicyService服务进程下的一个独立功能模块,该模块可以由厂家自行实现(但必须遵循aosp的接口定义),最后提供libaudiopolicymanager.so库,由AudioPolicyService服务load进来调用即可。音频配置文件audio_policy_configuration.xml配置了音频的设备、流以及路由关系,AudioPolicyManager负责解析存储这些信息。

     AudioPolicyService和AudioPolicyManager之间,相互保存对方的对象指针引用。

    void AudioPolicyService::onFirstRef()
    {
        {
            Mutex::Autolock _l(mLock);

            ......
            /** 将自身封装为一个客户端传递个Manager,好处是可以隐藏Service自身内部的逻辑,
            * 只暴露给Manager需要的接口即可,同时也降低耦合       * */
            mAudioPolicyClient = new AudioPolicyClient(this);
            //createAudioPolicyManager方法创建Manager
      mAudioPolicyManager =createAudioPolicyManager(mAudioPolicyClient);
        }
       ......
    }
     

    AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface, bool /*forTesting*/)
        :
        ........
     mpClientInterface(clientInterface),   //参数是AudioPolicyService的this指针
        ........
    {
        loadConfig();     //加载音频配置文件
        initialize();         //初始化音频设备信息
    }

    3 AudioPolicyService上可以与应用层交互,通过它中转去查询、选择音频设备信息,也就是AudioPolicyManager模块,选择完成后最终决定使用哪个设备时,又转给AudioFlinger去与下层HAL交互。
     

    4 AudioFlinger上可以与应用层交互,下可以和HAL层交互。


     

    5 AudioFlinger与HAL建立连接

    AudioFlinger::AudioFlinger()
        : BnAudioFlinger(),
          ....
    {
        ......
        //创建hal层音频访问hal引用
        mDevicesFactoryHal = DevicesFactoryHalInterface::create();
        //创建hal层音效访问hal层引用
        mEffectsFactoryHal = EffectsFactoryHalInterface::create();
        ......
    }

    // static
    sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
        //IDevicesFactory是hal层的HIDL接口,这里先查询hal层支持的版本号,在针对性创建hidl的客户端
        if (hardware::audio::V5_0::IDevicesFactory::getService() != nullptr) {
            return V5_0::createDevicesFactoryHal();
        }
        if (hardware::audio::V4_0::IDevicesFactory::getService() != nullptr) {
            return V4_0::createDevicesFactoryHal();
        }
        if (hardware::audio::V2_0::IDevicesFactory::getService() != nullptr) {
            return V2_0::createDevicesFactoryHal();
        }
        return nullptr;
    }

    sp<DevicesFactoryHalInterface> createDevicesFactoryHal() {
        return new DevicesFactoryHalHybrid();
    }

    DevicesFactoryHalHybrid::DevicesFactoryHalHybrid()
            : mLocalFactory(new DevicesFactoryHalLocal()),
            //关注以下成员
              mHidlFactory(new DevicesFactoryHalHidl()) {
    }

     

  • 相关阅读:
    (附源码)mysql小程序+springboot流浪动物保护平台 毕业设计 161154
    【虚幻引擎UE】UE5 材质动态修改的2种方法(含工程源码)
    DSPE-PEG-Hydrazide DSPE-PEG-HZ 磷脂-聚乙二醇-酰肼科研用化学试剂
    数据库的三种日志:redo log、binlog和undo log
    新零售系统平台解决方案 线上线下小程序怎么做
    在react中渲染html
    移动端适配推荐flexible和 postcss-px2rem
    搭建Django项目
    wait函数与waitpid函数的区别
    计算机网络物理层思维导图+大纲笔记
  • 原文地址:https://blog.csdn.net/wangbuji/article/details/125590200