Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2112774
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: Android平台

2014-09-23 14:09:48

《深入理解android》卷1第七章深入理解audio系统的笔记
1.AudioFlinger的启动
./frameworks/av/media/mediaserver/main_mediaserver.cpp
  1. int main(int argc, char** argv)
  2. {
  3.     AudioFlinger::instantiate();           //audioFlinger
  4.     AudioPolicyService::instantiate();       //与audioFlingerService的启动
  5.     ProcessState::self()->startThreadPool();
  6.     IPCThreadState::self()->joinThreadPool();
  7. }
调用了instantiate来启动AF与APS,但是在AudioFlinger.cpp与AudioPolicyServer.cpp中是找不到instantiate这个函数的,
为什么呢?
因为看AudioFlinger的定义
  1. class AudioFlinger :
  2.     public BinderService<AudioFlinger>,
  3.     public BnAudioFlinger
AF是继承自BinderService,BinderService会创建AudioFlinger这个服务.并调用AudioFlinger的onFirstRef
onFirstRef(它也没有干什么事),执行完成后,AudioFlinger就启动起来了,服务嘛只有别人调它时才会起作用。


2.APS的启动
  1. AudioPolicyService::AudioPolicyService() : BnAudioPolicyService() , mpAudioPolicyDev(NULL) , mpAudioPolicy(NULL)
  2. {
  3.     char value[PROPERTY_VALUE_MAX];
  4.     const struct hw_module_t *module;
  5.     Mutex::Autolock _l(mLock);
  6.     mTonePlaybackThread = new AudioCommandThread(String8(""));
  7.     mAudioCommandThread = new AudioCommandThread(String8("ApmCommand"));
  8.     hw_get_module(AUDIO_POLICY_HARDWARE_MODULE_ID, &module);       //找到库./hardware/libhardware_legacy/audio下的句柄
  9.     audio_policy_dev_open(module, &mpAudioPolicyDev);              //打开库,库指针放在mpAudioPolicyDev
  10.     //重要这时mpAudioPolicy就是legacy_audio_policy->policy的一堆函数指针
  11.     mpAudioPolicyDev->create_audio_policy(mpAudioPolicyDev, &aps_ops, this, &mpAudioPolicy); 
  12.     mpAudioPolicy->init_check(mpAudioPolicy);
  13.     if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
  14.         loadPreProcessorConfig(AUDIO_EFFECT_VENDOR_CONFIG_FILE);
  15.     } else if (access(AUDIO_EFFECT_DEFAULT_CONFIG_FILE, R_OK) == 0) {
  16.         loadPreProcessorConfig(AUDIO_EFFECT_DEFAULT_CONFIG_FILE);
  17.     }
  18. }
2.1 APS调用audio_policy.default的create
在./hardware/libhardware_legacy/audio/audio_policy_hal.cpp中(即库audio_policy.default.so)
  1. static int create_legacy_ap(const struct audio_policy_device *device,
  2.                             struct audio_policy_service_ops *aps_ops,
  3.                             void *service,
  4.                             struct audio_policy **ap)
  5. {
  6.     struct legacy_audio_policy *lap;
  7.     lap = (struct legacy_audio_policy *)calloc(1, sizeof(*lap));
  8.     //以下初始化lap结构体 
  9.     lap->policy.init_check = ap_init_check;
  10.      .....一堆lap->policy的函数指针的初始化
  11.     lap->service = service;
  12.     lap->aps_ops = aps_ops;
  13.     //下面这两行看出,以后经常看到的mpClientInterface就是下面的lap->service_client
  14.     lap->service_client = new AudioPolicyCompatClient(aps_ops, service);
  15.     lap->apm = createAudioPolicyManager(lap->service_client);

  16.     *ap = &lap->policy;    //将lap->policy赋给了mpAudioPolicy,这样fw中的APS就可以调用库中的函数了
  17.     return 0;
  18. }
注1.关于下面这两句
lap->service_client = new AudioPolicyCompatClient(aps_ops, service);
lap->apm = createAudioPolicyManager(lap->service_client);  
  --> new AudioPolicyManagerDefault
   --> 在构造函数中AudioPolicyManagerBase::AudioPolicyManagerBase
   -->  mpClientInterface = lap->service_client;
所以这个mpClientInterface就是一个AudioPolicyCompatClient
注2.捋一下层次结构
AudioPolicyService-->set_force_use    //在fw层的调用
    mpAudioPolicy->setForce_use      //mpAudioPolicy就是audio_policy.default.so的接口
ap_set_force_use   //由此进入库audio_policy.default.so
   lap->apm->setForceUse  (lap->apm 就是AudioPolicyManager 即AudioPolicyManagerBase)
       AudioPolicyManagerBase-->setForceUse
          mpClientInterface->setParameters       //这个mpClientInterface就是AudioPolicyCompatClient
              AudioPolicyCompatClient::setParameters
                 mServiceOps->set_parameters       //这个mServiceOps初始化是传入的fw层的APS
aps_set_parameters                          //再次回到fw层
   audioPolicyService->setParameters
       mAudioCommandThread->parametersCommand

在hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp中
  1. AudioPolicyManagerBase::AudioPolicyManagerBase(AudioPolicyClientInterface *clientInterface)
  2.     :
  3.     mPrimaryOutput((audio_io_handle_t)0),
  4.     mAvailableOutputDevices(AUDIO_DEVICE_NONE),
  5.     mPhoneState(AudioSystem::MODE_NORMAL),
  6.     mLimitRingtoneVolume(false), mLastVoiceVolume(-1.0f),
  7.     mTotalEffectsCpuLoad(0), mTotalEffectsMemory(0),
  8.     mA2dpSuspended(false), mHasA2dp(false), mHasUsb(false), mHasRemoteSubmix(false)
  9. {
  10.     mpClientInterface = clientInterface;                   //这一句就把APS传来的ops保存在了成员变量中了
  11.     for (int i = 0; i < AudioSystem::NUM_FORCE_USE; i++) {
  12.         mForceUse[i] = AudioSystem::FORCE_NONE;
  13.     }
  14.     initializeVolumeCurves();
  15.     //在这两个路径下面找auido_policy.conf文件,没有找到的话就用默认的
  16.     // #define AUDIO_POLICY_CONFIG_FILE "/system/etc/audio_policy.conf"
        //#define AUDIO_POLICY_VENDOR_CONFIG_FILE "/vendor/etc/audio_policy.conf"
  17.     //分别把global_configuration与audio_hw_modules加载进来
  18.     if (loadAudioPolicyConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE) != NO_ERROR) {
  19.         if (loadAudioPolicyConfig(AUDIO_POLICY_CONFIG_FILE) != NO_ERROR) {
  20.             defaultAudioPolicyConfig();
  21.         }
  22.     }

  23.     for (size_t i = 0; i < mHwModules.size(); i++) {
  24.         mHwModules[i]->mHandle = mpClientInterface->loadHwModule(mHwModules[i]->mName);
  25.         for (size_t j = 0; j < mHwModules[i]->mOutputProfiles.size(); j++)
  26.         {
  27.             const IOProfile *outProfile = mHwModules[i]->mOutputProfiles[j];

  28.             if (outProfile->mSupportedDevices & mAttachedOutputDevices) {
  29.                 AudioOutputDescriptor *outputDesc = new AudioOutputDescriptor(outProfile);
  30.                 outputDesc->mDevice = (audio_devices_t)(mDefaultOutputDevice & outProfile->mSupportedDevices);
  31.                 audio_io_handle_t output = mpClientInterface->openOutput(...);
  32.                 if (output == 0) {
  33.                     delete outputDesc;
  34.                 } else {
  35.                     mAvailableOutputDevices = (audio_devices_t)(mAvailableOutputDevices | (outProfile->mSupportedDevices & mAttachedOutputDevices));
  36.                     if (mPrimaryOutput == 0 && outProfile->mFlags & AUDIO_OUTPUT_FLAG_PRIMARY) {
  37.                         mPrimaryOutput = output;
  38.                     }
  39.                     addOutput(output, outputDesc);
  40.                     setOutputDevice(output, (audio_devices_t)(mDefaultOutputDevice &outProfile->mSupportedDevices), true);
  41.                 }
  42.             }
  43.         }
  44.     }
  45.     updateDevicesAndOutputs();
  46. }
循环调用以下函数加载音频设备的库
mpClientInterface->loadHwModule
   aps_load_hw_module(在fw: APS中)
      af->loadHwModule (在AudioFlinger中)
        af->loadHwModule_l (在AudioFlinger中)
            通过调用hw_get_module_by_class把audio.primary.exDroid.so与audio.a2dp.default.so加载进来
            注意虽然audio.primary.exDroid.so与audio.a2dp.default.so的id相同都是AUDIO_HARDWARE_MODULE_ID,
            但hw_get_module_by_class是通过名字加载的,所以不会冲突
音频库的具体加载过程
./frameworks/av/services/audioflinger/AudioFlinger.cpp
  1. audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
  2. {
  3.     audio_hw_device_t *dev;
  4.     //将audio.primary.exDroid.so与audio.a2dp.default.so通过名字加载进来,因为这儿没有usb的,所以不考虑
  5.     //有几个库就说明有几个设备,这儿说明在板子上有primary与a2dp两个音频设备
  6.     int rc = load_audio_interface(name, &dev);     //库的接口放在dev中
  7.     mAudioHwDevs.add(handle, new AudioHwDevice(name, dev, flags));  //然后把dev(即库的接口)保存在成员变量mAudioHwDevs中
  8.     return handle;
  9. }
注3. AF、APS、audio_policy.default.so与audio.hw.so之间的相互调用
a. fw中的APS调用AF
sp af = AudioSystem::get_audio_flinger();
这就获取了AF,然后就可以通过af调用AudioFilinger的函数接口

b. fw中的APS调用库audio_policy.default.so
   在AudioPolicyService的构造函数中,就通过hw_get_module打开了库audio_policy.default.so,
   并把接口保存在mpAudioPolicy中,所以就可以通过mpAudioPolicy调用

c. audio_policy.default.so如何调用APS(fw中的AudioPolicyServer)
    a. AudioPolicyCompatClient的成员函数audio_policy_service_ops* mServiceOps在构造函数中被初始化为APS的接口指针
    b. 这样就可以调用mServiceOps->load_hw_module来访问APS中的函数

d. AF与audio.hw.so之间的调用
  在板子上audio.hw.so包括两个: audio.primary.exDroid.so与audio.a2dp.default.so
   AF通过loadHwMoudle_l加载了这两个库,然后分别把库的函数指针保存在mAudioHwDevs中,
   这样就可以通过mAudioHwDevs来调用

阅读(4995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~