AAOS音频路由 问题分析

文章目录

      • 问题描述
      • 问题分析
      • 流程梳理
      • 问题原因

问题描述

多屏设备,没有按照配置car_audio_configuration.xml配置输出。也即是每个屏幕播放的音频没有对应输出到想对应的bus设备。

问题分析

  1. 首先根据hal层的log,确认框架层配置的bus,确认框架配置的是主屏的bus0
  2. 确认userID displayID audioZoneId 三者之间的映射关系 userID 代表了每个屏幕对应的用户,zoneID 和 occupation ID 对应,occupation ID 和 display ID对应, zoneID 就和displayID 对应起来了。
 zoneId=0 config={userId=10 displays={displayId=0 displayType=1} audioZoneId=0}zoneId=1 config={userId=11 displays={displayId=6 displayType=1} audioZoneId=1}zoneId=2 config={userId=12 displays={displayId=3 displayType=1} audioZoneId=2}zoneId=3 config={userId=13 displays={displayId=2 displayType=1} audioZoneId=3}zoneId=4 config={userId=14 displays={displayId=4 displayType=1} audioZoneId=none}zoneId=5 config={userId=15 displays={displayId=5 displayType=1} audioZoneId=none}

通过dumpsys car_service | grep user可以看到对应的关系
比如上面的代码可以看出audioZoneid -----> displayID ------> userID之间的关系, 这个映射关系是对的。

  1. 查看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_3

dumpsys 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
  1. 查看显示的信息

可以通过dumpsys display 和 dumpsys SurfaceFlinger确认屏幕的类型, 比如下面surfaceflinger的信息可以看到某个屏幕的信息。 找到对应的屏幕。

isplayId=243, 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 中注册了多少个mixes,manger中只注册了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中的第一个了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/76339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift学习笔记四(function 篇)

目录 1 Function 概念及定义。 1.1 Function概念 1.2 Function定义 1.3 Function参数 1.3.1 无形式参数 1.3.2 多形式参数的函数 1.4 返回值 1.4.1 无返回值类型 1.4.2 多返回值类型 1.4.3 可选元组返回类型 1.4.4 隐式返回的类型 1.4.5 实参标签和形参名 1.4.6 指…

卷积神经网络:深度学习的重要支柱

卷积神经网络:深度学习的重要支柱 卷积神经网络(Convolutional Neural Network,简称CNN)是深度学习领域中最著名的算法之一。它是一种特殊的神经网络,尤其适用于处理图像、视频等网格形式的数据。自从1998年Yann LeCun…

功率放大器的定义详解

功率放大器是一种电子放大器,主要用于将输入信号的功率放大到足以驱动负载或输出器件所需的水平。通常,功率放大器会将低电平高电流的输入信号转换成高电平低电流的输出信号,以便给负载提供足够的功率。 功率放大器广泛应用于各种应用场合&am…

Linux工具——gcc

目录 一,gcc简介 二,C语言源文件的编译过程 1.预处理 2.编译 3.汇编 4.链接 5.动静态库 一,gcc简介 相信有不少的小白和我一样在学习Linux之前只听说过visual studio。其实这个gcc这个编译器实现的功能便是和visual studio一样的功能&…

学习 [Spring MVC] 的JSR 303和拦截器,提高开发效率

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想,不断更新自己 ! 1.JSR303 1.1JSR303是什么 JSR 303是Java规范请求(Java Specification Request)…

matlab数据处理: cell table array+datetime

原数据文件.csv matlab xlsread(filename{i},B2:T2881) 会同于Excel最多1048576行 舍弃 a{1,i} xlsread(filename{i},‘B2:T2881’);%读取excel文件,选定区域’B2:G2881’ readcell(filename{i},Range,E2:M2881) 会全部读取 优选 对于日期 yyyy-MM-dd HH:mm:ss.000 matlab cel…

在Ubuntu上建立博客网站,利用Cpolar+Inis快速实现专业写作

文章目录 前言1. Inis博客网站搭建1.1. Inis博客网站下载和安装1.2 Inis博客网站测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总…

设计模式-模板方法

