当前位置: 首页 > 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.lryc.cn/news/610627.html

相关文章:

  • PCBA电子产品复制全攻略:从入门到精通
  • 【音视频】WebRTC 一对一通话-信令服
  • 强化学习_Paper_1991_Reinforcement learning is direct adaptive optimal control
  • 自然语言处理×第三卷:文本数据分析——她不再只是贴着你听,而开始学会分析你语言的结构
  • python+MySQL组合实现生成销售财务报告
  • 游戏画面总是卡顿怎么办 告别延迟畅玩游戏
  • 电脑搜索不到公司无线网络
  • 基于ARM+FPGA多通道超声信号采集与传输系统设计
  • NuGet03-私有仓库搭建
  • mac前端环境安装
  • 【ARM】CMSIS6 介绍
  • Mac上pnpm的安装与使用
  • AIDL学习
  • 《算法导论》第 2 章 - 算法基础
  • 朴素贝叶斯(Naive Bayes)算法详解
  • pipeline方法关系抽取--课堂笔记
  • 神坛上的transformer
  • VUE2 学习笔记18 路由守卫
  • 无人机 × 巡检 × AI识别:一套可复制的超低延迟低空视频感知系统搭建实践
  • 人月神话:软件工程的永恒智慧
  • Android 之 Kotlin中的协程(Dispatchers.IO)
  • 研发团队看板协作中的自动化实践:集成CI/CD与任务流转
  • Goby 漏洞安全通告| NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • Linux内核参数调优:为K8s节点优化网络性能
  • 【功能测试】软件功能上线测试经验总结
  • K8S健康检查巡检清单
  • K8s Master状态NotReady
  • 播放器音频后处理实践(一)
  • 【Axure视频教程】动态折线图
  • 从 “看懂图” 到 “读懂视频”:多模态技术如何用文本反哺视觉?