当前位置: 首页 > news >正文

Android audio之 AudioDeviceInventory

1. 类介绍

AudioDeviceInventory 是 Android 音频系统中的一个核心类,位于 frameworks/base/services/core/java/com/android/server/audio/ 路径下。它负责 管理所有音频设备的连接状态,包括设备的添加、移除、状态更新以及策略应用。

  • 设备连接状态管理:记录所有已连接的音频设备(如蓝牙耳机、有线耳机、USB设备等)。
  • 设备策略协调:处理设备优先级、路由策略(如 A2DP 和 LE Audio 的切换)。
  • 与 AudioPolicyManager 交互:通过 AudioSystem 接口通知底层音频策略管理器(APM)设备状态变化。
  • 广播设备状态变更:发送系统广播(如 ACTION_AUDIO_BECOMING_NOISY)通知应用设备变化。
2. 核心功能
(1) 设备连接状态管理
  • 设备类型:支持多种设备类型(如 DEVICE_OUT_BLUETOOTH_A2DPDEVICE_OUT_WIRED_HEADSET 等)。
  • 设备信息存储:通过 DeviceInfo 类存储设备的类型、地址、名称、编解码格式等信息。
  • 连接/断开处理
    • 连接:调用 AudioSystem.setDeviceConnectionState() 通知底层设备可用。
    • 断开:移除设备并通知底层,处理延迟断开(如蓝牙设备淡出)。
(2) 音频路由策略
  • 蓝牙设备优先级:协调 A2DP、LE Audio、HFP 等蓝牙配置的切换(如 updateBluetoothPreferredModes_l)。
  • 策略应用:通过 setPreferredDevicesForStrategy() 设置设备优先级(如音乐播放优先使用 A2DP)。
(3) 事件通知
  • 系统广播:发送 ACTION_AUDIO_BECOMING_NOISY(当耳机拔出时通知应用暂停播放)。
  • 内部回调:通过 IAudioRoutesObserver 通知其他服务(如 AudioService)设备路由变化。
3. 与 AudioManager 的关系

AudioDeviceInventoryAudioManager底层支持模块,两者通过 AudioServiceAudioDeviceBroker 交互:

组件角色
AudioManager面向应用的 API 层,提供 requestAudioFocus()setWiredHeadsetOn() 等方法。
AudioService系统服务,协调 AudioManager 和底层模块(如 AudioDeviceInventory)。
AudioDeviceBroker中介层,处理线程安全和跨进程通信(如 Binder 调用)。
AudioDeviceInventory设备状态管理的核心实现,维护设备列表并同步到 AudioPolicyManager
交互流程示例
  1. 应用调用 AudioManager.setWiredHeadsetOn()
    AudioService 通过 AudioDeviceBroker 转发请求
    AudioDeviceInventory 更新设备状态并调用 AudioSystem.setDeviceConnectionState()
    → 底层音频策略生效,触发路由切换。

  2. 蓝牙耳机连接
    → 蓝牙栈通知 AudioService
    AudioDeviceInventory.makeA2dpDeviceAvailable() 更新设备列表
    → 发送广播通知应用焦点变化。

4. 关键代码解析
(1) 设备连接处理
// 处理设备连接/断开
boolean handleDeviceConnection(AudioDeviceAttributes attributes, boolean connect, ...) {int res = mAudioSystem.setDeviceConnectionState(attributes, connect ? DEVICE_STATE_AVAILABLE : DEVICE_STATE_UNAVAILABLE, ...);if (res == AUDIO_STATUS_OK) {mConnectedDevices.add/remove(deviceKey); // 更新设备列表}
}
(2) 蓝牙设备优先级协调
// 更新蓝牙设备模式(如 A2DP 和 LE Audio 的切换)
void updateBluetoothPreferredModes_l(BluetoothDevice device) {if (isA2dpPreferred()) {disableLeAudio(); // 禁用 LE Audio}
}
(3) 发送 ACTION_AUDIO_BECOMING_NOISY 广播
int checkSendBecomingNoisyIntentInt(int device, int state) {if (device == currentMusicDevice && isLastConnectedDevice()) {mDeviceBroker.postBroadcastBecomingNoisy(); // 发送广播}
}
5. 典型应用场景
  1. 耳机拔出
    AudioDeviceInventory 检测到断开 → 发送 ACTION_AUDIO_BECOMING_NOISY → 音乐播放器暂停。

  2. 蓝牙设备切换
    → 用户从 A2DP 切换到 LE Audio → AudioDeviceInventory 更新设备优先级 → 音频路由切换。

  3. USB 设备插入
    → 系统通知 AudioServiceAudioDeviceInventory 添加设备 → 触发 HDMI 音频输出。

http://www.dtcms.com/a/316243.html

相关文章:

  • 第三方验收测试报告:软件项目验收中的核心要素
  • 前端权限设计
  • Pandas query() 方法详解
  • 涨薪技术|Kubernetes(k8s)之Pod生命周期(上)
  • Deveco Studio 3.1.0.501 Windows版下载安装教程 - 华为开发者工具安装步骤详解
  • BenchmarkDotNet 性能基准测试
  • 统计鱼儿分布情况 Java
  • 三种灰狼算法求解无人机三维路径规划【MATLAB实现】
  • 2025国赛数学建模C题详细思路模型代码获取,备战国赛算法解析——层次分析法
  • MATLAB实现菲涅尔法全息成像仿真
  • Groovy学习篇章一之—— GDK 探秘:Groovy如何给Java对象“开外挂”,让String也能“跑命令”!
  • 磁悬浮转子的“静音术”:深度解析无接触抑制旋转幽灵的奥秘
  • 基于MCP的智能客服系统:知识库与工单系统深度集成
  • 英语中日期与时间缩写
  • 针对软件定义车载网络的动态服务导向机制
  • CoRL-2025 | 北大“如影随形”具身导航智能体!TrackVLA:复杂自然环境中的具身视觉跟踪
  • cJSON库应用
  • Vulnhuntr:用于识别远程可利用漏洞的开源工具
  • 文字识别在媒资系统的技术原理及应用剖析
  • 数据安全治理——解读数据安全治理与评估服务业务介绍【附全文阅读】
  • Book Shop(Dynamic Programming)
  • Direct12第六章
  • 【LeetCode 热题 100】347. 前 K 个高频元素——(解法一)排序截取
  • 防火墙的区域划分和流量控制
  • Qwen3技术之模型预训练
  • Redis Stream:高性能消息队列核心原理揭秘
  • 数据结构04 栈和队列
  • tensorRT配合triton部署模型
  • C语言的结构体与联合体
  • LOOP Finance:一场 Web3 共和国中的金融制度实验