安卓audio 架构解析

audio_port_handle_t

• 定义:audio_port_handle_t标识音频设备(如扬声器、耳机)或虚拟端口(如远程 submix)。它在设备连接或策略路由时由AudioPolicyManager分配,例如通过setDeviceConnectionState()动态注册设备。

周期

audio_port_handle_t的生命周期,其周期可分为以下几个阶段:

  1. 生成阶段

    • 动态分配:当物理设备(如耳机、蓝牙设备)连接或虚拟设备(如远程submix)初始化时,AudioPolicyManager通过setDeviceConnectionState()动态分配唯一的audio_port_handle_t,并注册到系统可用设备列表(如mAvailableOutputDevices或mAvailableInputDevices)中。例如,USB声卡插入时会生成独立的标识符。

    • 静态预定义:部分内置设备(如扬声器)的audio_port_handle_t在系统启动时通过解析audio_policy_configuration.xml预生成,无需动态注册。

  2. 绑定与路由阶段

    • 策略路由选择:应用创建AudioTrack或AudioRecord时,AudioPolicyManager根据音频属性(如usage、contentType)从可用设备中选择目标设备,并返回其audio_port_handle_t。例如,媒体播放会选择扬声器,而通话则选择听筒。

    • 动态更新:设备状态变化(如拔出耳机)会触发路由更新,系统销毁原有绑定并重新分配audio_port_handle_t到新设备(如切换到扬声器)。此过程通过SessionRouteMap维护会话与设备的关联。

  3. 复用与共享

    • 多会话共享:同一设备的audio_port_handle_t可被多个音频会话复用。例如,多个AudioTrack输出到蓝牙设备时共享同一标识符,但各自维护独立会话ID。

    • 策略优先级调整:通过setPreferredDeviceForStrategy()等API,应用可指定策略的优先设备,系统动态更新audio_port_handle_t的绑定关系。

  4. 销毁阶段

    • 设备断开时释放:设备断开(如蓝牙关闭)或虚拟设备销毁时,AudioPolicyManager释放对应的audio_port_handle_t并清理路由。例如,USB声卡拔出后其标识符从可用设备列表中移除。

    • 资源回收:若设备长时间未重新连接,系统可能回收其audio_port_handle_t以避免标识符耗尽。

关键特点

• 唯一性与动态性:每个标识符在生命周期内全局唯一,但设备重连可能重新分配不同值。

• 策略依赖性:生命周期受AudioPolicyManager路由规则控制,与硬件状态和用户配置强相关。

AudioPatch

1.核心变量
  1. audio_patch 结构体:
    • num_sources - 源端数量

    • sources[] - 源端配置数组(可以是设备或混音端口)

    • num_sinks - 接收端数量

    • sinks[] - 接收端配置数组(可以是设备或混音端口)

  2. AudioPatch 类成员:
    • mPatch - 存储当前的音频补丁配置

    • mUid - 创建该补丁的用户ID

    • mHandle - 补丁的唯一标识符

    • mAfHandle - AudioFlinger 分配的补丁句柄

  3. 线程相关变量:
    • mAudioPatches - 存储所有音频补丁的集合

    • mPatchSinks - 输出设备描述

    • mPatchSources - 输入设备描述

2.核心函数
  1. 创建补丁:
    • createAudioPatch() - 创建新的音频路由补丁

    • sendCreateAudioPatchConfigEvent() - 发送创建补丁的配置事件

    • installPatch() - 实际安装补丁到系统中

  2. 释放补丁:
    • releaseAudioPatch() - 释放已存在的音频补丁

    • sendReleaseAudioPatchConfigEvent() - 发送释放补丁的配置事件

  3. 管理函数:
    • updateAudioProfiles() - 更新与补丁相关的音频配置

    • checkForNewParameter_l() - 检查补丁参数变化

    • getParameters() - 获取补丁参数

  4. 工具函数:
    • patchSinksToString() - 将补丁接收端转换为字符串

    • patchSourcesToString() - 将补丁源端转换为字符串

