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 PathRK30_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中填写一个什么样的数字来表示这种状态

更多相关文章

  1. [置顶] Android(安卓)从硬件到应用:一步一步向上爬 3 -- 硬件抽象
  2. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
  3. Android的图形显示原理(GDI)一
  4. Android(安卓)获取设备和系统信息
  5. android 8.0 Notification 的处理
  6. Android(安卓)GPS架构分析-preview
  7. Android硬件加速相关知识点总结
  8. Android(安卓)设备唯一标识(多种实现方案)
  9. Android(安卓)Camera HAL3 - Multi Camera(1)

随机推荐

  1. 大图片文件压缩保存本地,返回本地url
  2. Android:系统demo布局汇总
  3. 佛祖保佑 永无BUG 永不修改
  4. Androidstudio实现手机摇一摇功能
  5. Android(安卓)使用broadcast receiver 截
  6. Android(安卓)自定义 View 之弹球游戏
  7. android自定义滑动选择开关
  8. android junit 测试 简要步骤
  9. x、Android保存图片至相册原生代码
  10. Android(安卓)Bitmap详细介绍