Android 7.0 Audio: AudioFlinger介绍和初始

对于AF的分析,先看其所在层的位置以及相关的交互类,

 

 

 

之前的版本,AF在Main_MediaServer.cpp里面启动,在android N,AF在main_audioserver.cpp里面启动,

   ///    

      ALOGI("ServiceManager: %p", sm.get());

        AudioFlinger::instantiate();

        AudioPolicyService::instantiate();

        RadioService::instantiate();

        SoundTriggerHwService::instantiate(); .

        ProcessState::self()->startThreadPool();

        IPCThreadState::self()->joinThreadPool();

 

 

在android N, audioserver进程的启动也发生了一些变化,

init.zygote64.rc

  ///

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server

    class main

    socket zygote stream 660 root system

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart audioserver

    onrestart restart cameraserver

    onrestart restart media

    onrestart restart netd.

    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks.

 

init.target.rc

  ///

service audiod /system/bin/audiod

   class late_start

   user system

   group system .

 

在AudioFlinger.cpp的类创建过程中,AudioFlinger::instantiate()函数实例化AudioFlinger,instantiate在其父类BinderService里实现(frameworks/base/include/binder/BinderService.h头文件中),这里可以看到它被添加到系统服务里面了,之后,就存在一个AF的类实例,可以通过系统服务的方式被访问,再之后onFirstRef会被执行。

 

构造函数和onFirstRef里面没有创建和关联太多相关类,只创建了PatchPanel,

 

  ///

void AudioFlinger::onFirstRef()

{

    mPatchPanel = new PatchPanel(this);

 

    mMode = AUDIO_MODE_NORMAL;

}                                                                              .

 

 

在AF内部,由于和他交互的模块较多,所以实现了不同的服务端、客户端,为了达到实现不同功能的目的,其本身还维护多个线程。

 

 

关于内部线程方面,各线程的关系如下,

 

这些线程实现在\frameworks\av\services\audioflinger\ Threads.cpp ,主要的实现在PlaybackThread,在我们前面分析AT的时候,会在AF的openOutput_l里面new一个PlaybackThread(或其子类),这样就创建了线程实例,然后在其onFirstRef里启动线程,

  ///

void AudioFlinger::PlaybackThread::onFirstRef()

{

    run(mThreadName, ANDROID_PRIORITY_URGENT_AUDIO);.

}

 

线程的Looper为boolAudioFlinger::PlaybackThread::threadLoop(),这个函数很大,不展开分析,简单说就是它负责处理播放过程,相应相关事件,收到外部通知或播放结束就结束线程。

 

AudioFlinger::RecordThread::RecordThread为输入线程,也不展开分析了。

 

 

 

 

线程的上下交互关系如下,

 

对于输出部分,可以看到针对不同的OUTPUT FLAG,在AF和HAL层有不同的Thread来进行播放。

 

对于音量控制,其框图如下

 

 

 

输入部分,则为

 

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值