Android audio系统三 audio系统启动过程

本文深入剖析Android Audio系统,包括启动过程(从audioserver启动到AudioFlinger与AudioPolicyService初始化),AudioTrack播放流程,以及音量设置的详细步骤。AudioFlinger负责播放、混音和音效,AudioPolicyService管理设备状态和音量控制。AudioPolicyManager根据audio_policy.conf配置文件初始化音频设备。AudioTrack通过IAudioTrack与AudioFlinger交互,完成数据处理、混音和输出到HAL层。音量设置涉及AudioPolicyManager和AudioSystem的交互,转换为db值并调用setStreamVolume操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android audio启动过程

audio启动流程

一、Android系统启动

Android系统的启动流程
在这里插入图片描述
init进程对应的main函数 system/core/init/init.cpp

int SecondStageMain(int argc, char** argv) {
 // ......
 LoadBootScripts(am, sm);
 // ......
}
// LoadBootScripts()
static void LoadBootScripts(ActionManager& action_manager, ServiceList& service_list) {
 Parser parser = CreateParser(action_manager, service_list);
 std::string bootscript = GetProperty("ro.boot.init_rc", "");
 if (bootscript.empty()) {
 parser.ParseConfig("/system/etc/init/hw/init.rc");
 if (!parser.ParseConfig("/system/etc/init")) {
 late_import_paths.emplace_back("/system/etc/init");
 }
 // late_import is available only in Q and earlier release. As we don't
 // have system_ext in those versions, skip late_import for system_ext.
 parser.ParseConfig("/system_ext/etc/init");
 if (!parser.ParseConfig("/vendor/etc/init")) {
 late_import_paths.emplace_back("/vendor/etc/init");
 }
 if (!parser.ParseConfig("/odm/etc/init")) {
 late_import_paths.emplace_back("/odm/etc/init");
 }
 if (!parser.ParseConfig("/product/etc/init")) {
 late_import_paths.emplace_back("/product/etc/init");
 }
 } else {
 parser.ParseConfig(bootscript);
 }
}

LoadBootScrips()函数中,会首先加载init.rc文件,然后会加载/system/etc/init/、/product/etc/init/、/odm/etc/init/、/vendor/etc/init目录下的
rc文件。而audioserver.rc位于/system/etc/init 目录下

二、启动入口:audioserver启动

启动audioserver进程
frameworks/av/media/audioserver/audioserver.rc

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 media mediadrm net_bt net_bt_admin net_bw_acct wakelock # 
 capabilities BLOCK_SUSPEND
 ioprio rt 4
 task_profiles ProcessCapacityHigh HighPerformance
 onrestart restart vendor.audio-hal
 onrestart restart vendor.audio-hal-4-0-msd
 onrestart restart audio_proxy_service
 # Keep the original service names for backward compatibility
 onrestart restart vendor.audio-hal-2-0
 onrestart restart audio-hal-2-0
on property:vts.native_server.on=1
 stop audioserver
on property:vts.native_server.on=0
 start audioserver

audioserver的入口函数为main_audioserver.cpp,去创建audioflinger和audiopolicy的实例
AudioFlinger作用:负责对接Hal层,实现播放,混音,音效处理等功能操作
AudioPolicyService作用:管理输入输出设备状态,音频播放策略,音量控制,向Hal层设置参数

frameworks\av\media\audioserver\main_audioserver.cpp

