1. 类介绍
PassthruPatchRecord 是 Android AudioFlinger 中一个特殊的 patch。它的核心设计目标是实现一种 “直通” 模式,用于 AUDIO_SOURCE_VOICE_PERFORMANCE 等需要极低延迟的音频场景。
• 继承关系: PassthruPatchRecord -> PatchRecord -> RecordTrack -> TrackBase。
• 特殊之处: 普通的 PatchRecord 在两个音频线程(如 PlaybackThread 和 RecordThread)之间建立一个软件缓冲区进行数据中转。而 PassthruPatchRecord 旨在绕过内部软件混音器,尽可能直接地将来自输入流(如麦克风)的数据传递到输出流(如扬声器/耳机),以最小化延迟。
• 工作原理: 它本质上是一个“傀儡”或“桥梁”。它本身不持有大的音频缓冲区,而是在 RecordThread(生产者)和 PlaybackThread(消费者)之间协调,促使数据直接从 HAL 层读取后,尽快写入到 HAL 层。
2. 数据流转
数据流转涉及两个关键的线程和它们之间的交互:
RecordThread(录制线程 - 生产者):
这个线程代表音频输入源(如麦克风)。它调用 PassthruPatchRecord 的 read 方法,试图获取音频数据。
关键点: PassthruPatchRecord 的 read 方法并不提供真实的音频数据,而是模拟读取(返回静音数据),并同时通知另一个线程去执行真正的 I/O 操作。
PlaybackThread(播放线程 - 消费者):
这个线程代表音频输出目标(如扬声器)。它调用 PassthruPatchRecord 的 obtainBuffer 方法,请求可用的音频数据进行播放。
关键点: 正是在 obtainBuffer 方法中,真正的音频 I/