高通平台音頻調試常見問題點歸納
2018年09月07日 22:43:46 hb9312z 閱讀數 3372更多
個人分類: 音頻Android
以下是關于高通音頻調試中遇到的一些常見問題點歸納,僅供參考,如有錯誤,請指正!
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"
更換adsp image:
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資料,需要作一下處理:
- 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如下:
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 級聲音太小,隻要把前面兩個點的坐标往上提就可以了。