3.调用场景
  1. 设备连接/断开时:
    • 当音频设备连接或断开时,系统会创建或释放相应的音频补丁

    • 调用createAudioPatch()或releaseAudioPatch()

  2. 路由策略变化时:
    • 当音频策略要求改变路由时(如通话时切换到耳机)

    • 通过setParameters()触发补丁更新

  3. 动态策略应用时:
    • 应用请求特定路由(如远程submix)时

    • 使用sendCreateAudioPatchConfigEvent()通知音频系统

  4. 效果链管理时:
    • 当音频效果需要特定设备路由时

    • 通过补丁系统确保效果处理在正确的设备上

  5. 多设备输出时:
    • 需要同时输出到多个设备(如蓝牙和有线耳机)

    • 创建多接收端的补丁配置

4.关键流程
  1. 补丁创建流程:

    应用请求 -> AudioPolicyManager -> AudioFlinger -> ThreadBase::createAudioPatch()
    -> installPatch() -> HAL层实现

  2. 补丁释放流程:

    设备断开/策略变化 -> AudioPolicyManager -> AudioFlinger -> releaseAudioPatch()
    -> HAL层清理

  3. 参数更新流程:

    参数变化 -> checkForNewParameter_l() -> 必要时创建/释放补丁

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

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

相关文章

GitHub 上 Star 数量前 8 的开源 MCP 项目

原文链接:https://www.nocobase.com/cn/blog/github-open-source-mcp-projects。 MCP 这个词真正被广泛提起,是在 2025 年年初,尤其是在 AI 工具开发圈。3 月,一场围绕 “MCP 是否能成为未来标准协议” 的争论彻底点燃了讨论热度…

【数据结构与算法】数据结构初阶:排序内容加餐(二)——文件归并排序思路详解(附代码实现)

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为…

Jetson Orin NX/NANO+ubuntu22.04+humble+MAVROS2安装教程

MAVROS2目前不是官方提供的标准,主要区别还是通信机制的不同,以及API接口的区别,在使用的过程中,根据对应的版本安装即可,此处进提供简易的二进制安装方法,源码安装暂不提供,前去使用mavros即可…

Ubuntu 安装 ns-3 教程

Ubuntu 安装 ns-3最全 教程 1. 环境更新 sudo apt update sudo apt install git2. Ns3 最低依赖要求 2.1 安装依赖 安装依赖网址:根据自己安装的版本安装对应依赖。 https://www.nsnam.org/wiki/Installation Ubuntu/Debian/Mint 以下软件包列表在 Ubuntu 22.…

《林景媚与命运解放者》

《林景媚与命运解放者》——当数据库成为命运的主宰,谁将成为人类自由意志的解放者?《林景媚数据库宇宙》系列第十二部第一章:解放者的召唤公元 2098 年,随着“命运终结者”的威胁被解除,PostgreSQL Quantum Engine&am…

linux编译基础知识-头文件标准路径

&#x1f4c2; ​​1. 系统路径结构差异​​ 要查看 GCC 的默认头文件搜索路径&#xff0c;可通过以下方法操作&#xff08;以 Linux 环境为例&#xff09;&#xff1a; ​​1. 查看 C 语言头文件路径​​ gcc -v -E -xc - < /dev/null 2>&1 | grep -A 100 "#in…

离线语音芯片有哪些品牌和型号?

离线语音芯片的品牌有很多&#xff0c;型号也有很多&#xff0c;因为离线语音芯片的市场很大&#xff0c;几乎所有的想要语音控制的产品都可以通过增加一颗离线语音芯片来实现语音控制的能力&#xff0c;今天主要提到的就是离线语音芯片品牌厂家之一的唯创知音。唯创知音发展历…

Linux 软件包管理

Linux 软件包管理 分析 RPM 包 Linux 发行版本以 RHEL 为代表的发行版本&#xff0c;使用rpm包管理系统&#xff1a; RHEL (Red Hat Enterprise Linux&#xff09;Fedora&#xff08;由原来的RedHat桌面版本发展而来&#xff0c;免费版本&#xff09;CentOS&#xff08;RHEL的…

使用 Vue 3.0 Composition API 优化流程设计器界面

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

2025Nacos安装Mac版本 少走弯路版本

