背景

  • Platform: RK3399
  • OS: Android7.1.2
  • Kernel: v4.4.103

问题

现象:相同的音频文件,最大的音量等级,网络广播音频codec输出的幅度始终比本地播放的小,达不到音频codec理论上的满幅输出(RMS:500mV)。
大致数据结果:android音量等级调到最大,网络广播(RMS:250mV), 本地播放(RMS:500mV)。

分析

我们APK通过网络接收广播数据,然后用AudioTrack播放,本地播放也是使用相同的接口。x
根据Android的音量控制x框架(具体可参考我以前的文章),

总输出音量 = Android系统软件音量 * 音频Codec硬件音量**
**音频Codec硬件音量 = 音频Codec-DAC音量(数字音量) * 音频Codec-通道音量(AP模拟音量)

Android系统音量(数字音量) = stream Volume * master Volume * track Volume

音频codec的硬件音量都是一样的,所以调整track Volumemaster Volume音效。

  1. 使用audioTrack.setStereoVolume(1.0f, 1.0f)audioTrack.setVolume(1.0f)设置track的音量为最大,
  2. 关闭混响等音效

结果还是一样。
后来发现本地播放AudioTrack使用的是AudioManager.STREAM_MUSIC流类型,而网络广播因为其他需求,使用的是AudioManager.STREAM_SYSTEM
然后反查音量调节曲线,发现音量最高的时候,刚好STREAM_MUSIC为0dB,刚好STREAM_SYSTEM为-6dB。

解决

修改音量调节曲线,具体在frameworks/av/services/audiopolicy/common/managerdefinitions/src/Gains.cpp文件