天天看點

轉 高通平台音頻調試常見問題點歸納高通平台音頻調試常見問題點歸納

高通平台音頻調試常見問題點歸納

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 級聲音太小,隻要把前面兩個點的坐标往上提就可以了。 

轉 高通平台音頻調試常見問題點歸納高通平台音頻調試常見問題點歸納