以下是关于高通音频调试中遇到的一些常见问题点归纳,仅供参考,如有错误,请指正!
1、Audio EC-VOIP
软件主要需要设置EC_REF(echo reference 信号),在Audio HAL的platform.c中,确保VOIP所经过的代码通路调用platform_set_echo_reference(adev,true,out_device);
同时,对应的mixer_paths_mtp.xml文件中,新增一path,里面添加使能EC_REF:
<path name="echo-reference">
<ctl name="AUDIO_REF_EC_UL1 MUX" value="I2S_RX">
path>
2、使能、禁用Fluence
a、adb操作:
单mic情况下,设置fluencetype为none:
adb shell setprop ro.vendor.audio.sdk.fluencetype none
双mic情况下,设置如下:
adb shell setprop ro.vendor.audio.sdk.fluencetype fluence
adb shell setprop persist.vendor.audio.fluence.voicecall true
adb shell setprop persist.vendor.audio.fluence.voicerec true
adb shell setprop persist.vendor.audio.fluence.speaker true
注:不同的平台对应的属性名不一致,这些属性在代码中通过property_get函数调用,具体调用根据实际情况查看。
如msm8916平台:
源文件:hardware/qcom/audio/hal/msm8916/platform.c
调用函数:platform_init()函数:
b、上述只是代码中调用fluence算法相关的属性值来确定是否需要调用该算法,那么这些属性值的代码修改点如下:
源文件:device/qcom/msmxxxx/system.prop
ro.vendor.audio.sdk.fluencetype=fluence -->三种类型:none、fluence、fluencepro
persist.vendor.audio.fluence.voicecall=true -->true or false
persist.vendor.audio.fluence.voicerec=true -->true or false
persist.vendor.audio.fluence.speaker=true -->true or false
3、查看DSP版本:
对于有ADSP的平台:
adb shell
adb pull firmware/image/adsp.b04 (高通文档中pull该文档出来不知有何用,先留着吧)
strings adsp.bo4 | grep "Q6_BUILD"
比如msm8937平台:
对于没有ADSP但有MDSP的平台:
adb shell
adb pull firmware/image/modem.b20
strings modem.b20 | grep "MPSS.DPM"
4、读写codec寄存器
关于QACT ADIE用法:
a. 在 QACT 主画面上,单击 ADIE RTC。
b. 单 击 Refresh , 用 以 访 问 目 标 设 备 中 所 有 ADIE 寄 存 器 的 内 容 , 并 显 示 在ADIECalibratorTable 中。
c. 单击比特位 0到比特位 7的各复选框,以配置寄存器的值。对于设为 1的比特位,其对应的复选框应出现选中标记。
d. 单击 Commit, 用以将 ADIECalibratorTable 中所输入的值送回到目标设备。
5、Codec寄存器中的增益设置(Android KK(安卓4.4)及以后版本)
在 Android KK 及以后版本,codec 中的增益设置保存在 mixer_paths.xml 中。音频调试的时候,用户也可以通过 tinymix 命令来实时调试 codec 中的增益,得到合适的值后, 写入相对应的mixer_paths.xml。
数字增益:
"RXn Digital Volume"
"DECn Volume"
"IIRn INPx Volume"
以上增益按最小 0 阶到最大 124 阶设置, 步长 1 dB。 最小 0 阶代表-84 dB,第 84阶为 0 dB, 最大 124 阶为+40 dB。
模拟增益:
"ADCn Volume"
"LINEOUTn Volume"
"HPHL Volume"
"HPHR Volume"
"EAR PA Gain"
"SPK DRV Volume"
以上增益步长均为1dB。
tinymix命令格式: tinymix “name” value (如:tinymix “ADC1 Volume” 6)
加一点说明,DECn Volume 的增益位置在Tx端:
6、音频回环:编解码器回环,DSP音频前端回环,ALSA回环。
如下为MSM8996为例:
7、音频问题定位:
软件问题和调试问题的定位:
a、对于Voice:voice的基本架构和数据流图如下所示,不同平台间略有差异,不尽相同,此处只给出例子。
Voice的处理大致如下:
TX方向:能量转换(mic)–> A/D转换(Codec)–> 音频前处理(DSP)–>混音器 –> 协议栈 –> RF
RX方向:RF –> 协议栈 –> 音频分离(Audio/Voice)–> 音频后处理 (DSP)–> D/A转换(Codec)–> 能量转换(Speaker/Headset)
Voice 问题的定位,应结合 Voice 的架构跟踪其数据流走向,逐步定位问题发生的位置。
Voice框架如下图:
语音通话数据流如下图:
b、对于Audio:下图很清晰的展现了 Android Audio Playback 的整个流程,分析该流程有助于我们定位在播放音视频过程中,音频断续,音频有杂音的问题,我们通过 dump 出每一个节点的音频数据,就可以将问题定位出来。
Audio Playback数据流:
如何dump出SW处理的标准输出(AudioHardware)节点的pcm数据,需要作一下处理:
8、FM音量调试
可以修改 DSP 里的 CodecRxGain 来改变 FM 的音量,但因为 Audio RecordPath 也用到CodecRxGain,因此修改 CodecRxGain 的会同时改变录音的音量。
代码上修改:
a、kernel/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.h
宏定义:
- #define INT_RX_VOL_MAX_STEPS 0x2000
+ #define INT_RX_VOL_MAX_STEPS 0x4000
- #define INT_RX_VOL_GAIN 0x2000
+ #define INT_RX_VOL_GAIN 0x4000
b、hardware/qcom/audio/hal/audio_extn/fm.c
static int32_t fm_set_volume(struct audio_device *adev, float value, bool persist)
{
...
- vol = lrint((value * 0x2000) + 0.5);
+ vol = lrint((value * 0x4000) + 0.5);
if (persist)
fmmod.fm_volume = value;
if (!fmmod.is_fm_running) {
ALOGV("%s: FM not active, ignoring set_fm_volume call",
__func__);
return -EIO;
}
…
}
9、音乐播放的音量调节
修改音频曲线来设置通话、 系统音、铃声、音乐播放、 闹铃、 提示音、 蓝牙 SCO、按键音、 TTS 音量。
下面以音乐播放为例, 按以下方式修改可提高最低七级音量。
代码修改点:hardware/libhardware_legacy/audio/AudioPolicyManagerBase.cpp
const AudioPolicyManagerBase::VolumeCurvePoint
AudioPolicyManagerBase::sDefaultMediaVolumeCurve
[AudioPolicyManagerBase::VOLCNT] = {
- {1, -58.0f}, {20, -40.0f}, {60, -17.0f}, {100, 0.0f}
//To increase the lowest volume step
+ {1, -29.7f}, {20, -20.1f}, {60, -17.0f}, {100, 0.0f}
};
NOTE:说明:如下图,播放音乐时有 15 个等级,换算成 100 等分就是 100*index/15,最小到最大对应为 6,13,20,26,33,40,46,53,60,66,73,80,86,93,100,可以根据这个 index 在图里找到对应的分贝值,所以如果低 7 级声音太小,只要把前面两个点的坐标往上提就可以了。
未完待续。。。。