高通平臺音訊除錯常見問題點歸納
以下是關於高通音訊除錯中遇到的一些常見問題點歸納,僅供參考,如有錯誤,請指正!
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 級聲音太小,只要把前面兩個點的座標往上提就可以了。
未完待續。。。。