news 2026/2/8 10:30:44

安卓 之 PassthruPatchRecord

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
安卓 之 PassthruPatchRecord

1. 类介绍

PassthruPatchRecord 是 Android AudioFlinger 中一个特殊的 patch。它的核心设计目标是实现一种 “直通” 模式,用于 AUDIO_SOURCE_VOICE_PERFORMANCE 等需要极低延迟的音频场景。

• 继承关系: PassthruPatchRecord -> PatchRecord -> RecordTrack -> TrackBase。

• 特殊之处: 普通的 PatchRecord 在两个音频线程(如 PlaybackThread 和 RecordThread)之间建立一个软件缓冲区进行数据中转。而 PassthruPatchRecord 旨在绕过内部软件混音器,尽可能直接地将来自输入流(如麦克风)的数据传递到输出流(如扬声器/耳机),以最小化延迟。

• 工作原理: 它本质上是一个“傀儡”或“桥梁”。它本身不持有大的音频缓冲区,而是在 RecordThread(生产者)和 PlaybackThread(消费者)之间协调,促使数据直接从 HAL 层读取后,尽快写入到 HAL 层。

2. 数据流转

数据流转涉及两个关键的线程和它们之间的交互:

  1. RecordThread(录制线程 - 生产者):
    这个线程代表音频输入源(如麦克风)。

    它调用 PassthruPatchRecord 的 read 方法,试图获取音频数据。

    关键点: PassthruPatchRecord 的 read 方法并不提供真实的音频数据,而是模拟读取(返回静音数据),并同时通知另一个线程去执行真正的 I/O 操作。

  2. PlaybackThread(播放线程 - 消费者):
    这个线程代表音频输出目标(如扬声器)。

    它调用 PassthruPatchRecord 的 obtainBuffer 方法,请求可用的音频数据进行播放。

    关键点: 正是在 obtainBuffer 方法中,真正的音频 I/

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 4:55:39

力扣解题步骤

核心思路回顾通过哈希表存储「已遍历元素值 → 下标」的映射,遍历数组时计算当前元素的 “补数”(目标值 - 当前值),若补数存在于哈希表中,则直接返回结果;若不存在,将当前元素存入哈希表&#…

作者头像 李华
网站建设 2026/2/5 12:17:04

企业级中小社区疫情信息管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 近年来,全球范围内的突发公共卫生事件频发,尤其是新冠疫情的暴发,凸显了社区疫情防控信息化建设的重要性。传统社区疫情管理多依赖人工登记和纸质档案,存在效率低、数据共享困难、信息更新滞后等问题,难以应对大规…

作者头像 李华
网站建设 2026/2/3 7:10:12

我发现多中心数据术语冲突 后来用SNOMEDCT编码统一才对齐

📝 博客主页:jaxzheng的CSDN主页 目录医疗数据科学:当Excel表格遇见心跳监测仪 一、从“算术课代表”到医疗数据民工 二、AI诊断系统:当神经网络开始学中医把脉 三、可穿戴设备:当智能手表开始管我吃火锅 四、医疗大数…

作者头像 李华
网站建设 2026/2/5 11:55:40

JVM(JAVA虚拟机内存不足)

这是本人第二次遇到这个问题,打开pycharm还没有Start就撒由那拉了,报出来一堆IDE错误,看都看不懂,上次遇到是大模型的指导改了配置文件依然没解决,这次跟着大佬操作,电脑十分丝滑 步骤(win11&am…

作者头像 李华
网站建设 2026/2/7 16:13:49

类变量和全局变量的生命周期分别是多久?

类变量和全局变量的生命周期核心差异在于创建时机、存活范围、销毁条件,本质由它们的 “归属对象”(类 vs 模块)决定,以下是分维度的精准解析:一、先明确核心前提Python 中变量的生命周期依附于其所属的命名空间对象&a…

作者头像 李华