• 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 ", __func__);

                    return -EINVAL;

            }

     

            if (rk616->capture_path == ucontrol->value.integer.value[0]){

                    DBG("%s : capture_path is not changed! ", __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 ", __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中填写什么样的数字来表示的状态

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

  • 相关阅读:
    CSS3属性transform详解之(旋转:rotate,缩放:scale,倾斜:skew,移动:translate)
    MySQL<添加、更新与删除数据>
    MySQL<数据库和表的基本操作>
    MySQL<数据库入门>
    MySql阶段案例
    Mysql综合案例
    Mysql课后思考题
    Java课后思考题
    Java课后简答题
    超全面的JavaWeb笔记day23<AJAX>
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4887132.html
Copyright © 2020-2023  润新知