1. 程式人生 > >高通平臺音訊除錯常見問題點歸納

高通平臺音訊除錯常見問題點歸納

以下是關於高通音訊除錯中遇到的一些常見問題點歸納,僅供參考,如有錯誤,請指正!

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 級聲音太小,只要把前面兩個點的座標往上提就可以了。
這裡寫圖片描述

未完待續。。。。