Android音频输入通道的底层硬件和软件开发分析
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音频输入通道的底层硬件和软件开发分析的更多相关文章
- Android音频录制MediaRecorder之简易的录音软件实现代码(转)
原文:http://www.jb51.net/article/46182.htm Android音频录制MediaRecorder之简易的录音软件实现代码 这篇文章主要介绍了Android音频录制Me ...
- Android系统--输入系统(七)Reader_Dispatcher线程启动分析
Android系统--输入系统(七)Reader_Dispatcher线程启动分析 1. Reader/Dispatcher的引入 对于输入系统来说,将会创建两个线程: Reader线程(读取事件) ...
- Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件
Android系统--输入系统(十三)Dispatcher线程情景分析_Reader线程传递事件 1. 输入按键 我们知道Android系统的按键分为三类:(1)Global Key;(2)Syste ...
- [转]Android音频底层调试-基于tinyalsa
http://blog.csdn.net/kangear/article/details/38139669 [-] 编译tinyalsa配套工具 查看当前系统的声卡 tinymix查看混响器 使用ti ...
- Android音频底层调试-基于tinyalsa
因为Android中默认并没有使用标准alsa,而是使用的是tinyalsa.所以就算基于命令行的測试也要使用libtinyalsa.Android系统在上层Audio千变万化的时候,能够能这些个工具 ...
- 如何将Android Studio与华为软件开发云代码仓库无缝对接(二)
上篇文章:如何将Android Studio与华为软件开发云代码仓库无缝对接(一) 上一章讲了,如何用Android Studio以软件开发云代码仓库为基础,新建一个项目.接下来,这一章继续讲建好项目 ...
- Android音频介绍
这个世界音频设备千变万化,Android也不可能为每种设备都提供支持.Android定义了一个框架,这个框架来适配底层的音频设备.该适配层的定义位于: hardware/libhardware_leg ...
- Android音频开发之——如何播放一帧音频
本文重点关注如何在Android平台上播放一帧音频数据.阅读本文之前,建议先读一下<Android音频开发(1):基础知识>,因为音频开发过程中,经常要涉及到这些基础知识,掌握了这些重要的 ...
- Android音频系统之音频框架
1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段 ...
随机推荐
- Java核心技术 卷Ⅰ 基础知识(5)
第11章 异常.断言.日志和调试 处理错误 异常分类 声明已检查异常 如何抛出异常 创建异常类 捕获异常 捕获多个异常 再次抛出异常与异常链 finally子句 带资源的try语句 分析堆栈跟踪元素 ...
- JS预解释的总结
预解释阶段发生在创建了堆内存,让代码执行之前,对当前作用域中带var和function的进行预解释 在浏览器解析执行代码的时候,会提前把带var和function的代码声明或定义,提前放在作用域的最前 ...
- angular 设置全局常量
一:在项目核心文件core.module.ts中设置全局静态常量 解释:相当于自动注入到inject中. providers:[ { provide:'BASE_CONFIG', useValue:' ...
- VMware Ubuntu安装详细过程(详细图解)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.下载Ubuntu镜像文件 下载地址:http://mirrors.aliyun.com/ubuntu-releases/16. ...
- DC中为什么要用Uniquify?
转自:http://blog.sina.com.cn/s/blog_68c493870101exl7.html 为了在layout中进行时钟树的综合,网表在DC中必须被uniquified.所谓uni ...
- 【Educational Codeforces Round 31 C】Bertown Subway
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 最后肯定会形成若干个环的. 把最大的两个环合在一起就好. 每个环贡献: 假设x=环的大小 ->x*x 注意int的溢出 [代码 ...
- 对Linux下常用头文件总结
asm.current.h 定义全局项current ,其指向结构体struct task_struct linux/sched.h 定义结构体task_struct ,只要包含此头文件 ...
- VSX(翻译)Moving Code Blocks Among Code Regions using VS 2010 Extensions
Moving Code Blocks Among Code Regions using VS 2010 Extensions (翻译)使用VS 2010 扩展性将代码块移至Region区域中 Down ...
- 修复STS4 server中没有Tomcat的问题(必看,官方推荐,包教包会,国内首发)
版权声明:原创.欢迎转载,转载请注明来源,谢谢. https://blog.csdn.net/qq_41910280/article/details/83279129 修复STS4 server中没有 ...
- js页面载入特效如何实现
js页面载入特效如何实现 一.总结 一句话总结:可以加选择器(里面的字符串)作为参数,这样函数就可以针对不同选择器,就很棒了. 1.特效的原理是什么? 都是通过标签的位置和样式来实现特效的. 二.js ...