板子上带有一个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。

 

 

更多相关文章

  1. Evenbus思想解决切换网络高级处理(初级篇)
  2. android遥控器新增自定义的键值+用遥控器按键实现软键盘字符键的
  3. 一种简单快速的方式实现 Android(安卓)App 的夜间模式
  4. 从HTML5统治世界的说法来看Native APP 和 WEB APP 的差别
  5. android 上网 (一)-- apn切换拨号
  6. android/ophone 横竖屏切换问题的解决方案
  7. Android中style和theme巧用:Android应用程序启动时背景画面的切
  8. Android底部Tab页基于ViewPager的实现
  9. Android(安卓)快速实现 ViewPager 滑动页卡切换(可用作整个 app上

随机推荐

  1. 环境搭建-Visual Studio Code及常用插件
  2. 初识html标签
  3. 我的第一课作业2
  4. VSCode安装及常用emmet语法
  5. HTML常见标签以及使用
  6. htm入门标签—a标签、img标签、ul标签、t
  7. HTML 常用标签学习一
  8. HTML综合练习——网站后台管理系统 框架
  9. 初识HTML元素——表格
  10. 初识HTML元素——列表