初始化(AudioPolicy)
- AudioPolicyService构造
- new AudioCommandThread【ApmTone】
- new AudioCommandThread【ApmAudio】
- new AudioCommandThread【ApmOutput】
- hw_get_module()【打开策略模块】
- audio_policy_dev_open()【创建策略设备】
- mpAudioPolicyDev->create_audio_policy()【创建策略,步骤二】
- mpAudioPolicy->init_check()
- loadPreProcessorConfig()【加载音效配置文件】
- 文件/system/etc/audio_effects.conf
- 文件/vendor/etc/audio_effects.conf
- legacy_audio_policy创建策略
默认策略HAL实现,读取audio_policy.conf文件,打开连接主类型设备的输出流(default_output_device,只有一个类型)。
- new AudioPolicyCompatClient【新老接口转换audio_policy_service_ops】
- createAudioPolicyManager()
- new AudioPolicyManagerDefault()【继承AudioPolicyManagerBase】
- loadAudioPolicyConfig()
- 文件/vendor/etc/audio_policy.conf
- 文件/system/etc/audio_policy.conf
- loadGlobalConfig()【解析全局配置】
- loadHwModules()【解析模块配置,mHwModules】
- loadHwModule【解析一个模块的配置,HwModule】
- loadOutput【IOProfile】
- loadInput【IOProfile】
- loadHwModule【解析一个模块的配置,HwModule】
- foreach mHwModules
- mpClientInterface->loadHwModule()【加载模块和声音设备】
- foreach module->mOutputProfiles
- if 【模块包含attached_output_devices,且没有AUDIO_OUTPUT_FLAG_DIRECT】
- mpClientInterface->openOutput()【打开设备输出流】
- aps_open_output()
- af->openOutput()【步骤三】
- aps_open_output()
- addOutput()【增加到mOutputs】
- setOutputDevice()【更改输出设备路由】
- mOutputs.valueFor()【查找对应的AudioOutputDescriptor】
- if (outputDesc->isDuplicated())【分别设置内部的两个Output】
- setOutputDevice(outputDesc->mOutput1->mId)
- setOutputDevice(outputDesc->mOutput2->mId)
- return
- checkDeviceMuteStrategies()【改变路由前静音,步骤四】
- mpClientInterface->setParameters()【设置routing】
- aps_set_parameters()
- audioPolicyService->setParameters()【步骤五】
- aps_set_parameters()
- mpClientInterface->openOutput()【打开设备输出流】
- if 【模块包含attached_output_devices,且没有AUDIO_OUTPUT_FLAG_DIRECT】
- updateDevicesAndOutputs()
- for [0, NUM_STRATEGIES)
- getDeviceForStrategy()【计算具体策略表】
- for [0, NUM_STRATEGIES)
- loadAudioPolicyConfig()
- new AudioPolicyManagerDefault()【继承AudioPolicyManagerBase】
- AudioFlinger打开输出流(openOutput,对应PlaybackThread)
- AudioFlinger::openOutput()
- findSuitableHwDev_l()【查找适合的模块】
- if (module == 0)【没有指定模块】
- else【指定了模块】
- find mAudioHwDevs by module
- return audioHwDevice
- findSuitableHwDev_l()【查找适合的模块】
- outHwDev->hwDevice()【获取audio_hw_device设备】
- nextUniqueId()【生成唯一ID】
- hwDevHal->open_output_stream()【打开流audio_stream_out_t】
- new AudioStreamOut
- if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)
- new OffloadThread
- else if 【AUDIO_OUTPUT_FLAG_DIRECT或!PCM_16_BIT或!STEREO】
- new DirectOutputThread
- else
- new MixerThread
- mPlaybackThreads.add(id,thread)【id对应thread】
- thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED)
- mAudioFlinger->audioConfigChanged_l()【通知所有客户端】
- foreach mNotificationClients
- client->audioFlingerClient()->ioConfigChanged()
- foreach mNotificationClients
- mAudioFlinger->audioConfigChanged_l()【通知所有客户端】
- AudioPolicyManagerBase策略静音(checkDeviceMuteStrategies)
- AudioPolicyManagerBase::checkDeviceMuteStrategies()
- 《TO BE CONTINUED》
- AudioPolicyService设置参数(setParameters)
- AudioPolicyService::setParameters()
- mAudioCommandThread->parametersCommand()
- new AudioCommand
- new ParametersData
- insertCommand_l()
- mAudioCommands.insertAt()
- mWaitWorkCV.signal()
- mAudioCommandThread->parametersCommand()
- AudioCommandThread线程里面处理(SET_PARAMETERS)
- AudioPolicyService::AudioCommandThread::threadLoop()
- case SET_PARAMETERS
- AudioSystem::setParameters()
- af->setParameters()【AudioFlinger】
- AudioSystem::setParameters()
- case SET_PARAMETERS
- AudioFlinger处理(setParameters)
- AudioFlinger::setParameters()
- checkPlaybackThread_l()【查找】
- if (thread == primaryPlaybackThread_l())
- foreach mRecordThreads【通知输入线程】
- thread->setParameters()
- foreach mRecordThreads【通知输入线程】
- thread->setParameters()【ThreadBase】
- mNewParameters.add()
- mWaitWorkCV.signal()
- PlaybackThread处理(setParameters)
- PlaybackThread::threadLoop()
- checkForNewParameters_l()【MixerThread、DirectOutputThread】
- mOutput->stream->common.set_parameters()【HAL audio_stream】
- checkForNewParameters_l()【MixerThread、DirectOutputThread】
初始化(AudioService)
- AudioService.AudioService()【构造】
- mAppOps【AppOpsManager,Context.APP_OPS_SERVICE】
- mVoiceCapable【是否支持电话,config_voice_capable】
- mAudioEventWakeLock【部分消息处理中不能待机,pm.newWakeLock()】
- mHasVibrator【是否有振动器,VIBRATOR_SERVICE】
- MAX_STREAM_VOLUME[STREAM_VOICE_CALL]【ro.config.vc_call_vol_steps】
- sSoundEffectVolumeDb【config_soundEffectVolumeDb】
- mVolumePanel【UI】
- createAudioSystemThread()【AudioHandler消息处理线程】
- new AudioSystemThread().start()
- waitForAudioHandlerCreation()【等待线程内部Handler创建】
- mMediaFocusControl【new MediaFocusControl】
- AudioSystem.setErrorCallback()
- mCameraSoundForced【config_camera_sound_forced】
- sendMsg(MSG_SET_FORCE_USE)
- mSafeMediaVolumeState【Settings.Global.AUDIO_SAFE_VOLUME_STATE】
- mSafeMediaVolumeIndex【config_safe_media_volume_index】
- mUseFixedVolume【每个流类型统一音量,config_useFixedVolume】
- updateStreamVolumeAlias()
- if (mVoiceCapable)
- mStreamVolumeAlias = STREAM_VOLUME_ALIAS
- else
- mStreamVolumeAlias = STREAM_VOLUME_ALIAS_NON_VOICE
- if (mVoiceCapable)
- readPersistedSettings()
- mRingerMode【Settings.Global.MODE_RINGER】
- mVibrateSetting
- updateRingerModeAffectedStreams()
- readDockAudioSettings()
- mMuteAffectedStreams【System.MUTE_STREAMS_AFFECTED】
- masterMute【System.VOLUME_MASTER_MUTE】
- if (mUseFixedVolume)
- masterMute = false
- AudioSystem.setMasterVolume(1.0f) 【设置主音量】
- AudioSystem.setMasterMute()【设置主静音模式】
- broadcastMasterMuteStatus()【AudioManager.MASTER_MUTE_CHANGED_ACTION】
- broadcastRingerMode()【AudioManager.RINGER_MODE_CHANGED_ACTION】
- broadcastVibrateSetting()【AudioManager.VIBRATE_SETTING_CHANGED_ACTION】
- mMediaFocusControl.restoreMediaButtonReceiver()
- mSettingsObserver【new SettingsObserver()】
- createStreamStates()
- for i = 0 ~ AudioSystem.getNumStreamTypes()
- new VolumeStreamState
- mStreamType【i】
- mIndexMax【MAX_STREAM_VOLUME[i] * 10】
- AudioSystem.initStreamVolume()
- mDeathHandlers【】
- readSettings()
- if (mUseFixedVolume)
- mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT)【mIndexMax】
- return
- mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT)【DEFAULT_STREAM_VOLUME * 10】
- forall AudioSystem.DEVICE_OUT_ALL【所有设备】
- getSettingNameForDevice()【设置项目名称】
- Settings.System.getIntForUser()
- mIndex.put()【】
- if (mUseFixedVolume)
- new VolumeStreamState
- for i = 0 ~ AudioSystem.getNumStreamTypes()
- readAndSetLowRamDevice()
- setRingerModeInt()
- new IntentFilter()【计算广播过滤器,mReceiver】
- mMonitorOrientation【ro.audio.monitorOrientation】
- setOrientationForAudioSystem()
- mMonitorRotation【ro.audio.monitorRotation】
- setRotationForAudioSystem()
- context.registerReceiver()
- mUseMasterVolume【config_useMasterVolume】
- mMasterVolumeRamp【数组,config_masterVolumeRamp】
设备接入
- 外部报告设备接入
谁是外部?
- AudioSystem::setDeviceConnectionState()【AVAILABLE】
- aps->setDeviceConnectionState【IAudioPolicyService】
- mpAudioPolicy->set_device_connection_state()
- AudioPolicyManagerBase::setDeviceConnectionState()
- mpAudioPolicy->set_device_connection_state()
- aps->setDeviceConnectionState【IAudioPolicyService】
- AudioPolicyManagerBase处理设备状态更新
- AudioPolicyManagerBase::setDeviceConnectionState()【AVAILABLE】
- if (audio_is_output_device(device))
- checkOutputsForDevice()【打开该设备的所有流,返回所有与该设备相关的outputs,步骤三】
- mAvailableOutputDevices【登记新设备】
- device_address【转换为参数paramStr】
- foreach outputs
- mpClientInterface->setParameters()
- checkA2dpSuspend()
- checkOutputForAllStrategies()【检查几种策略】
- checkOutputForStrategy()【执行策略变化,步骤四】
- foreach outputs【关闭FLAG_DIRECT,mDirectOpenCount==0】
- closeOutput()
- mpClientInterface->closeOutput()
- closeOutput()
- updateDevicesAndOutputs()【更新策略表mDeviceForStrategy】
- foreach mOutputs
- getNewDevice()
- 【根据流上激活的策略,按照一定的策略优先级顺序,计算输出设备】
- setOutputDevice()【更新输出流的设备路由,见初始化流程中】
- getNewDevice()
- 【输出转输入,继续处理,WIRED_HEADSET、BLUETOOTH_SCO】
- 【输出设备处理结束】
- if (audio_is_input_device(device))
- 【输入设备处理结束】
- if (audio_is_output_device(device))
- 打开该设备的所有流(checkOutputsForDevice)
- foreach mOutputs【查找已经打开可以路由到该设备的输出流】
- foreach mHwModules/mOutputProfiles【查找可以路由到该设备的输出端口】
- foreach profiles【没有打开的profile,都打开】
- mpClientInterface->openOutput()
- if (desc->mFlags & AUDIO_OUTPUT_FLAG_DIRECT)
- addOutput()
- else【非DIRECT,增加DuplicateOutput复制主output】
- addOutput()
- applyStreamVolumes()
- mpClientInterface->openDuplicateOutput()
- addOutput()
- applyStreamVolumes()
- outputs.add(output)【添加到输出集合中】
- 执行某个策略变化(checkOutputForStrategy)
根据新老情形,以及输入策略类型,计算新老目标输出流集合。老的通过缓存(fromCache)和备份的所有流集合(mPreviousOutputs)计算。
- getDeviceForStrategy()【老的和新的】
- getOutputsForDevice()【老的和新的】
- if (!vectorsEqual(srcOutputs,dstOutputs))【有变化】
- foreach srcOutputs【老的目标输出流集合】
- if (output->isStrategyActive())【该流上的本策略是激活的】
- setStrategyMute()【移动策略时静音】
- if (output->isStrategyActive())【该流上的本策略是激活的】
- if (strategy == STRATEGY_MEDIA)
- mpClientInterface->moveEffects()
- for (i = 0 to NUM_STREAM_TYPES)
- if (getStrategy(i) == strategy)
- mpClientInterface->setStreamOutput()【移动Track】
- aps_set_stream_output()
- af->setStreamOutput()【步骤五】
- aps_set_stream_output()
- mpClientInterface->setStreamOutput()【移动Track】
- if (getStrategy(i) == strategy)
- foreach srcOutputs【老的目标输出流集合】
- AudioFlinger切换输出流(setStreamOutput)
AudioFlinger仅仅把指定类型的流置为invalid状态。
- foreach mPlaybackThreads
- thread->invalidateTracks()
- foreach mTracks
- if (t->streamType() == streamType)【类型匹配】
- t->invalidate()
- if (t->streamType() == streamType)【类型匹配】
- foreach mTracks
- thread->invalidateTracks()
音量设置
- AudioManager处理音量按键事件(handleKeyDown、handleKeyUp)
音量按键事件由PhoneWindowManager在interceptKeyBeforeQueueing方法中转发给AudioManager处理。
- AudioManager:: handleKeyDown()
- case KeyEvent.KEYCODE_VOLUME_UP
- case KeyEvent.KEYCODE_VOLUME_DOWN
- if (mUseMasterVolume)
- adjustMasterVolume()【加减一个等级】
- service.adjustMasterVolume()【步骤二】
- adjustMasterVolume()【加减一个等级】
- else
- adjustSuggestedStreamVolume()
- service.adjustSuggestedStreamVolume()【步骤二】
- adjustSuggestedStreamVolume()
- if (mUseMasterVolume)
- case KeyEvent.KEYCODE_VOLUME_MUTE
- if (mUseMasterVolume)
- setMasterMute(!isMasterMute())
- service.setMasterMute()【步骤二】
- setMasterMute(!isMasterMute())
- if (mUseMasterVolume)
- AudioService调整音量处理
设置主音量直接设置的底层了,设置流类型的音量在Handler线程处理。
- AudioService.adjustMasterVolume()【调整主音量】
- findVolumeDelta()【根据当前音量,调整量不同】
- setMasterVolume()
- mAppOps.noteOp(OP_AUDIO_MASTER_VOLUME)
- doSetMasterVolume()
- AudioSystem.setMasterVolume()【JNI方法】
- AudioSystem::setMasterVolume()【Native方法】
- af->setMasterVolume()【步骤四】
- AudioSystem::setMasterVolume()【Native方法】
- if (newVolume != oldVolume)
- sendMsg(MSG_PERSIST_MASTER_VOLUME)【保存到系统设置里面Settings.System.VOLUME_MASTER】
- sendMasterVolumeUpdate()
- sendBroadcastToAll(MASTER_VOLUME_CHANGED_ACTION)【通知UI更新】
- AudioSystem.setMasterVolume()【JNI方法】
- AudioService.setMasterMute()【设置主音量静音状态】
- AudioSystem.setMasterMute(state) 【JNI方法】
- AudioSystem::setMasterMute ()【Native方法】
- af->setMasterMute()【步骤四】
- AudioSystem::setMasterMute ()【Native方法】
- sendMsg(MSG_PERSIST_MASTER_VOLUME_MUTE) 【保存到系统设置里面Settings.System.VOLUME_MASTER_MUTE】
- sendMasterMuteUpdate()【通知UI更新】
- AudioSystem.setMasterMute(state) 【JNI方法】
- AudioService.adjustSuggestedStreamVolume()【调整某种流的音量】
- getActiveStreamType()【获取当前活动流类型】
- adjustStreamVolume()
- 【转换为替代类型,mStreamVolumeAlias,后面都是先设置替代类型】
- getDeviceForStream()
- AudioSystem.getDevicesForStream()
- mAppOps.noteOp()
- rescaleIndex()【使用数值10,缩放到Alias类型的范围】
- streamState.adjustIndex()【VolumeStreamState记录某个流类型各设备的音量】
- setIndex()
- getValidIndex()【限制在0~mIndexMax之间】
- foreach 【被替代的流,Alias,跟着一起改变】
- rescaleIndex()【从Alias的音量范围缩放到该类型的范围】
- setIndex()
- sendMsg(MSG_SET_DEVICE_VOLUME)【线程里面处理】
- sendVolumeUpdate()【通知UI更新】
- AudioHandler线程处理
- AudioService.AudioHandler.handleMessage()
- case MSG_SET_DEVICE_VOLUME
- setDeviceVolume()
- streamState.applyDeviceVolume()【index+5/10,四舍五入】
- AudioSystem.setStreamVolumeIndex()【JNI方法】
- AudioSystem::setStreamVolumeIndex()【Native方法】
- aps->setStreamVolumeIndex()【步骤五】
- AudioSystem::setStreamVolumeIndex()【Native方法】
- AudioSystem.setStreamVolumeIndex()【JNI方法】
- foreach 【被替代的流,Alias,跟着一起改变】
- getDeviceForStream()
- stream.applyDeviceVolume()
- sendMsg(MSG_PERSIST_VOLUME) 【保存到系统设置里面Settings.System.VOLUME_MASTER】
- streamState.applyDeviceVolume()【index+5/10,四舍五入】
- setDeviceVolume()
- case MSG_SET_DEVICE_VOLUME
- AudioFlinger设置主音量
- AudioFlinger::setMasterVolume()
- foreach mAudioHwDevs【如果HAL支持,设置到HAL中】
- dev->hwDevice()->set_master_volume()
- foreach mPlaybackThreads
- thread->set_master_volume()
- if (mOutput->audioHwDev->canSetMasterVolume())
- mMasterVolume = 1.0【如果HAL支持,不需要软件实现】
- else
- mMasterVolume = value
- if (mOutput->audioHwDev->canSetMasterVolume())
- thread->set_master_volume()
- foreach mAudioHwDevs【如果HAL支持,设置到HAL中】
- AudioFlinger::setMasterMute()
- foreach mAudioHwDevs【如果HAL支持,设置到HAL中】
- dev->hwDevice()->set_master_mute()
- foreach mPlaybackThreads
- thread->set_master_volume()
- if (mOutput->audioHwDev->canSetMasterMute())
- mMasterMute = false【如果HAL支持,不需要软件实现】
- else
- mMasterMute = muted
- if (mOutput->audioHwDev->canSetMasterMute())
- thread->set_master_volume()
- foreach mAudioHwDevs【如果HAL支持,设置到HAL中】
- AudioPolicyService设置流类型音量(setStreamVolumeIndex)
- AudioPolicyService::setStreamVolumeIndex()
- if (mpAudioPolicy->set_stream_volume_index_for_device)
- mpAudioPolicy->set_stream_volume_index_for_device()【步骤六】
- else
- mpAudioPolicy->set_stream_volume_index()【不指定设备】
- if (mpAudioPolicy->set_stream_volume_index_for_device)
- AudioPolicyManagerBase设置音量(setStreamVolumeIndex)
- AudioPolicyManagerBase::setStreamVolumeIndex()
- 更新到mStreams【StreamDescriptor记录一种流的每个设备的音量设置】
- foreach mOutputs【音量设置到每个输出流上】
- getDeviceForVolume()【多个设备,由其中的SPEAKER或者ALL_A2DP代表】
- if ((device == AUDIO_DEVICE_OUT_DEFAULT) || (device == curDevice))【当前输出流的设备与目标设备一样,或者没有确定的目标】
- checkAndSetVolume()【修改输出流上该类型流的音量】
- computeVolume()【计算音量,见细节“音量计算”】
- volIndexToAmpl()【等级标准值】
- if 【AudioOutputDescriptor记录每个流类型的当前音量,如果新老音量值不一样】
- mpClientInterface->setStreamVolume()
- aps_set_stream_volume()
- audioPolicyService->setStreamVolume()【步骤七】
- aps_set_stream_volume()
- mpClientInterface->setStreamVolume()
- computeVolume()【计算音量,见细节“音量计算”】
- checkAndSetVolume()【修改输出流上该类型流的音量】
- AudioPolicyService设置音量(setStreamVolume)
- mAudioCommandThread->volumeCommand()
- new AudioCommand
- new VolumeData
- insertCommand_l()
- mWaitWorkCV.signal()
- AudioCommandThread线程里面处理(SET_VOLUME)
- AudioPolicyService::AudioCommandThread::threadLoop()
- case SET_VOLUME
- AudioSystem::setStreamVolume()
- af->setStreamVolume()【AudioFlinger,步骤九】
- AudioSystem::setStreamVolume()
- case SET_VOLUME
- AudioFlinger处理(setStreamVolume)
- AudioFlinger::setStreamVolume()
- checkPlaybackThread_l()【查找】
- if (thread == NULL)【没有指定输出流】
- foreach mPlaybackThreads【通知输入线程】
- thread->setStreamVolume()【PlaybackThread】
- 【mStreamTypes记录每个流类型的音量和静音状态】
- broadcast_l()
- thread->setStreamVolume()【PlaybackThread】
- foreach mPlaybackThreads【通知输入线程】
- else
- thread->setStreamVolume()【同上】
- MixerThread使用音量(prepareTracks_l)
打开输出轨道
- 应用与AudioFlinger连接
连接由AudioSystem管理,上层逻辑不会主动与AudioFlinger连接,当调用到AudioFlinger接口方法时,AudioSystem连接到AudioFlinger服务,并将当前进程注册到AudioFlinger内部。
- AudioSystem::get_audio_flinger()
- ServiceManager::getService()【进程单例,等待并循环】
- new AudioFlingerClient【进程单例】
- gAudioFlinger->registerClient()
- new NotificationClient()
- mNotificationClients.add()
- foreach mPlaybackThreads
- thread->sendIoConfigEvent(OUTPUT_OPENED)
- sendIoConfigEvent_l【使用内部线程发送,防止死锁】
- new IoConfigEvent
- mConfigEvents.add()
- mWaitWorkCV.signal()
- sendIoConfigEvent_l【使用内部线程发送,防止死锁】
- thread->sendIoConfigEvent(OUTPUT_OPENED)
- foreach mRecordThreads
- thread->sendIoConfigEvent(OUTPUT_OPENED)
- 应用内部创建AudioTrack
- AudioTrack::AudioTrack()
- AudioTrack::set()
- transferType【参数检查,默认值设置】
- streamType【默认AUDIO_STREAM_MUSIC】
- sampleRate【默认根据streamType计算】
- format【默认AUDIO_FORMAT_PCM_16_BIT】
- channelMask【默认AUDIO_CHANNEL_OUT_STEREO】
- AudioSystem::getOutput()
- aps->getOutput()【使用策略,步骤三】
- if (cbf != NULL)
- new AudioTrackThread【创建线程调用回调】
- createTrack_l()
- AudioSystem::getLatency()【output的latency】
- AudioSystem::get_audio_flinger()【与AudioFlinger连接,步骤一】
- AudioSystem::getFrameCount()【output的framecount】
- AudioSystem::getSamplingRate【output的samplerate】
- audioFlinger->createTrack()【创建Track,步骤四】
- track->getCblk()【获取内存控制块】
- mAudioTrack->attachAuxEffect()
- new AudioTrackClientProxy【创建客户缓存管理对象】
- AudioSystem::getLatency()【output的latency】
- AudioSystem::acquireAudioSessionId()【增加当前进程对该会话的引用计数】
- AudioTrack::set()
- AudioPolicyService计算策略
- AudioPolicyService::getOutput()
- mpAudioPolicy->get_output()【HAL的ap_get_output】
- AudioPolicyManagerBase::getOutput()
- mpAudioPolicy->get_output()【HAL的ap_get_output】
后面见流程“策略路由”。
- AudioFlinger创建输入轨道(createTrack)
- checkPlaybackThread_l()【根据output查找PlaybackThread】
- registerPid_l()【注册调用者pid】
- new Client【mClients保存所有Client】
- if 【指定了sessionId】
- 【查找包含该会话EffectChain的线程】
- else【如果没有指定】
- nextUniqueId()【分配一个】
- thread->createTrack_l()【创建一个Track,步骤五】
- moveEffectChain_l()【】
- SyncEvent【等待使用的同步处理】
- new TrackHandle【封装Track,代理跨进程访问】
- PlaybackThread创建输入轨道(createTrack_l)
- 【参数检查TRACK_FAST】
- 【校验所有同一个sessionId的Track的strategy必须相同】
- AudioSystem::getStrategyForStream()【stream_type转换到routing_strategy】
- new Track【创建PlaybackThread::Track】
- TrackBase::TrackBase【TrackBase构造】
- if (client != 0)【有客户端】
- client->heap()->allocate()【需要更新内存】
- else
- new uint8_t[size]【申请私有内存】
- new(mCblk) audio_track_cblk_t()【控制块构造】
- if (client != 0)【有客户端】
- new AudioTrackServerProxy()【缓存代理对象】
- thread->getTrackName_l()
- TrackBase::TrackBase【TrackBase构造】
- mTracks.add()
- getEffectChain_l()
- if (chain != 0)
- track->setMainBuffer(chain->inBuffer())
- chain->setStrategy()
- chain->incTrackCnt()
开始播放
- AudioTrack开始播放(start)
- 【mState状态变化】
- if (!(flags & CBLK_INVALID))
- mAudioTrack->start()【步骤二】
- if (flags & CBLK_INVALID)【Track失效了,需要重新打开】
- restoreTrack_l("start")
- AudioSystem::clearAudioConfigCache()
- getOutput_l()【重新计算路由】
- AudioSystem::getOutput()【见流程“打开输出轨道”】
- createTrack_l()
- if (mState == STATE_ACTIVE)
- mAudioTrack->start()【步骤二】
- restoreTrack_l("start")
- AudioFlinger::PlaybackThread::Track开始播放(start)
- 【mState状态变化】
- playbackThread->addTrack_l()【将自己添加到PlaybackThread的激活Track集合】
- if (mActiveTracks.indexOf(track) < 0)
- AudioSystem::startOutput()
- aps->startOutput()
- mpAudioPolicy->start_output()【步骤三】
- aps->startOutput()
- mActiveTracks.add()
- AudioSystem::startOutput()
- broadcast_l()【通知播放线程】
- if (mActiveTracks.indexOf(track) < 0)
- AudioPolicyManagerBase启动输出(startOutput)
- outputDesc->changeRefCount()【增加引用计数】
- if (outputDesc->mRefCount[stream] == 1)
- getNewDevice()【计算新的输出设备】
- setOutputDevice()【更新设备路由】
- if (isInCall())
- handleIncallSonification()
- checkAndSetVolume()【应用音量设置,见流程“音量设置”】
播放线程
省略了WakeLock处理,WakeLock在线程进入睡眠前释放,在线程重新唤醒后获取,并通过mWakeLockUids计算实际代表哪些进程持有WakeLock锁,PlaybackThread在增加、删除Track时在mWakeLockUids中增删对应的进程ID。
- AudioFlinger::PlaybackThread::threadLoop()
- cacheParameters_l()(计算并缓存mixBufferSize、activeSleepTime、idleSleepTime)
- CpuStats cpuStats【构建一个CPU使用统计对象】
- checkSilentMode_l()
- property_get("ro.audio.silent")
- setMasterMute_l()
- while (!exitPending())【没有要求退出】
- cpuStats.sample()【CPU状态做一次采样】
- processConfigEvents()【ThreadBase,处理mConfigEvents】
- mLock.lock()
- checkForNewParameters_l()【派生类,新配置mNewParameters】
- cacheParameters_l()【如果相关参数更新,重新计算】
- saveOutputTracks()【DuplicatingThread,保存mOutputTracks副本】
- if (waitingAsyncCallback_l())【使用异步写入输出流】
- mWaitWorkCV.wait()【需要等待异步ACK或其他事件发生】
- continue【重新循环】
- if 【mActiveTracks空,经过一定延迟standbyDelay,或者主动暂停】
- threadLoop_standby()【进入standby】
- if 【mActiveTracks、mConfigEvents都空】
- clearOutputTracks()【清空之前保存的副本】
- mWaitWorkCV.wait()【等待新的事情去做】
- continue【重新循环】
- prepareTracks_l()【准备数据】
- lockEffectChains_l()【锁定音效链,已有的不能修改】
- if (mBytesRemaining == 0)【需要混音生成更多数据】
- if (mMixerStatus == MIXER_TRACKS_READY)【数据准备好】
- threadLoop_mix()【执行混音,mCurrentWriteLength】
- else if 【不是MIXER_DRAIN_TRACK和MIXER_DRAIN_ALL】
- threadLoop_sleepTime()
- if (isSuspended())【暂停状态,直接丢弃数据】
- foreach effectChains【应用音效】
- effectChains[i]->process_l()
- if (mMixerStatus == MIXER_TRACKS_READY)【数据准备好】
- unlockEffectChains【解锁音效链】
- if (!waitingAsyncCallback())【非异步写输出】
- if (sleepTime == 0)【意味着需要写数据到HAL】
- if (mBytesRemaining)
- threadLoop_write()
- else if 【MIXER_DRAIN_TRACK或者MIXER_DRAIN_ALL】
- threadLoop_drain()
- if (mBytesRemaining)
- else
- usleep(sleepTime)
- if (sleepTime == 0)【意味着需要写数据到HAL】
- threadLoop_removeTracks()
- clearOutputTracks()【清空之前保存的副本】
- 【循环边界】
- threadLoop_exit()
- mOutput->stream->common.standby()【使输出流进入standby模式】
策略路由
策略的输入是:流类型(stream_type)
策略的输出是:输出端口(audio_io_handle_t,对应播放线程PlaybackThread)
- AudioPolicyManagerBase::getOutput
- getStrategy()【stream_type转换为路由策略routing_strategy】
- 详见“算法>路由策略”
- getDeviceForStrategy()【根据routing_strategy选择输出设备类型】
- getOutputsForDevice()【查找所有支持设备类型的输出端口】
- selectOutput()【根据flags选择最匹配的输出端口】
- getStrategy()【stream_type转换为路由策略routing_strategy】