Android底層音頻聲道耳機插頭和開關殼體的發展

來源:互聯網
上載者:User

標籤:

Android潛在的發展耳機插頭串連到音頻頻道切換的例子


       因為使用的是耳機 麥克分離式的耳機,所以要分別上報事件。在Android系統層耳機插孔的檢測是基於/sys/class/switch/h2w/state的值來推斷的(以4.4.4_r2為範例位於WiredAccessoryManager.java)。

 

       僅僅要在核心中實現一個「或真或假」的基於switch類的h2w開關。Android系統就能夠監聽到插拔資訊。

       在播放音樂的時候插入耳機,使用tinymix(參考:Android音頻底層調試-基於tinyalsa)命令能夠尋找到Playback Path的值從SPK變為HP_NO_MIC,就能夠說明耳機插拔軟體檢測正常了。

# tinymix                                                        

Mixer name: ‘RK_RK616_TINY‘

Number of controls: 7

ctl type num name                                     value

0 ENUM 1 Playback Path                            HP_NO_MIC

1 ENUM 1 Capture MIC Path                         MIC OFF

2 ENUM 1 Voice Call Path                          OFF

3 ENUM 1 Voip Path                                 OFF

4 INT 2 Speaker Playback Volume                  24 24

5 INT 2 Headphone Playback Volume                24 24

6 ENUM 1 Modem Input Enable                       ON


       可是喇叭還在響,說明沒有被關閉。查查原理圖「功放上的控制腳」是在哪個GPIO上接著呢。

 

       依據手冊得出僅僅要GPIO2_D7能夠輸出低電平就能實現喇叭的關閉,使用萬用表測得在插入耳機後該管腳仍然為高電平。查看代碼改動記錄在上一個版本號碼同事是直接在rk_headset.c耳機插拔程式中改動將其拉低的,這樣能夠實現可是認為不妥。Android上層應該也是有音頻通道切換的。依據上層來控制比較好。

這樣插入耳機的時候也能夠強制開啟喇叭。把「使用哪個音頻通訊的決定權」交給給使用者。

 

       這個應該是在核心中實現的,由於Alsa已經正常切換了,就說明上層已經調用對應的介面了。從驅動中來分析。

 

裝置資源:能夠看到Speak和handphone的使能GPIO都給的是RK30_PIN2_PD7。

static struct rk616_platform_data rk616_pdata = {

        .power_init = rk616_power_on_init,

        .power_deinit = rk616_power_deinit,

        .scl_rate   = RK616_SCL_RATE,

        .lcd0_func = INPUT,             //port lcd0 as input

        .lcd1_func = INPUT,             //port lcd1 as input

        .lvds_ch_nr = 1,                //the number of used lvds channel  

        .hdmi_irq = RK30_PIN2_PD6,

        .spk_ctl_gpio = RK30_PIN2_PD7,

        .hp_ctl_gpio = RK30_PIN2_PD7,

};

 

裝置驅動中控制音訊輸出通道的函數:

static int rk616_playback_path_put(struct snd_kcontrol *kcontrol,

                struct snd_ctl_elem_value *ucontrol)

{

        ......

        case HP_PATH:

        case HP_NO_MIC:

        case RING_HP:

        case RING_HP_NO_MIC:

                rk616_set_gpio(RK616_CODEC_SET_SPK, GPIO_LOW);

                

                if (pre_path == OFF)

                        rk616_codec_power_up(RK616_CODEC_PLAYBACK);

 

                snd_soc_update_bits(codec, RK616_SPKL_CTL,

                        RK616_VOL_MASK, HPOUT_VOLUME); //, volume (bit 0-4)

                snd_soc_update_bits(codec, RK616_SPKR_CTL,

                        RK616_VOL_MASK, HPOUT_VOLUME);

 

                rk616_set_gpio(RK616_CODEC_SET_HP, GPIO_HIGH);

                break;

        ......

}

 

       可見在輸出到耳機通道時,禁用 SPEAKER和使能HP都是設定的GPIO_HIGH,最後RK30_PIN2_PD7仍然為高電平,沒有禁用SPEAKER。原理圖並沒有單獨的耳機的使能管腳。在資源中將hp_ctl_gpio設定為INVALID_GPIO。問題得以解決。

 

額外收穫:原理耳機那裡一直都是有音訊輸出的,不管插入不插入耳機;插入耳機時不過將SPEAKER禁止了。

誤入的歧途:

1.誤以為要去看Android上層代碼在各種類中追尋了非常久。真是浪費時間,假設使用tinymix查看音頻通道切換正常,說明核心以上的都沒有問題了,出問題也是出在了核心以及硬體上。

 

總結:龐大的Android系統容不得你每一塊都瞭解的非常仔細,可是假設會非常好的劃分層次。問題就會非常好解決。記錄的重點不在於詳細的型號版本號碼等等比較虛擬方面,但是,在這樣的問題善於分析的頭腦面對。

著作權聲明:本文部落格原創文章。部落格,未經同意,不得轉載。

Android底層音頻聲道耳機插頭和開關殼體的發展

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.