seo网站做推广网站申请qq
seo网站做推广,网站申请qq,给我一个网站,提高WordPress响应速度背景#xff1a;
上一篇文章#xff1a; 深入剖析audio动态策略剖析之AudioPolicy#xff0c;AudioMix#xff0c;AudioMixingRule
已经详细剖析了关于安卓动态路由策略的几个核心类AudioPolicy#xff0c;AudioMix#xff0c;AudioMixingRule。 但是这些类在AudioPol…背景上一篇文章深入剖析audio动态策略剖析之AudioPolicyAudioMixAudioMixingRule已经详细剖析了关于安卓动态路由策略的几个核心类AudioPolicyAudioMixAudioMixingRule。但是这些类在AudioPolicyManager中到底是如何进行匹配到对应device还没分析本文将对AudioMix的匹配部分内容进行深入剖析。回忆一下动态录音情况下正常一个Track如何寻找自己的device流程链路AudioFlinger.cpp-createTrack()AudioSystem.cpp-getOutputForAttr(vectoraudio_io_handle_t* secondaryOutputs)AudioPolicyInterfaceImpl.cpp-AudioPolicyService::getOutputForAttr()AudioPolicyManager.cpp-getOutputForAttr(vectoraudio_io_handle_t*secondaryOutputs)AudioPolicyManager.cpp-getOutputForAttrInt(vectorspAudioPolicyMix*secondaryMixes)AudioPolicyMix.cpp-AudioPolicyMixCollection::getOutputForAttr(spAudioPolicyMixprimaryMix,vectorspAudioPolicyMix*secondaryMixes)//核心就是设置secondaryMixes AudioPolicyMix.cpp-AudioPolicyMixCollection::mixMatch()下面就从AudioPolicyMixCollection::getOutputForAttr开始进行分析深入剖析AudioPolicyMixCollection::getOutputForAttrframeworks/av/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cppstatus_tAudioPolicyMixCollection::getOutputForAttr(constaudio_attributes_tattributes,constaudio_config_base_tconfig,constuid_t uid,constaudio_session_t session,audio_output_flags_t flags,constDeviceVectoravailableOutputDevices,constspDeviceDescriptorrequestedDevice,spAudioPolicyMixprimaryMix,std::vectorspAudioPolicyMix*secondaryMixes,boolusePrimaryOutputFromPolicyMixes){ALOGV(getOutputForAttr() querying %zu mixes:,size());primaryMix.clear();boolmixesDisallowsRequestedDevicefalse;constboolisMmapRequested(flagsAUDIO_OUTPUT_FLAG_MMAP_NOIRQ);for(size_t i0;isize();i){spAudioPolicyMixpolicyMixitemAt(i);//根据policy的mRouteFlags来确定primaryOutputMix是否为trueconstboolprimaryOutputMix!is_mix_loopback_render(policyMix-mRouteFlags);//使用track的AudioAttribute相关属性configuidsession等与policMix进行匹配if(!mixMatch(policyMix.get(),i,attributes,config,uid,session)){ALOGV(%s: Mix %zu: does not match,__func__,i);continue;// skip the mix}//运行到这里说明policyMix已经与track对应匹配上了根据primaryOutputMix的flag来吧policyMix进行赋值if(primaryOutputMix){primaryMixpolicyMix;ALOGV(%s: Mix %zu: set primary desc,__func__,i);}else{ALOGV(%s: Add a secondary desc %zu,__func__,i);if(secondaryMixes!nullptr){secondaryMixes-push_back(policyMix);}}}returnNO_ERROR;}总结一下上面这个AudioPolicyMixCollection::getOutputForAttr干的事情1、遍历AudioPolicyMixCollection每个policyMix判断policyMix的mRouteFlags是不是属于primaryOutputMix2、调用mixMatch对policyMix与track的AudioAttribute相关属性configuidsession等3、如果第二步匹配上了则把policyMix赋值给primaryMix或者放入secondaryMixes下面重点看看mixMatch方法boolAudioPolicyMixCollection::mixMatch(constAudioMix*mix,size_t mixIndex,constaudio_attributes_tattributes,constaudio_config_base_tconfig,uid_t uid,audio_session_t session){if(mix-mMixTypeMIX_TYPE_PLAYERS){//判断mix的mMixType是不是PLAYERS// Loopback render mixes are created from a public API and thus restricted// to non sensible audio that have not opted out.if(is_mix_loopback_render(mix-mRouteFlags)){//省略若干异常情况判断// if there is an address match, prioritize that match//核心匹配部分匹配address匹配mix-mCriteriaif(matchAddressToTags(attributes,mix-mDeviceAddress)||areMixCriteriaMatched(mix-mCriteria,attributes,uid,session)){ALOGV(\tgetOutputForAttr will use mix %zu,mixIndex);returntrue;}}elseif(mix-mMixTypeMIX_TYPE_RECORDERS){if(attributes.usageAUDIO_USAGE_VIRTUAL_SOURCEmatchAddressToTags(attributes,mix-mDeviceAddress)){returntrue;}}returnfalse;}这里的重点其实也就是在areMixCriteriaMatched方法下面看看这个areMixCriteriaMatched方法。深入剖析areMixCriteriaMatched源码位置frameworks/av/services/audiopolicy/common/managerdefinitions/src/AudioPolicyMix.cpp// Returns true if vector of criteria is matched:// - If any of the exclude criteria is matched the criteria doesnt match.// - Otherwise, for each dimension of positive rule present// (usage, capture preset, uid, userid...) at least one rule must match// for the criteria to match.boolareMixCriteriaMatched(conststd::vectorAudioMixMatchCriterioncriteria,constaudio_attributes_tattr,constuid_t uid,constaudio_session_t session){// If any of the exclusion criteria are matched the mix doesnt match.//isMatchingExcludeCriterion是一个lamada表达式autoisMatchingExcludeCriterion[](constAudioMixMatchCriterionc){returnc.isExcludeCriterion()isCriterionMatched(c,attr,uid,session);};//首先判断是不是Exclude类型及是不是匹配上了如果匹配上了直接返回if(std::any_of(criteria.begin(),criteria.end(),isMatchingExcludeCriterion)){returnfalse;}uint32_tpresentPositiveRules0;// Bitmask of all present positive criteria.uint32_tmatchedPositiveRules0;// Bitmask of all matched positive criteria.//遍历匹配一个的criterionfor(constautocriterion:criteria){//Exclude规则在上面就以及匹配完毕if(criterion.isExcludeCriterion()){continue;}//这里会记录mRule到presentPositiveRules变量mRule代表就是RULE_MATCH_ATTRIBUTE_USAGE变量presentPositiveRules|criterion.mRule;//核心调用isCriterionMatched进行匹配if(isCriterionMatched(criterion,attr,uid,session)){//匹配成功这里会记录mRule到matchedPositiveRules变量matchedPositiveRules|criterion.mRule;}}//这里判断presentPositiveRules与matchedPositiveRules相等才可以returnpresentPositiveRulesmatchedPositiveRules;}这里主要有3个步骤1、针对Exclude规则rule先匹配2、针对具体rule进行匹配的核心方法isCriterionMatched3、比较presentPositiveRules matchedPositiveRules是否相等第一步其实也就是针对rule为RULE_EXCLUDE_UID带有EXCLUDE会排除。下面看看第二步具体的匹配方法isCriterionMatched// Returns true if the criterion matches.// The exclude criteria are handled in the same way as positive// ones - only condition is matched (the function will return// same result both for RULE_MATCH_X and RULE_EXCLUDE_X).boolisCriterionMatched(constAudioMixMatchCriterioncriterion,constaudio_attributes_tattr,constuid_t uid,constaudio_session_t session){uint32_truleWithoutExclusioncriterion.mRule~RULE_EXCLUSION_MASK;switch(ruleWithoutExclusion){caseRULE_MATCH_ATTRIBUTE_USAGE://usage匹配这里直接判断二者是否相等returncriterion.mValue.mUsageattr.usage;caseRULE_MATCH_ATTRIBUTE_CAPTURE_PRESET://mSource匹配这里直接判断二者是否相等returncriterion.mValue.mSourceattr.source;caseRULE_MATCH_UID://mUid匹配这里直接判断二者是否相等returncriterion.mValue.mUiduid;caseRULE_MATCH_USERID://userId匹配这里直接判断二者是否相等{userid_t userIdmultiuser_get_user_id(uid);returncriterion.mValue.mUserIduserId;}caseRULE_MATCH_AUDIO_SESSION_ID:returncriterion.mValue.mAudioSessionIdsession;}ALOGE(Encountered invalid mix rule 0x%x,criterion.mRule);returnfalse;}isCriterionMatched就是真正匹配的方法它的实现也很简单就是对track的usageuiduserid与AudioMixMatchCriterion进行比对只要比对上了就返回true。最后看看第三步 presentPositiveRules matchedPositiveRules解释这里presentPositiveRules代表是当前AudioMixMatchCriterion集合中所有参与匹配调用isCriterionMatched方法的rule都会被记录到presentPositiveRules变量中而matchedPositiveRules代表是真正匹配上的rule。这里最后举出一个案例说明假设 Audio Policy Mix是如下这种一共有3个Criterion但是3个Criterion其实都是同一个类型的rule都是为RULE_MATCH_ATTRIBUTE_USAGE。Audio Policy Mix: Audio Policy Mix1(0x6fe3a7a510): - mix type: MIX_TYPE_PLAYERS - Route Flags: MIX_ROUTE_FLAG_RENDER|MIX_ROUTE_FLAG_LOOP_BACK - device type: AUDIO_DEVICE_OUT_REMOTE_SUBMIX - device address:1458232435:ap:9mixp:0 - output:181- Criterion0: RULE_MATCH_ATTRIBUTE_USAGE AUDIO_USAGE_UNKNOWN - Criterion1: RULE_MATCH_ATTRIBUTE_USAGE AUDIO_USAGE_MEDIA - Criterion2: RULE_MATCH_ATTRIBUTE_USAGE AUDIO_USAGE_GAME所以上面的presentPositiveRules值永远都是为RULE_MATCH_ATTRIBUTE_USAGE对于matchedPositiveRules这个值因为要成功执行isCriterionMatched返回true才会对matchedPositiveRules值进行改变赋值对于的rule。所以只需要3个Criterion中只要有一个比如AUDIO_USAGE_MEDIA匹配上了那么最后的结果都是matchedPositiveRules presentPositiveRules因为3个Criterion都是同一种类型的RULE_MATCH_ATTRIBUTE_USAGE。原文链接https://mp.weixin.qq.com/s/i16f0T74FIy52mat9-RKYA更多fwaudio开发实干货如下https://mp.weixin.qq.com/s/pQr-HrW0EUoi5QHTMOGEBQ