android audiorecord插上耳機錄音由dmic切換到耳機錄音

       板子上帶有一個dmic,和一個adc,不插耳機時audiorecord默認將打開dmic錄音,插上耳機時自動切換到耳機錄音。

       這個場景是手機上太常見了,由於是tv和盒子的芯片,默認沒有對這種場景的支持,按照android的音頻架構不知道是否手機方案的實現對耳機和dmic(或其他方式板載麥克風)這兩種設備都有完整的hal切換,這樣切換流程就類似於從usb耳機切到藍牙耳機了。

     我在這裏的實現就只是在primary的hal層做了一次切換,比較簡單,上層完全不知道。當然耳機插拔的事件還是由底層通知到android上層再由上層通知到hal層,否則就需要在hal層添加一個檢測線程了。

    耳機插拔在machine層檢測到之後通過snd_soc_jack_report通知給android,使用InputEvent的方式來進行耳機檢測需配置下config_useDevInputEventForAudioJack 設置。配置之後在hal層能收到上層通知到的耳機插拔事件,在adev_set_parameters

中解析出來:

@@ -4065,6 +4081,24 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
 
     ALOGI("%s(kv: %s)", __FUNCTION__, kvpairs);
     parms = str_parms_create_str(kvpairs);
+	ret = str_parms_get_int(parms, "connect", &val);
+    if (ret >= 0) {
+        if (val == 8) {
+            ALOGI("headset connect");
+            adev->is_headset_connected = true;
+        } else {
+        }
+        goto exit;
+    }
+	ret = str_parms_get_int(parms, "disconnect", &val);
+    if (ret >= 0) {
+        if (val == 8) {
+            ALOGI("headset disconnect");
+            adev->is_headset_connected = false;
+        } else {
+        }
+        goto exit;
+    }
     ret = str_parms_get_str(parms, "screen_state", value, sizeof(value));
     if (ret >= 0) {
         if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) {

在start_input_stream中判斷耳機狀態並打開對應的聲卡設備,這裏是每次錄音啓動開始的地方,同時在錄音過程中如果有切換設備的動作,需要在in_read接口中做一次reset動作:

@@ -3356,7 +3359,20 @@ static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
         }
         in->standby = 0;
     }
-
+	
+    if (!in->standby) {       
+        if (adev->is_headset_connected != adev->last_headset_state){
+            adev->last_headset_state = adev->is_headset_connected ;		
+            pcm_stop(in->pcm);
+            pcm_close(in->pcm);
+            ret = start_input_stream(in);
+            if (ret < 0) {
+                bytes = 0;
+                goto exit;
+            }
+            ALOGI("pcm reset");		
+        }		
+    }

以上,切換完成,測試ok。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章