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 软件层面的"水管"被完全排空。

相关推荐
沐禾安信3 天前
抖音的bgm 想保存? 3个音频提取工具,一键分离
音视频·音频·音频转换·视频转换
A13345557 天前
Apple TV 软件推荐:全平台怎么选
android·音频
林澈在路上11 天前
AI翻唱软件哪个好 2026国产AI写歌工具对比推荐
大数据·人工智能·深度学习·github·aigc·音视频·音频
提升汽车音响好物13 天前
宝马音响升级怎么做?东莞虎门杰之声 采用FOCAL 劲浪专车专用进行汽车音响升级
汽车·音频
liuyunshengsir15 天前
基于海光DCU的AI音乐翻唱全流程落地实战
人工智能·大模型·音频·dcu
林澈在路上16 天前
AI做歌用哪个最好 2026国产AI音乐工具评测
大数据·人工智能·aigc·音视频·音频
东莞市奥普新音频技术有限公司17 天前
国产音频分析仪怎么选?从性能参数、测试软件到自动化能力
人工智能·科技·测试工具·自动化·音视频·音频
k4m7v2pz18 天前
ESP32-S3 + I2S 麦克风实时音频流静音问题排查:从网络到AGC的谬误溯源
rust·音频·esp32·agc·实时监听·静音排查
~央千澈~1 个月前
从“拟声”到“生成”:AI音效背后的技术原理·优雅草AI音乐·AI音乐技术研究
大数据·人工智能·ai·音频
我是海飞1 个月前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理