https://github.com/alibaba/nacos 一开始看网上文章&#xff0c;随便下了一个最新的3.0.2&#xff0c;然后出现很多错误 密钥等等问题&#xff0c;最后启动了&#xff0c;但是打不开链接&#xff1a;http://localhost:8848/nacos 然后开始找问题日志&#xff0c;/.nofollow/…

sifu mod制作 相关经验

sifu mod制作一遍流程数据传递后拆开是ok的&#xff0c;没必要合并 断片不能使用原材质不然导入ue里没法片段选择 效果拔群 带自动权重就会有跟随骨骼的效果&#xff0c;空顶点组会跟随父级的原点 这个选负的会抵消胶囊的碰撞效果 应用并刷新布料模拟&#xff08;相当于工程图的…

论文精读笔记:Overview

本文档记录了一些经典论文的讲解笔记。 重读经典&#xff1a;《ImageNet Classification with Deep Convolutional Neural Networks》 重读经典&#xff1a;《Generative Adversarial Nets》 重读经典&#xff1a;《Deep Residual Learning for Image Recognition》 重读经典…

Elasticsearch+Logstash+Filebeat+Kibana单机部署

目录 一、配置准备 下载java&#xff0c;需要java环境 二、单机模式 ELK部署 修改域名解析 elasticsearch配置 启动elasticsearch服务 查看是否启用 查看监听端口 logstash服务 创建配置文件 kibana 启动服务kebana 验证 网页访问 ​编辑 生成图表 回到网页 一、配置准…

redis快速部署、集成、调优

redis快速部署、集成、调优 1.部署 1.1 docker部署 参考&#xff1a;https://blog.csdn.net/taotao_guiwang/article/details/135508643 1.2 redis部署 资源见&#xff0c;百度网盘&#xff1a;https://pan.baidu.com/s/1qlabJ7m8BDm77GbDuHmbNQ?pwd41ac 执行redis_insta…

大学生HTML期末大作业——HTML+CSS+JavaScript音乐网站

HTMLCSSJS【音乐网站】网页设计期末课程大作业 web前端开发技术 web课程设计 网页规划与设计&#x1f4a5; 文章目录一、&#x1f3c1; 网站题目二、&#x1f6a9; 网站描述三、&#x1f38c; 网站介绍四、&#x1f3f4; 网站效果五、&#x1f3f3;️ 网站代码六、&#x1f3f3…

ARP协议是什么?ARP欺骗是如何实现的?我们该如何预防ARP欺骗?

ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是一个工作在数据链路层&#xff08;OSI第二层&#xff09;和网络层&#xff08;OSI第三层&#xff09;之间的基础网络协议&#xff0c;它的核心功能是将网络层地址&#xff08;IP地址&#xf…

一个物理引擎仿真器(mujoco这种)的计算流程

物理仿真的核心循环 一个典型的物理仿真引擎&#xff0c;在每一个时间步&#xff08;dt&#xff09;内&#xff0c;大致会执行以下流程&#xff1a; 确定当前状态 (State)&#xff1a;获取所有物体当前的位置 q 和速度 v。计算力 (Forces)&#xff1a;根据当前状态&#xff0c;…

自然语言处理NLP(3)

上文&#xff1a; 自然语言处理NLP&#xff08;1&#xff09; 自然语言处理NLP&#xff08;2&#xff09; Gated RNN & LSTM 简单RNN存在的问题 随着时间的回溯&#xff0c;简单RNN不能避免梯度消失或者梯度爆炸 梯度裁剪 用来解决梯度爆炸问题 code: g&#xff1a;所有参…

内循环全部满足条件后,为true

### 实现方式在 C 中&#xff0c;可以通过在内循环外部定义一个布尔变量&#xff0c;并在内循环的每次迭代中检查特定条件是否满足。如果所有迭代均满足条件&#xff0c;则在内循环结束后将布尔变量设置为 true。以下是一个示例代码&#xff1a;cpp #include <iostream>i…

STM32--DHT11(标准库)驱动开发

一、前言在我们进行嵌入式开发时&#xff0c;驱动开发也是十分重要的一步&#xff0c;在很多时候&#xff0c;我们的都需要自己来编写硬件的底层驱动&#xff0c;实现硬件与芯片的通信&#xff0c;常见的协议有SPI&#xff0c;IIC&#xff0c;以及单总线的一些通信方式&#xf…