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