返回
安卓 8.1 系统播放单声道音频时,两边扬声器均发声?原因找到了!
Android
2023-09-13 11:24:56
现象
在 SDM450 设备的 Android 8.1 系统上,播放单声道音频文件时,左右两侧的扬声器都会发出声音。正常情况下,播放左声道音频时,左扬声器应播放声音,播放右声道音频时,右扬声器应播放声音。
问题分析
通过排查,发现问题的原因是产品在设计时为了兼容性,在硬件路径中进行了特殊处理。具体来说,在 hardware\qcom
目录下,存在以下代码:
if (is_8916_platform()) {
if (use_hdmi_audio())
snd_soc_update_bits(codec, AWINC_FORMAT_CONTROL,
AWINC_DATA_FMT_MASK, AWINC_DATA_FMT_I2S);
else if (is_DS2_8916()) {
snd_soc_update_bits(codec, AWINC_FORMAT_CONTROL,
AWINC_DATA_FMT_MASK, AWINC_DATA_FMT_DSP_A);
snd_soc_update_bits(codec, AWINC_RATE_CONTROL,
AWINC_RATE_MASK, 16000 << AWINC_RATE_SHIFT);
snd_soc_update_bits(codec, AWINC_CH_SEL_CONTROL,
AWINC_CH_SEL_MASK, AWINC_CH_SEL_STEREO);
}
}
这段代码的作用是根据平台类型和音频输出方式,配置音频编解码器的格式控制、采样率控制和声道选择控制寄存器。在使用 HDMI 音频输出的情况下,将数据格式配置为 I2S 格式;在使用非 HDMI 音频输出且平台为 DS2 8916 的情况下,将数据格式配置为 DSP A 格式,采样率配置为 16000,声道选择配置为立体声。
由于该代码存在问题,导致在播放单声道音频时,左右声道都被发送到扬声器,从而产生两边扬声器均发声的现象。
解决方案
针对该问题,可以通过修改上述代码来解决。具体修改如下:
if (is_8916_platform()) {
if (use_hdmi_audio())
snd_soc_update_bits(codec, AWINC_FORMAT_CONTROL,
AWINC_DATA_FMT_MASK, AWINC_DATA_FMT_I2S);
else if (is_DS2_8916()) {
snd_soc_update_bits(codec, AWINC_FORMAT_CONTROL,
AWINC_DATA_FMT_MASK, AWINC_DATA_FMT_DSP_A);
snd_soc_update_bits(codec, AWINC_RATE_CONTROL,
AWINC_RATE_MASK, 16000 << AWINC_RATE_SHIFT);
if (is_mono_audio())
snd_soc_update_bits(codec, AWINC_CH_SEL_CONTROL,
AWINC_CH_SEL_MASK, AWINC_CH_SEL_MONO);
else
snd_soc_update_bits(codec, AWINC_CH_SEL_CONTROL,
AWINC_CH_SEL_MASK, AWINC_CH_SEL_STEREO);
}
}
修改后的代码在播放单声道音频时,将声道选择配置为单声道,从而解决了左右扬声器均发声的问题。
总结
本文分析了 SDM450 设备在 Android 8.1 系统下播放单声道音频时两边扬声器均发声的问题,并给出了相应的解决方案。通过修改音频编解码器的声道选择配置,可以解决该问题。