修改開機聲音從耳機通道輸出

文檔說明

本文檔以SC826(MSM8953平臺,Android 7)為例,說明如何修改開機聲音從耳機通道輸出。

不想看分析過程的,直接看 patch文件 章節。

應用背景

默認代碼,在不插入耳機時,聲音從SPEAKER輸出。 插入耳機,聲音則從耳機通道輸出。

客戶在硬件設計時,用耳機通道+功放作為聲音輸出的唯一通道。

發現一個問題,在Android開機動畫時應該播放的開機聲音,無法從耳機通道輸出,還是從SPEAKER通道輸出。但系統開機完成之後,聲音就能從耳機通道輸出了。

音頻文件

開機聲音對應的音頻文件所在位置:

系統:

/system/media/boot.wav

源代碼:

vendor/qcom/proprietary/qrdplus/Extension/apps/BootAnimation/boot.wav

耳機中斷

最初懷疑開機階段沒有檢測到耳機,下面是耳機中斷處理函數:

kernel/sound/soc/codecs/wcd-mbhc-v2.c -> wcd_mbhc_swch_irq_handler()

增加調試打印

修改開機聲音從耳機通道輸出

經測試,開機階段能夠觸發耳機中斷,但是聲音仍然從SPEAKER輸出。

耳機事件驅動

上層UI或應用層,是通過事件(event)與底層驅動溝通。

可以通過發送事件模擬耳機插入拔出,可以看到界面上耳機圖標的變化:

耳機插入:

adb shell

sendevent /dev/input/event5 5 2 1

sendevent /dev/input/event5 0 0 0

耳機拔出

sendevent /dev/input/event5 5 2 0

sendevent /dev/input/event5 0 0 0

也可以事件監控實際的耳機插入拔出動作,見下圖:

修改開機聲音從耳機通道輸出

在播放開機聲音之前,耳機插入的事件已經產生,但是仍然從SPEAKER播放。說明上層UI並沒有處理該事件。


xml文件

從音頻配置的xml文件入手, SC826對應的是:

源碼路徑:

hardware/qcom/audio/configs/msm8953/mixer_paths_mtp.xml

系統路徑:

/system/etc/mixer_paths_mtp.xml

SPEAKER通道輸出對應:

修改開機聲音從耳機通道輸出

耳機通道輸出對應:

修改開機聲音從耳機通道輸出

這裡所使用的耳機是headphones(也就是不帶MIC的耳機),和headset有區別。

嘗試把SPEAKER通道強制配成耳機通道:

修改開機聲音從耳機通道輸出

更新xml文件:

adb root

adb remount

adb push d:\\mixer_paths_mtp.xml /system/etc/

重啟系統,很不幸,開機聲音仍然從SPEAKER通道輸出。

Audio-routing

上面嘗試了各種方法,開機聲音仍然不為所動,堅持不懈的從SPEAKER通道輸出。

音頻驅動的HAL相關代碼路徑如下:

hardware/qcom/audio/hal/audio_hw.c

在該文件中增加調試信息,可以確定,播放開機聲音時並沒有走到這裡。 說明HAL層沒有初始化。

回過頭來,再看看播放開機聲音的源碼是如何實現的。

播放開機聲音的源碼路徑如下:

frameworks/base/cmds/bootanimation/audioplay.c

調用底層驅動播放音頻文件的函數如下:

修改開機聲音從耳機通道輸出

這裡選擇了一個pcm device進行音頻播放。 這部分代碼是照抄tinyplay的實現,相當於tinyplay命令。tinyplay屬於alsa驅動的一部分,相關路徑如下:

external/tinyalsa/tinyplay.c

audioplay.c只是選擇了pcm device,但是並沒有配置audio-routing,所以開機聲音還是按照默認的routing通道輸出。

正常系統起來之後,可以通過以下命令切換routing到耳機通道,並播放開機聲音:

<code>adb shell
tinymix 'PRI_MI2S_RX Audio Mixer MultiMedia1' '1'
tinymix 'MI2S_RX Channels' 'Two'
tinymix 'RX1 MIX1 INP1' 'RX1'
tinymix 'RX2 MIX1 INP1' 'RX2'
tinymix 'RX HPH Mode' 'HD2'
tinymix 'COMP0 RX1' '1'
tinymix 'COMP0 RX2' '1'
tinymix 'RDAC2 MUX' 'RX2'
tinymix 'HPHL' 'Switch'
tinymix 'HPHR' 'Switch'


tinyplay /system/media/boot.wav/<code>

我們只要在audioplay.c裡面增加 tinymix的這部分實現即可。

參考 external/tinyalsa/tinymix.c, 增加 fibo_config_path函數,切換audio-routing為耳機通道。

修改開機聲音從耳機通道輸出

測試方法:

  1. 先source / lunch
  2. 在 frameworks/base/cmds/bootanimation/ 路徑下執行: mm
  3. 把編譯生成的 out\\target\\product\\msm8953_64\\system\\bin\\bootanimation 拷出來。
  4. adb push d:\\bootanimation /system/bin
  5. 重啟系統

這樣就能聽到開機聲音從耳機通道輸出了。

patch文件

修改路徑 frameworks/base/cmds/bootanimation/audioplay.c

https://uploader.shimo.im/f/eOPGL2mvxowRc68B.patch?attname=audioplay.patch&download

參考文檔

附一遍CSDN大神文章鏈接,對理解高通音頻架構很有幫助:

https://blog.csdn.net/LoongEmbedded/article/details/80404839


分享到:


相關文章: