Android潜在的发展音频输入通道的软硬件分析

我们都知道耳机Mic集成在一直的那种四段耳机Mic插头是Android设备上比較经常使用。可是也会有分开的情况,比較假设在普通的PC机中装Android系统,那么就是这样的情况。所以就有必要对音频输入通道的软件硬件进行统一的分析一下,接下来分析一个实例。

该设备的硬件连接为:基于3157的模拟开关实现的 通道切换。

设备是全然靠硬件实现的,那么就没有软件的什么工作了。可是这并非一个理想的实现方法,真下的实现方法应该是全部的Mic都是并行的。每一个Mic通道都有一个使能管脚。让系统来控制让哪个Mic作为输入。事实上rk616 audio代码中是有切换的代码的:

static int rk616_capture_path_put(struct snd_kcontrol *kcontrol,

struct snd_ctl_elem_value *ucontrol)

{

struct rk616_codec_priv *rk616 = rk616_priv;

long int pre_path;

if (!rk616) {

printk("%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);

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2FuZ2Vhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

使用分体式耳机表示是这种:

仅仅插入Mic。不插入耳机。

我所说的 支持不完好 是指就算你内核确定硬件上插入的不过一个独立的Mic。那么也不知道在/sys/class/switch/h2w/state中填写什么样的数字来表示的状态

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android音频输入通道的底层硬件和软件开发分析的更多相关文章

  1. Android音频录制MediaRecorder之简易的录音软件实现代码(转)

    原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...

  2. Android系统--输入系统(七)Reader_Dispatcher线程启动分析

    Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...

  3. Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件

    Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...

  4. [转]Android音频底层调试-基于tinyalsa

    http://blog.csdn.net/kangear/article/details/38139669 [-] 编译tinyalsa配套工具 查看当前系统的声卡 tinymix查看混响器 使用ti ...

  5. Android音频底层调试-基于tinyalsa

    因为Android中默认并没有使用标准alsa,而是使用的是tinyalsa.所以就算基于命令行的測试也要使用libtinyalsa.Android系统在上层Audio千变万化的时候,能够能这些个工具 ...

  6. 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)

    上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...

  7. Android音频介绍

    这个世界音频设备千变万化,Android也不可能为每种设备都提供支持.Android定义了一个框架,这个框架来适配底层的音频设备.该适配层的定义位于: hardware/libhardware_leg ...

  8. Android音频开发之——如何播放一帧音频

    本文重点关注如何在Android平台上播放一帧音频数据.阅读本文之前,建议先读一下<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的 ...

  9. Android音频系统之音频框架

    1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段 ...

随机推荐

  1. cordova android

    Image.png Image.png http://www.jscss.cc/2016/10/18/cordova.html 装一个全局的cordova: 官网介绍:http://cordova.a ...

  2. Log4net.confager配置官方文档

    http://logging.apache.org/log4net/release/config-examples.html

  3. svg的世界、视窗、视野

    刚学svg时 看视频有人说了视窗和视野两个概念.学移动端时,又听说过视口这个概念.感觉还是有点绕的.以此博客来整理记录我查的资料. 1.世界 就是说svg的世界其实可以无限大,你想让它多大就多大,你可 ...

  4. 【BZOJ 2754】[SCOI2012]喵星球上的点名

    [链接]h在这里写链接 [题意]     n个人;     由姓和名组成.s1[i]和s2[i];     有m个询问串.     问你第j个询问串,是否为某个人的姓或者名的子串.     如果是的话 ...

  5. FPGA实现UHS的一些资料

    对使用FPGA和SD卡进行UHS模式通信的评估: 论文:基于FPGA的SD UHS-II卡控制器设计与实现 设计IP:SD UHS-II Host Controller 供应商: System Lev ...

  6. MVC模式编程演示样例-登录验证(静态)

    好,上篇博客分享了本人总结的JSP-Servlet-JavaBean三层架构编程模式的实现思想和基本流程,接下来给大家分享一个MVC编程模式的实现演示样例-登录验证的过程,这里我仍然用的是静态的验证u ...

  7. 【7001】n阶法雷序列

    Time Limit: 10 second Memory Limit: 2 MB 问题描述      对任意给定的一个自然数n(n<=100),将分母小于等于n的不可约的真分数按上升的次序排序, ...

  8. mysql 查询重复 去除重复等等

    查找所有重复标题的记录: SELECT * FROM t_info a WHERE ((SELECT COUNT(*) FROM t_info WHERE Title = a.Title) >  ...

  9. JVM调优2

    原文地址:https://blog.csdn.net/sun1021873926/article/details/78002118 一.什么是JVM  JVM是Java Virtual Machine ...

  10. Unity3D资源管理架构

    在Unity3D引擎中,场景资源文件(.unity)是以2进制格式存储的.但同一时候它也有一种基于文本的表现格式. 可在Edit>Project Setting>Editor 中设置: 1 ...