int main(int argc __unused, char **argv) {
 // ......
 // doLogtrue
 if (doLog && (childPid = fork()) != 0) {
 // ......
 } else {
 // all other services
 if (doLog) {
 prctl(PR_SET_PDEATHSIG, SIGKILL); // if parent media.log dies before me, kill me also
 setpgid(0, 0); // but if I die first, don't kill my parent
 }
 android::hardware::configureRpcThreadpool(4, false /*callerWillJoin*/);
 sp<ProcessState> proc(ProcessState::self());
 sp<IServiceManager> sm = defaultServiceManager();
 ALOGI("ServiceManager: %p", sm.get());
 AudioFlinger::instantiate();
 AudioPolicyService::instantiate();
 // AAudioService should only be used in OC-MR1 and later.
 // And only enable the AAudioService if the system MMAP policy explicitly allows it.
 // This prevents a client from misusing AAudioService when it is not supported.
 aaudio_policy_t mmapPolicy = property_get_int32(AAUDIO_PROP_MMAP_POLICY,
 AAUDIO_POLICY_NEVER);
 if (mmapPolicy == AAUDIO_POLICY_AUTO || mmapPolicy == AAUDIO_POLICY_ALWAYS) {
 AAudioService::instantiate();
 }
 ProcessState::self()->startThreadPool();
 IPCThreadState::self()->joinThreadPool();
 }
}

main_audioserver.cpp里面主要的业务:
① 启动AudioFlinger
② 启动AudioPolicyService
③ 如果支持AAudio,则启动AAudioService
④ 创建线程池并将当前线程加入线程池

三、AudioFlinger初始化流程

audioflinger的初始化(几乎什么实质的操作都没有)
frameworks/av/services/audioflinger/AudioFlinger.cpp

void AudioFlinger::instantiate() {
 sp<IServiceManager> sm(defaultServiceManager());
 sm->addService(String16(IAudioFlinger::DEFAULT_SERVICE_NAME),
 new AudioFlingerServerAdapter(new AudioFlinger()), false,
 IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT);
}

sm是带sp的(sp)强引用类型的指针,第一次调用AudioFlinger模块的时候,会调用它的AudioFlinger::onFirstRef()函数

AudioFlinger::AudioFlinger()
 // 
 ......
{
 // ......
 // halaudio
 mDevicesFactoryHal = DevicesFactoryHalInterface::create();
 // hal
 mEffectsFactoryHal = EffectsFactoryHalInterface::create();
}
void AudioFlinger::onFirstRef()
{
 Mutex::Autolock _l(mLock);
 // ......
 mMode = AUDIO_MODE_NORMAL;
 gAudioFlinger = this; // we are already refcounted, store into atomic pointer.
 // hal
 mDevicesFactoryHalCallback = new DevicesFactoryHalCallbackImpl;
 mDevicesFactoryHal->setCallbackOnce(mDevicesFactoryHalCallback);
}

四、AudioPolicyService初始化流程

AudioPolicyService::AudioPolicyService()
 : BnAudioPolicyService(),
 mAudioPolicyManager(NULL),
 mAudioPolicyClient(NULL),
 mPhoneState(AUDIO_MODE_INVALID),
 mCaptureStateNotifier(false),
 mCreateAudioPolicyManager(createAudioPolicyManager),
 mDestroyAudioPolicyManager(destroyAudioPolicyManager) {
}
void AudioPolicyService::onFirstRef()
{
 {
 Mutex::Autolock _l(mLock);
 // start audio commands thread
 // AudioCommandThreadaudio
 mAudioCommandThread = new AudioCommandThread(String8("ApmAudio"), this);
 // start output activity command thread
 // audio 
 mOutputCommandThread = new AudioCommandThread(String8("ApmOutput"), this);
 // AudioPolicyClientAudioFlingerAudioPolicyService
 mAudioPolicyClient = new AudioPolicyClient(this);
 // Android SAudioPolicyManager
 loadAudioPolicyManager();
 // AudioPolicyManager 
 mAudioPolicyManager = mCreateAudioPolicyManager(mAudioPolicyClient);
 }
 // load audio processing modules
 // 
 sp<AudioPolicyEffects> audioPolicyEffects = new AudioPolicyEffects();
 sp<UidPolicy> uidPolicy = new UidPolicy(this);
 sp<SensorPrivacyPolicy> sensorPrivacyPolicy = new SensorPrivacyPolicy(this);
 {
 Mutex::Autolock _l(mLock);
 mAudioPolicyEffects = audioPolicyEffects;
 mUidPolicy = uidPolicy;
 mSensorPrivacyPolicy = sensorPrivacyPolicy;
 }
 uidPolicy->registerSelf();
 sensorPrivacyPolicy->registerSelf();
}

