Android AudioFlinger & AudioPolicy启动详解
AudioPolicyService和AudioFlinger都是运行在AudioServer进程中的模块,它们的入口是在/frameworks/av/media/audioserver/main_audioserver.cpp文件中的main()函数中,由init进程通过解析audioserver.rc文件启动。main()函数干的事也比较简单,就是创建AudioPolicyService和AudioFlinger对象,并将它们两个作为Binder服务,添加进ServiceManager中。
一、audioserver进程启动
Google将init.rc文件做了拆分, 由模块独立管理其rc文件,不再由init进程集中管理, 这里`audioserver.rc` 便是audio系统的启动文件, 看下其内容:
# 作为service启动,说明启动路径
service audioserver /system/bin/audioserver
# 核心
class core
#用户为audioserver
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
take_profiles ProcessCapabilityHigh HighPerformance
onrestart restart audio-hal
onrestart restart audio-hal-aidl
onrestart restart audio-effect-hal-aidl
onrestart restart audio-hal-4-0-msd
onrestart restart audio_proxy_service
on property:vts.native_server.on=1
stop audioserver
on property:vts.native_server.on=0
start audioserver
...
其中,wakelock允许申请内核 wakelock(防止休眠),wakelock + BLOCK_SUSPEND 共同确保播放时不休眠。
再看audioserver的启动入口main函数:
int main(int argc __unused, char **argv)
{
limitProcessMemory(
"audio.maxmem",
(size_t)512 * (1 << 20),
20 );
signal(SIGPIPE, SIG_IGN);
bool doLog = (bool) property_get_bool("ro.test_harness", 0);
pid_t childPid;
if (doLog && (childPid = fork()) != 0) {
......
} else {
android::hardware::configureRpcThreadpool(4, false );
ProcessState::self()->startThreadPool();
const auto af = sp<AudioFlinger>::make();
const auto afAdapter = sp<AudioFlingerServiceAdapter>::make(af);
const auto aps = sp<AudioPolicyService>::make();
sp<IServiceManager> sm = defaultServiceManager();
sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME), afAdapter,
false, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME), aps,
false, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
.......
std::vector<AudioMMapPolicyInfo> policyinfos;
status_t status = af->getMMapPolicyInfos(AudioMMapPolicyType::DEFAULT, &policyinfos);
AAudioService::instantiate();
}
}
二、AudioFlinger初始化
在audioserver中,即调用AudioFlinger的构造函数:
AudioFlinger::AudioFlinger()...
{
...
mDeviceFactoryHal = DeviceFactoryHalInterface::create();
mEffectsFactoryHal = audioflinger::EffectConfiguration::getEffectsFactoryHal();
...
}
AudioFlinger的构造函数只是对参数进行初始化。
AudioFlinger::onFirst()
{
mDeviceFactoryHalCallback = new DeviceFactoryHalCallbackImp;
mDeviceFactoryHal->setCallbackOnce(mDeviceFactoryHalCallback);
}
三、AudioPolicyService初始化
AudioPolicyService::AudioPolicyService()
: BnAudioPolicyService(),
mAudioPolicyManager(NULL),
mAudioPolicyClient(NULL),
mPhoneState(AUDIO_MODE_INVALID),
mCaptureStateNotifier(false),
mCreateAudioPolicyManager(createAudioPolicyManager),
mDestroyAudioPolicyManager(destroyAudioPolicyManager),
mUsecaseValidator(media::createUsecaseValidator())