上一篇文章 (Android 智能手机上的音频浅析) 说本篇将详细讲解 Android 智能手机中各种音频场景下的音频数据流向, 现在我们就开始. 智能手机中音频的主要场景有音频播放, 音频录制, 语音通信等. 不同场景下的音频数据流向有很大差异, 即使是同一场景, 在不同的模式下音频数据流向也有所不同.
1, 音频播放
Android 系统 audio 框架中主要有三种播放模式: low latency playback,deep buffer playback 和 compressed offload playback.
a)low latency playback: 用于按键音, 游戏背景音等对时延要求高的声音输出. 音频文件是在 AP 侧解码成 PCM 数据, 然后再经由 Audio DSP 送给 codec 芯片播放出来.
b)deep buffer playback: 用于音乐等对时延要求不高的声音输出. 音频文件是在 AP 侧解码成 PCM 数据, 如果有音效的话会再对 PCM 数据处理(android audio framework 中有 effect 音效模块, 支持的音效有均衡器, 低音增强, 环绕声等), 然后再经由 Audio DSP 送给 codec 芯片播放出来.
c)compressed offload playback: 用于音乐等声音输出, 但是音频解码部分的工作是在 Audio DSP 中完成, AP 侧只负责把音频码流送到 Audo DSP 中, 送出去后 AP 侧会进行休眠, Audo DSP 中会分配一块较大的 buffer 去处理此数据, 在 Audo DSP 中进行解码, 音效的处理等工作, 在 Audo DSP 解码器处理完数据之前, 它会唤醒 AP 侧去送下一包数据. 用这种模式播放音频能有效的降低功耗, 是最为推荐的播放音乐的模式. 但是在目前的主流的音乐播放 APP 中用的基本上都是 deep buffer 的播放模式, 比如 QQ 音乐, 网易云音乐和酷狗音乐等. 看来系统平台厂商和 APP 厂商的做法是有差异的. 至于哪些格式的音乐用这种模式播放, 这需要在 audioPolicy 中去控制, 我做的平台上是 MP3(*.mp3)和 AAC(*.m4a)用 offload 模式播放, 因为这两种格式最主流.
综上 low latency 模式和 deep buffer 模式都是在 AP 侧解码完后送 PCM 数据给 Audio DSP, 故音频数据流向类似, 我将放在一起讲, 而 compressed offload 模式是码流送给 Audio DSP 解码. 播放系统音和游戏音用 low latency 模式, 播放音乐用 deep buffer 或者 compressed offload 模式, 播放录音用 deep buffer 模式. 接下来我们看看 low latency /deep buffer 和 compressed offload 两种模式下的音频数据流向. 在音频播放时音频数据只经过 AP 和 audio DSP.
1)low latency / deep buffer 模式下的音频数据流向
从上图看出, 音频文件先在 AP 上软解码得到 PCM 后经过 AudioTrack/audioFlinger 中的 Mixer thread(有可能要做音效后处理)/audio HAL/tinyALSA 后送给 kernel, 然后用 IPC 将 PCM 送给 Audio DSP 经重采样混音等后播放出来. 由于在 AP 上已做解码和音效后处理, Audio DSP 上就不需要做了.
2)compressed offload 模式下的音频数据流向
从上图看出, 音频码流经过 AP 上的 AudioTrack/audioFlinger 中的 Offload thread(不需要做音效后处理)/audio HAL/tinyALSA 后送给 kernel, 然后用 IPC 将码流送给 Audio DSP 经解码, 后处理, 重采样, 混音等后播放出来.
2, 音频录制
很多人喜欢把参加的重要会议或者演讲的音频录下来, 以便重复听或者他用. 下图就是录音时音频数据的流向. 同音频播放一样, 录音时音频数据也是只经过 AP 和 audio DSP.
从上图看出, codec 芯片采集到的 PCM 数据送给 Audio DSP 经重采样, 前处理后送给 AP 的 kernel, 再经由 tinyALSA/audio HAL /audioFlinger 中的 Record thread/audioRecord 等后做软编码得到录音码流文件并保持起来.
3, 语音通信
语音通信就是打电话啦. 它同音频播放或者录制不一样, 它是双向的, 分上行 (uplink, 把采集到的语音发送给对方) 和下行(downlink, 把收到的语音播放出来), 而音频播放或者录制是单向的. 它音频数据流向也跟音频播放或者录制不一样, 只经过 audio DSP 和 CP, 下图就是打电话时音频数据的流向.
从上图看出, 在上行方向上 codec 芯片采集到的 PCM 数据送给 Audio DSP 经重采样, 前处理 (AEC/ANS/AGC 等), 编码后得到码流, 并将码流送给 CP,CP 处理后经过空口(air interface) 送给对方. 在下行方向上先从空口收对方送过来的语音数据, 并做网络侧处理(jitter buffer 等), 然后送给 Audio DSP,Audio DSP 收到后做解码, 后处理(ANS/AGC 等), 重采样等, 再把 PCM 数据经 DMA/I2S 送给 codec 芯片播放出来.
来源: https://www.cnblogs.com/talkaudiodev/p/8858470.html