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

android audiorecord插上耳机录音由dmic切换到耳机录音相关推荐

  1. android实现从耳机和自带麦克风,android插上耳机的时候仍然使用机身的麦克风录音,解决!...

    我愿望正在插上耳机的时间,依然应用机身的麦克风接收中界输进,耳机播放音频取机身麦克风接收中音互没有滋扰. 然则:正在采纳灌音音源MediaRecorder.AudioSource.MIC时,插上耳机以 ...

  2. 麦克风音频服务器未响应,耳机和麦克风都没坏,插上电脑后为什么不能语音聊天?...

    耳机和麦克风都没坏,插上电脑后为什么不能语音聊天?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 耳机和麦克风都没坏,插 ...

  3. android 读取音频音量,Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小...

    [实例简介] Android AudioRecord和MediaRecorder录音并实现了实时获取音量大小 看代码就知道了 [实例截图] [核心代码] MediaRecorer和AudioRecor ...

  4. win10笔记本插上耳机没声音设置

    win10笔记本插上耳机没有声音 文章目录 前言 一.禁用插孔设置 二.检查驱动 三.重置扬声器 前言 一.禁用插孔设置 1 点击电脑左下方的"开始"图标,找到"控制面板 ...

  5. 解决Ubuntu插上耳机没声音

    ** Ubuntu16.04插上耳机没声音解决 ** 在使用ubuntu16.04时,安装了网易云音乐,想学习之余,听听音乐放松心情.然后美滋滋的插上耳机,打开音乐播放,这时候突然发现电脑没有声音,但 ...

  6. WIN10插上耳机拔掉后再插没声音的问题【已解决】

    关于插上耳机拔掉后再插没声音的问题 废话不多说,直接给解决方法: 打开Realtek高清晰音频管理器(一般在菜单栏里,如果还是找不到就直接用Cortana[如下图]搜索,输入"realtek ...

  7. kali 插上耳机没声音

    这几天装kali装的真是心力憔悴,好不容易勉强可以使用了,插上耳机想要放松下,结果没有声音? excusu me? 在经历各种方法之后终于找到了解决方法,亲测可行. 1.先打开终端,输入systemc ...

  8. iPhone没有声音,但插上耳机后声音正常的处理

    高手在民间. 最近我的4S喇叭莫明的没有声音,按键音.解锁音.短信声音全部没有,按音量加减的那个只出现一只铃铛,没有音量的格子,但是有来电的声音.不过插上耳机全恢复正常了.一开始还以为是硬件出问题了, ...

  9. DELL灵越笔记本插上耳机后,只有外放耳机无声音的解决方法。

    耳机型号是索尼1000xm系列,之前一直用的是蓝牙,之后用有线连接到戴尔笔记本之后,只有外DELL灵越笔记本插上耳机后,只有外放,耳机没有声音,用以下操作方法成功解决. 更新和卸载声卡驱动都没有解决之 ...

最新文章

  1. OpenCV 掩膜的应用
  2. LauncherApplication
  3. struts 中的创建Action的三种方法
  4. java里面的 |运算符_Java 中 | ^ 运算符的简单使用
  5. Golang的聊天服务器实践(群聊,广播)(一)
  6. HTML+CSS——网页设计项目完整版本(阿里矢量图标库)分享
  7. 个人游戏开发者是如何盈利
  8. ubuntu/debian-bluster 用python安装 sasl 报错解决
  9. Matlab似然比检验函数,似然比检验 LRT
  10. 职场漂流记:过往皆为浮云
  11. 皇家每羊历险记(二)——地形制作
  12. 2017字节跳动秋招编程题-头条校招
  13. Idea新建项目名后出现中括号别名
  14. Cacls Command Question
  15. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛错题笔记
  16. 计算机组网技术形考4单元答案,最新国家开放大学电大《计算机组网技术》网络核心课形考任务四答案...
  17. 程序员一年工作经验之谈
  18. ModelMapper 的高级使用
  19. HGAME 2023 Week1
  20. 重新审视Visio的本质

热门文章

  1. 【迅为iMX6Q】开发板 烧写工具 MfgTool2.exe 打不开问题的解决
  2. 输出200以内所有能被7整除的数
  3. 内存的基础知识(常用数量单位、进程运行原理、存储单元、内存地址、绝对装入、静态重定位、动态重定位、静态链接、动态链接等)
  4. Python cv2读取/存储图片中含中文路径失败的解决方法
  5. STM32CubeMx使用教程(一)——安装CubeMx
  6. 关于软件产品化的几点思考【转】
  7. python乘积函数_Python中乘法
  8. windows系统如何真正隐藏文件夹[转载]
  9. kprobe 的 3 种使用
  10. 当前 IT 行业,软件开发应该掌握的几种编程语言,你学会了几种?