创建了三个AudioCommandThread线程(分别用于播放tone音,执行audio命令,执行输出命令)
创建了三个类mAudioPolicyClient, mAudioPolicyManager(策略管理), mAudioPolicyEffects(音效设置)三个类

AudioPolicy的管理主要在AudioPolicyManager里面,接下来看AudioPolicyManager

AudioPolicyManager::AudioPolicyManager(AudioPolicyClientInterface *clientInterface)
 : AudioPolicyManager(clientInterface, false /*forTesting*/)
{
 loadConfig();
}
status_t AudioPolicyManager::initialize() {
 {
 // engine
 auto engLib = EngineLibrary::load(
 "libaudiopolicyengine" + getConfig().getEngineLibraryNameSuffix() + ".so");
 if (!engLib) {
 ALOGE("%s: Failed to load the engine library", __FUNCTION__);
 return NO_INIT;
 }
 // Engine
 mEngine = engLib->createEngine();
 if (mEngine == nullptr) {
 ALOGE("%s: Failed to instantiate the APM engine", __FUNCTION__);
 return NO_INIT;
 }
 }
 // APM
 mEngine->setObserver(this);
 // 
 status_t status = mEngine->initCheck();
 if (status != NO_ERROR) {
 LOG_FATAL("Policy engine not initialized(err=%d)", status);
 return status;
 }
 // productStrategy
 mCommunnicationStrategy = mEngine->getProductStrategyForAttributes(
 mEngine->getAttributesForStreamType(AUDIO_STREAM_VOICE_CALL));
 // 
 onNewAudioModulesAvailableInt(nullptr /*newDevices*/);
 // make sure default device is reachable
 if (mDefaultOutputDevice == 0 || !mAvailableOutputDevices.contains(mDefaultOutputDevice)) {
 ALOGE_IF(mDefaultOutputDevice != 0, "Default device %s is unreachable",
 mDefaultOutputDevice->toString().c_str());
 status = NO_INIT;
 }
 // If microphones address is empty, set it according to device type
 for (size_t i = 0; i < mAvailableInputDevices.size(); i++) {
 if (mAvailableInputDevices[i]->address().empty()) {
 if (mAvailableInputDevices[i]->type() == AUDIO_DEVICE_IN_BUILTIN_MIC) {
 mAvailableInputDevices[i]->setAddress(AUDIO_BOTTOM_MICROPHONE_ADDRESS);
 } else if (mAvailableInputDevices[i]->type() == AUDIO_DEVICE_IN_BACK_MIC) {
 mAvailableInputDevices[i]->setAddress(AUDIO_BACK_MICROPHONE_ADDRESS);
 }
 }
 }
 ALOGW_IF(mPrimaryOutput == nullptr, "The policy configuration does not declare a primary output");
 // Silence ALOGV statements
 property_set("log.tag." LOG_TAG, "D");
 // 
 updateDevicesAndOutputs();
 return status;
}

AudioPolicyManager初始化主要依赖于loadConfig()和initialize()函数:
loadConfig()用来加载音频配置文件(audio_policy_configuration.xml),Android为每种音频接口定义了对应的硬件抽象层,优先加载/vendor/etc/audio_policy.conf配置文件, 如果该配置文件不存在, 则加载/system/etc/audio_policy.conf配置文件。AudioPolicyManager加载完所有音频接口后,就知道了系统支持的所有音频接口参数,可以为音频输出提供决策。同时也加载audio_volumes.xml,初始化各种音频流对应的音量调节点

initialize()主要实现加载音频engine库、创建Engine对象;调用IAudioFlinger,通过mDevicesFactoryHal添加hal库初始化,然后添加到全局变量中(audio module模块包括:primary、A2DP、USB、remote_submix、hearing_aid)

五、总结

audioserver启动会加载AudioFlinger和AudioPolicyService两个服务,这两个服务会加载配置文件,解析音频输入、输出硬件信息,并且加载HIDL/AIDL,建立与hardware的通信连接,至此audioserver启动完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值