文章目录 前言模板方法模式简介Java代码示例模板方法使用场景模板方法使用场景 前言 当我们需要在一个算法的框架中定义算法的骨架,并将一些步骤的具体实现留给子类来完成时,模板方法模式是一种非常有用的设计模式。这篇博客将介绍模板方法模式的概念&a…

将 ChatGPT 用于数据科学项目的指南

推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 我们都知道 ChatGPT 的受欢迎程度以及人们如何使用它来提高生产力。但是,如果您是新手,则值得注册ChatGPT免费演示并尝试它所能做的一切。您还应该参加我们的 ChatGPT 简介课程,学习…

199. 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,null,3] 输出: [1,3]示例 3: 输入: [] 输出: []提示: 二…

Mixin从理论到实践

mixin从理论到实践 mixin从理论到实践一、什么是mixin二、使用mixin三、mixin的合并策略四、mixin辨析五、个人实践 mixin从理论到实践 一、什么是mixin mixin混入 — Vue.js (vuejs.org) 官方解释: 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue …

产品波士顿矩阵

随着公司产品的增多,每个产品的生命周期节点各不相同,很多时候我们往往在产品结构、资源分配方面会产生各种问题,导致需要发展的产品得不到资源,消耗资源的产品却有无法增长,所谓不聚焦导致的问题其实是资源和发展错配…

ESP32蓝牙实例-BLE服务器与客户端通信

BLE服务器与客户端通信 文章目录 BLE服务器与客户端通信1、软件准备2、硬件准备3、代码实现3.1 BLE服务器实现3.2 Android手机测试BLE服务器3.3 ESP32 BLE客户端在本文中,我们将介绍如何使用低功耗蓝牙在两个 ESP32 开发板之间执行 BLE 服务器客户端通信。 换句话说,将介绍如…

Sphinx 找不到 Doxygen 导出的 xml 中的内容的解决方法

Sphinx Breathe Doxygen CMake 的教程看这个就够了 https://devblogs.microsoft.com/cppblog/clear-functional-c-documentation-with-sphinx-breathe-doxygen-cmake/ 但是他还是少写了一些东西,所以还是有一些小坑的 这些坑会导致 Sphinx 找不到 Doxygen 导出…

使用 PHP WorkerMan 构建 WebSocket 全双工群聊通信(二)

在很早很早以前,WebSocket 协议还没有被发明的时候,人们在 Web 端制作类实时数据动态更新时,一般采用轮询、 长连接 (Long Polling) 来实现。大概就是: 轮询:客户端不停发送 HTTP 请求给服务端,服务端返回…

在阿里云 linux 服务器上查看当前服务器的Nginx配置信息

我们可以通过命令 sudo nginx -t查看到nginx.conf的路径 可以通过 sudo nginx -T查看 nginx 详细配置信息,包括加载的配置文件和配置块的内容 其中也会包括配置文件的内容

环境扫描/透射电子显微镜气体样品架的真空压力和微小流量控制解决方案

摘要:针对环境扫描/透射电子显微镜对样品杆中的真空压力气氛环境和流体流量精密控制控制要求,本文提出了更简单高效和准确的国产化解决方案。解决方案的关键是采用动态平衡法控制真空压力,真空压力控制范围为1E-03Pa~0.7MPa;采用压…

git 合并分支某次(commit)提交

需求:将develop分支某次提交合并到master上面,其他修改不同步; //切换到master分支 git checkout master //查看develop分支提交记录,获取对应记录哈希值; git log develop // 按上下按钮可以上下查询对应记录&#xf…

typeScript--[接口interface的继承]

和类一样,接口也可以通过关键字 extents 相互继承。接口继承,分为:单继承和多继承,即继承多个接口。另外,接口也可以继承类,它会继承类的成员,但不包括具体的实现,只会把类的成员作为…

DevOps到底是什么意思?

前言: 当我们谈到 DevOps 时,可能讨论的是:流程和管理,运维和自动化,架构和服务,以及文化和组织等等概念。那么,到底什么是"DevOps"呢? 那么,DevOps是什么呢? 有人说它是一种方法,也有人说它是一种工具,还有人说它是一种思想。更有甚者,说它是一种哲学…