高通平台音频调试常见问题点归纳

以下是关于高通音频调试中遇到的一些常见问题点归纳,仅供参考,如有错误,请指正!

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()函数:
高通平台音频调试常见问题点归纳_第1张图片

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"

更换adsp image:
高通平台音频调试常见问题点归纳_第2张图片

4、读写codec寄存器
高通平台音频调试常见问题点归纳_第3张图片
关于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端:
高通平台音频调试常见问题点归纳_第4张图片

6、音频回环:编解码器回环,DSP音频前端回环,ALSA回环。
高通平台音频调试常见问题点归纳_第5张图片
如下为MSM8996为例:
高通平台音频调试常见问题点归纳_第6张图片
高通平台音频调试常见问题点归纳_第7张图片
高通平台音频调试常见问题点归纳_第8张图片

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框架如下图:
高通平台音频调试常见问题点归纳_第9张图片
语音通话数据流如下图:
高通平台音频调试常见问题点归纳_第10张图片

b、对于Audio:下图很清晰的展现了 Android Audio Playback 的整个流程,分析该流程有助于我们定位在播放音视频过程中,音频断续,音频有杂音的问题,我们通过 dump 出每一个节点的音频数据,就可以将问题定位出来。
Audio Playback数据流:
高通平台音频调试常见问题点归纳_第11张图片

如何dump出SW处理的标准输出(AudioHardware)节点的pcm数据,需要作一下处理:

  • adb root
  • adb remount
  • adb shell
  • cd /data/xxx.pcm –> 进入代码中创建dump文件的位置。
  • touch xxx.dump –> 创建dump文件,文件名和代码中必须保持一致。
  • 添加下述patch到代码中
  • make编译相应的库audio.primary.msmxxxx.so,然后push到手机
  • adb reboot
  • 复现问题
  • adb pull /data/xxx.pcm 本地目录(注:如果selinux导致文件不存在,需要解除selinux,解除命令为:adb shell进入系统,getenforce,setenforce 0即打开了权限)
    利用 Audition/CoolEdit 听 dump 出来的 pcm 文件看是否有杂音/断续,如果已经有杂音/断续,说明在送入 dsp 之前问题就存在,可能需要软件先看一下。

patch如下:
高通平台音频调试常见问题点归纳_第12张图片

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 级声音太小,只要把前面两个点的坐标往上提就可以了。
高通平台音频调试常见问题点归纳_第13张图片

未完待续。。。。

你可能感兴趣的:(音频,Android)