Android底层开发之音频输入通道的软硬件分析
来源:互联网 发布:想要女生的身体 知乎 编辑:程序博客网 时间:2024/05/29 14:16
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);
使用分体式耳机表示是这样的:
只插入Mic,不插入耳机。
我所说的 支持不完善 是指就算你内核确定硬件上插入的仅仅是一个独立的Mic,那么也不知道在/sys/class/switch/h2w/state中填写一个什么样的数字来表示这种状态。
- Android底层开发之音频输入通道的软硬件分析
- Android底层开发之耳机插拔与音频通道切换实例
- Android底层开发之耳机插拔与音频通道切换实例
- Android底层开发之耳机插拔与音频通道切换实例
- android底层驱动学习之linux输入子系统的理解
- Android开发之初探音频的播放
- 12月26日,唐攀网络直播讲解《Android手机底层软硬件结合开发技术》
- android音频开发技术分析
- 【cocos2dx音频问题参考方案】【Android开发】之MediaPlayer的错误分析
- 对底层软硬件的一些胡思乱想
- Android音频开发之尝试音频混合
- Android下的音频通道配置文件mixer_paths.xml
- Android底层开发之Linux输入子系统要不要判断系统休眠状态上报键值
- Android开发之滤镜和颜色通道
- Android开发之播放音频
- [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件
- 开源android平板开发所需的软硬件知识
- android 音频底层调试-tinyalsa
- joseph环
- 前端知识体系及修炼攻略
- 一个页面引入另一个页面时,contentType 应保持一致
- SGU 552 Database optimization
- antlr学习笔记
- Android底层开发之音频输入通道的软硬件分析
- 关于Verilog中的赋值问题
- 日志文件3种状态
- 第四章 4.10节练习
- using thymeleaf之五条件表达式
- 个人项目:统计文本中的单词出现频率
- 点击率校准
- set、env、export的区别
- 关于日期格式为yyyyMMddHHmmss的14位按日、月、年、季度以及去重、未去重查询