Audio 中的 drain 和 flash

drain

当上层应用(如播放器)检测到音频文件已到达末尾(EOF)时,它会向 AudioTrack 发出停止指令。Framework 会调用 HAL 的 out_drain 接口,要求硬件把缓冲区里剩余的字节"消化"完。

drain 的两种模式

DRAIN_ALL (全部排空):等待当前缓冲区中的**所有**音频数据播放完毕后再返回。这是最常用的模式,用于正常的歌曲切换或结束。

DRAIN_EARLY_NOTIFY (提前通知):在数据即将播放完(例如还剩最后一点)时就发出回调,以便上层应用能提前准备下一首歌的数据,实现"无缝切换"。

为什么需要 drain?

如果不实现 drain 直接调用 stop 或 flush,会发生什么?

音频截断:你会听到歌曲最后几百毫秒或 1-2 秒的内容突然消失(因为这些数据还在硬件 Ring Buffer 里没播出来)。

爆音/咔哒声:直接切断模拟信号可能导致硬件输出电平瞬间归零,产生杂音。

flash

flush(冲洗/清空)操作的主要目的是立即停止播放并丢弃缓冲区中所有待播放的数据。这通常发生在用户切换歌曲、点击停止或在视频播放中执行快进/快退(Seek)操作时。

与 drain(排空)不同,flush 是"暴力"的------它不要求把剩下的音频播完,而是要求硬件立刻"清零"。

|------|--------------------|--------------------|
| 特性 | drain | flush |
| 主要目的 | 优雅地播完最后一点声音 | 立即丢弃所有声音,准备新操作 |
| 触发场景 | 歌曲自然播放结束 | 用户切歌、快进、停止 |
| 数据处理 | 等待硬件 Buffer 播放结束 | 硬件 Buffer 里的数据直接扔掉 |
| 耗时 | 较长(取决于 Buffer 大小) | 极短(几乎瞬间完成) |
| 回调 | 完成后发送 onDrainReady | 完成后不需要特殊 Ready 回调 |

为什么 Non-blocking 模式下 flush 很重要?

在非阻塞模式下,write 调用可能会因为 Buffer 满而返回 0。如果不执行 flush 就进行 Seek 操作,那么当 write 恢复时,它会继续写入旧位置之后的残余数据,导致用户在快进后听到一小段快进前的"声音残影"。执行 flush 可以确保硬件和 HAL 软件层面的"水管"被完全排空。

相关推荐
VOOHU-沃虎21 小时前
音频变压器选型指南:阻抗匹配、隔离耐压与低失真设计的工程实践
网络·音频
bug大湿7 天前
麦阵波束算法——MVDR
算法·音频
shandianchengzi8 天前
【记录】联想|联想电脑自带麦克风声音过小解决办法:问客服要驱动链接地址
电脑·音频·联想·麦克风
Silicore_Emma14 天前
芯谷科技—D8002:2.8W 单通道 AB 类差分输入音频功率放大器
音频·智能音箱·消费电子·音频功率放大器·芯谷科技·音频设备·8002d
哦***715 天前
真实评测 | FreeBuds Pro 5独立空间音频
华为·音频·harmonyos
daanpdf20 天前
新人教版七年级下册英语单词表完整版及听力音频
音频
一块小土坷垃20 天前
## Permute 3.14.7 特别版 – 强大的 macOS 多媒体格式转换工具体验
macos·音频·开源软件
Prannt1 个月前
星朗智能语音——声音设计
ai·音频·语音识别
憨波个1 个月前
【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法
人工智能·深度学习·算法·音频·语音识别
憨波个1 个月前
【说话人日志】DOVER:diarization 输出融合算法
人工智能·算法·音频·语音识别·聚类