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。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值