編輯:關於Android編程
Android底層開發之音頻輸入通道的軟硬件分析
我們都知道耳機Mic集成在一直的那種四段耳機Mic插頭是Android設備上比較常用。但是也會有分開的情況,比較如果在普通的PC機中裝Android系統,那麼就是這種情況。所以就有必要對音頻輸入通道的軟件硬件進行統一的分析一下,接下來分析一個實例。
該設備的硬件連接為:基於3157的模擬開關實現的 通道切換。
設備是完全靠硬件實現的,那麼就沒有軟件的什麼工作了。但是這並不是一個理想的實現方法,真下的實現方法應該是所有的Mic都是並行的,每個Mic通道都有一個使能管腳。讓系統來控制讓哪個Mi╧y"/kf/yidong/wp/" target="_blank" class="keylink">WPX986qyuTI66GjxuTKtXJrNjE2IGF1ZGlvtPrC69bQysfT0MfQu7u1xLT6wuu1xKO6PC9wPgo8cD5zdGF0aWMgaW50IHJrNjE2X2NhcHR1cmVfcGF0aF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsPC9wPgo8cD4gICAgICAgICAgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpPC9wPgo8cD57PC9wPgo8cD4gICAgICAgIHN0cnVjdCByazYxNl9jb2RlY19wcml2ICpyazYxNiA9IHJrNjE2X3ByaXY7PC9wPgo8cD4gICAgICAgIGxvbmcgaW50IHByZV9wYXRoOzwvcD4KPHA+IDwvcD4KPHA+ICAgICAgICBpZiAoIXJrNjE2KSB7PC9wPgo8cD4gICAgICAgICAgICAgICAgcHJpbnRrKA=="%s : rk616_priv is NULL\n", __func__);
return -EINVAL;
}
if (rk616->capture_path == ucontrol->value.integer.value[0]){
DBG("%s : capture_path is not changed!\n", __func__);
return 0;
}
pre_path = rk616->capture_path;
rk616->capture_path = ucontrol->value.integer.value[0];
DBG("%s : set capture_path %ld, pre_path %ld\n", __func__,
rk616->capture_path, pre_path);
switch (rk616->capture_path) {
case MIC_OFF:
if (pre_path != MIC_OFF)
rk616_codec_power_down(RK616_CODEC_CAPTURE);
break;
case Main_Mic:
if (pre_path == MIC_OFF)
rk616_codec_power_up(RK616_CODEC_CAPTURE);
#ifdef RK616_HPMIC_FROM_LINEIN
snd_soc_write(codec, 0x848, 0x06); //MIXINL power up and unmute, MININL from MICMUX, MICMUX from BST_L
#endif
rk616_set_gpio(RK616_CODEC_SET_MIC, GPIO_HIGH);
break;
case Hands_Free_Mic:
if (pre_path == MIC_OFF)
rk616_codec_power_up(RK616_CODEC_CAPTURE);
#ifdef RK616_HPMIC_FROM_LINEIN
snd_soc_write(codec, 0x848, 0x03); //MIXINL power up and unmute, MININL from MICMUX, MICMUX from IN3L
#endif
rk616_set_gpio(RK616_CODEC_SET_MIC, GPIO_LOW);
break;
case BT_Sco_Mic:
break;
default:
return -EINVAL;
}
return 0;
}
硬件實現時會有這樣的問題,在使用BT SCO做為輸入時,Main Mic或者Hands Mic也會輸入。
如果需要可以這樣實現:
@@ -796,6 +796,7 @@ static struct rk616_platform_data rk616_pdata = {
.hdmi_irq = RK30_PIN2_PD6,
.spk_ctl_gpio = RK30_PIN2_PD7,
.hp_ctl_gpio = INVALID_GPIO,
+ .mic_sel_gpio = RK30_PIN0_PD5,
};
#endif
切換Capture MIC Path後RK30_PIN0_PD5的電平會隨之改變。
我認為Mic輸入的理想處理方法是:
文字說明:所有Mic通道都是並行的,且保留一個使能管腳,CPU可以自由控制各個通道的通斷。
任何在硬件上進行通道調節都是畫蛇添足。
Android針對單獨的Mic 3.5mm jack目前還沒有准確的處理方式,因為在WiredAccessoryManager.java所示的支持的方式中還沒有針對單獨的Mic 3.5mm jack。也就是說內核檢測到什麼單獨的Mic插入也不知道如何告知Android系統,也或者是告知也無用。
耳機+Mic BIT_HEADSET = (1 << 0);
耳機-Mic BIT_HEADSET_NO_MIC = (1 << 1);
其它 BIT_USB_HEADSET_ANLG = (1 << 2);
其它 BIT_USB_HEADSET_DGTL = (1 << 3);
其它 BIT_HDMI_AUDIO = (1 << 4);
使用分體式耳機表示是這樣的:
只插入Mic,不插入耳機。
我所說的 支持不完善 是指就算你內核確定硬件上插入的僅僅是一個獨立的Mic,那麼也不知道在/sys/class/switch/h2w/state中填寫一個什麼樣的數字來表示這種狀態。
ProgressDialog的基本用法ProgressDialog為進度對話框。android手機自帶的對話框顯得比較單一,我們可以通過ProgressDialog來自己
什麼是RecyclerViewRecyclerView是Android 5.0 materials design中的組件之一,相應的還有CardView、Palette等
概述在設計應用的時候,我們應該熱愛極簡主義,簡單就是好的,對於很多用戶來說,復雜的東西並不受歡迎。我要實現的是根據不同的情況去顯示不同的加載效果,隨用隨調,效果是借鑒於某
為什麼我說它是最實用的 ViewPager 指示器控件呢? 它有以下幾個特點: 1、通過自定義 View 來實現,代碼簡單易懂; 2、使用起來非常方便; 3、通用性高,大