Android Q Audio 自上而下的调用逻辑和各模块相关初始化(二)——native通信

Android Q Audio 自上而下的调用逻辑和各模块相关初始化(AudioFlinger通信、Audio hal 加载、AudioDevice 选择)

随手笔记系列,内容较多较繁琐,用于结合目录快速查询

本文将通过AudioManger的setMastermute Api的通信传递实现逻辑,自上而下梳理一下调用顺序和各模块相关初始化,最终到的audio_hw.c来实现静音

二、native层通信

2.1 AudioFlinger

AudioFlinger是两个audio nativeservice中的一个,用于管理声音的播放和录制,volume和硬件相关设置也在audioFlinger中进行

AudioSystem到AudioFlinger大概流程为

AudioSystem -> BpAudioFlinger -> binder -> BnAudioFlinger -> AudioFlinger

2.1.1 AudioServce启动

解析 AudioServer.rc

Audioserver.rc (f:\q\frameworks\av\media\audioserver) 794 2020/2/22

service audioserver /system/bin/audioserver
    class core
    user audioserver
    # media gid needed for /dev/fm (radio) and for /data/misc/media (tee)
    group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct wakelock
    capabilities BLOCK_SUSPEND
    ioprio rt 4
    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
    onrestart restart vendor.audio-hal-2-0
    onrestart restart vendor.audio-hal-4-0-msd
    # Keep the original service name for backward compatibility when upgrading
    # O-MR1 devices with framework-only.
    onrestart restart audio-hal-2-0

on property:vts.native_server.on=1
    stop audioserver
on property:vts.native_server.on=0
    start audioserver

on init
    mkdir /dev/socket/audioserver 0775 audioserver audioserver

Android.mk

rameworks/av/media/audioserver/Android.mk

 
LOCAL_SRC_FILES := \
  main_audioserver.cpp \
LOCAL_C_INCLUDES := \
  frameworks/av/services/audioflinger \
  frameworks/av/services/audiopolicy \
LOCAL_MODULE := audioserver

LOCAL_INIT_RC := audioserver.rc

Main_audioserver.cpp (f:\q\frameworks\av\media\audioserver) 5892 2020/2/22

int main(int argc __unused, char **argv)
{
   
   
        AudioFlinger::instantiate();
        AudioPolicyService::instantiate();
}
2.1.2 AudioFlinger初始化

AudioFlinger::instantiate(); 实际上是BinderService的instantiate

template<typename SERVICE>
class BinderService
{
   
   
    static status_t publish(bool allowIsolated = false,
                            int dumpFlags = IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT) {
   
   
        sp<IServiceManager> sm(defaultServiceManager());
        //实例化 并add到 service_manager里
        return sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated,
                              dumpFlags);
    }

	static void instantiate() {
   
    publish(); }
}
//AudioFlinger 继承BinderService SERVICE为AudioFlinger
class AudioFlinger :
    public BinderService<AudioFlinger>,
    public BnAudioFlinger

new SERVICE() 实际上是AudioFlinger的构造函数,就存在一个AF的类实例,可以通过service_manager的getService访问,再之后onFirstRef会被执行。onFirstRef()属于其父类RefBase,该函数在强引用sp新增引用计数时调用。就是当 有sp包装的类初始化的时候调用。

AudioFinger继承BnAudioFlinger

AudioFlinger::AudioFlinger()
    : BnAudioFlinger(),
      mMediaLogNotifier(new AudioFlinger::MediaLogNotifier()),
      mPrimaryHardwareDev(NULL),
      mAudioHwDevs(NULL),
      mHardwareStatus(AUDIO_HW_IDLE),
      mMasterVolume(1.0f),
      mMasterMute(false),
      // mNextUniqueId(AUDIO_UNIQUE_ID_USE_MAX),
      mMode(AUDIO_MODE_INVALID),
      mBtNrecIsOff(false),
      mIsLowRamDevice(true),
      mIsDeviceTypeKnown(false),
      mTotalMemory(0),
      mClientSharedHeapSize(kMinimumClientSharedHeapSizeBytes),
      mGlobalEffectEnableTime(0),
      mPatchPanel(this),
      mSystemReady(false)
{
   
   

//device hal 加载
    mDevicesFactoryHal = DevicesFactoryHalInterface::create();
//effect hal 加载          
    mEffectsFactoryHal = EffectsFactoryHalInterface::create
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值