福田做商城网站建设多少钱,做网站里面的内容,业务型网站做seo,怀化招标网站文章目录 问题描述问题分析流程梳理问题原因 问题描述
多屏设备#xff0c;没有按照配置car_audio_configuration.xml配置输出。也即是每个屏幕播放的音频没有对应输出到想对应的bus设备。
问题分析
首先根据hal层的log#xff0c;确认框架层配置的bus#xff0c;确认框架… 文章目录 问题描述问题分析流程梳理问题原因 问题描述
多屏设备没有按照配置car_audio_configuration.xml配置输出。也即是每个屏幕播放的音频没有对应输出到想对应的bus设备。
问题分析
首先根据hal层的log确认框架层配置的bus确认框架配置的是主屏的bus0确认userID displayID audioZoneId 三者之间的映射关系 userID 代表了每个屏幕对应的用户zoneID 和 occupation ID 对应occupation ID 和 display ID对应 zoneID 就和displayID 对应起来了。 zoneId0 config{userId10 displays{displayId0 displayType1} audioZoneId0}zoneId1 config{userId11 displays{displayId6 displayType1} audioZoneId1}zoneId2 config{userId12 displays{displayId3 displayType1} audioZoneId2}zoneId3 config{userId13 displays{displayId2 displayType1} audioZoneId3}zoneId4 config{userId14 displays{displayId4 displayType1} audioZoneIdnone}zoneId5 config{userId15 displays{displayId5 displayType1} audioZoneIdnone}通过dumpsys car_service | grep user可以看到对应的关系 比如上面的代码可以看出audioZoneid ----- displayID ------ userID之间的关系 这个映射关系是对的。
查看audio的信息 可以通过dumpsys audio 或者media.audio_policy如果忘记命令可以dumpsys -l | grep audio dumpsys audio 可以看到usrID 和address的映射关系 Uid Device Affinities:UserId Device Affinities:UserId: 10Type: 0x1000000 Address: bus6_notification_outType: 0x1000000 Address: bus0_media_outType: 0x1000000 Address: bus2_voice_command_outType: 0x1000000 Address: bus1_navigation_outType: 0x1000000 Address: bus4_call_outType: 0x1000000 Address: bus3_call_ring_outType: 0x1000000 Address: bus7_system_sound_outType: 0x1000000 Address: bus5_alarm_outUserId: 11Type: 0x1000000 Address: bus100_audio_zone_1UserId: 12Type: 0x1000000 Address: bus200_audio_zone_2UserId: 13Type: 0x1000000 Address: bus300_audio_zone_3dumpsys media.audio_policy可以看到所有注册到policy 中的mix路径。其中的critertion 代表路由到这个mix的规则 比如下面的表示usage是AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE 并且不是user 11 12 13的使用这个policyMix。 Audio Policy Mix 4 (0xb4000075f6ddab30):- mix type: MIX_TYPE_PLAYERS- Route Flags: MIX_ROUTE_FLAG_RENDER- device type: AUDIO_DEVICE_OUT_BUS- device address: bus1_navigation_out- output: 21- Criterion 0: RULE_MATCH_ATTRIBUTE_USAGE AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE- Criterion 1: RULE_EXCLUDE_USERID 11- Criterion 2: RULE_EXCLUDE_USERID 12- Criterion 3: RULE_EXCLUDE_USERID 13查看显示的信息
可以通过dumpsys display 和 dumpsys SurfaceFlinger确认屏幕的类型 比如下面surfaceflinger的信息可以看到某个屏幕的信息。 找到对应的屏幕。
isplayId243, Connector 438, Type DP-1, Connector state DRM_MODE_CONNECTED但这样也不容易看到可以通过scrcpy --display 加上后面的displayId来确认哪个屏。 比如想要调试audioZoneId 为4 的那么就是–display 2 这样。
流程梳理 根据经验路由的规则是由用户id决定的一般路由不对就是用户id配置的不对。但是通过上面的信息可以看到用户id 和 audioZone是对应的。查看policy 发现没有新加入的zone300 address 相关的路由。 从audioPolicyManager出发看registerPolicyMixes 中注册了多少个mixesmanger中只注册了10个mix。 先略过中间的流程 从应用carAudioService开始 在添加mix 的地方确认所有的mix 都加入总共11个。 那就是从应用加mix 到manager 中间少掉了一个mix。 上层路由添加流程 是遍历所有group中的address 每个address 生成一个mixingRule, 然后每个group 中的context 转成usage对于每个usage 生成一个rule这个rule添加到mix 的critertion中android所有的有效的context总共10个可以对应到20个usage就是每个mix最高有20个critertion。 生成的每个mixrule 添加到audiopolicy 中。 这个audiopolicy 通过audioservice 注册到registerAudioPolicy框架中在注册的调用中调用connectMixes 中 mAudioSystem.registerPolicyMixes(mMixes, true); 将mixer注册的system。 这个是通过android_media_AudioSystem_registerPolicyMixes的jni调用到AudioSystem::registerPolicyMixes audioSystem在调用到aps-registerPolicyMixes(mixesAidl, registration)其中aps是AudioPolicyService 也就是调用的 AudioPolicyService::registerPolicyMixes。最后这边调用到了AudioPolicyManager::registerPolicyMixes。 这整条链路中 android_media_AudioSystem_registerPolicyMixes AudioSystem::registerPolicyMixes AudioPolicyService::registerPolicyMixes 这三个地方都有mix的size判断。
问题原因
carAudioService 中跟xml解析 构造好mix的rule 之后将这些rule 注册到audiopolicymanager。播放音频 创建track 获取输出设备的时候从注册的mix rule中找到符合输出的rule 这个rule 包含了userid的信息。因为框架中限制了外部注册的mix数量导致最后一个usrid为13的 rule没有注册进去。 后面在找的时候找不到就默认用了rule中的第一个了。