您的位置:首页 > 移动开发 > Android开发

[RK3288][Android6.0] Audio录音frame rate设置流程小结

2017-05-08 13:34 1141 查看
Platform: Rockchip

OS: Android 6.0

Kernel: 3.10.92

HAL:

默认的配置在

hardware/rockchip/audio/tinyalsa_hal/audio_hw.h:

struct pcm_config pcm_config_in = {

    .channels = 2,

    .rate =44100,    //配置的是44100Hz.

    .period_size = 16,

    .period_count = 32,

    .format = PCM_FORMAT_S16_LE,

};

流程:

adev_open_input_stream -> audio_hw.c

    in->stream.read ->

        in_read ->

            start_input_stream ->

                pcm_open ->    pcm.c    //使用tinyalsa库标准接口

                    open ->    //设备格式是/dev/snd/pcmC%uD%u%c

                    ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, ¶ms) ->

                        snd_pcm_capture_ioctl ->    pcm_native.c    //进入kernel

                            snd_pcm_capture_ioctl1 ->

                                snd_pcm_common_ioctl1 ->

                                    snd_pcm_hw_params_user ->    //cmd: SNDRV_PCM_IOCTL_HW_PARAMS

                                        snd_pcm_hw_params ->

                                            substream->ops->hw_params ->

                                                soc_pcm_hw_params ->

                                                    rtd->dai_link->ops->hw_params ->    //machine

                                                        rk29_hw_params    rk_rt5631.c    

                                                    codec_dai->driver->ops->hw_params ->    //codec dai

                                                        rt5631_hifi_pcm_params -> rt5631.c

                                                            get_coeff_in_slave_mode

                                                            rt5631_write    //寄存器:RT5631_STEREO_AD_DA_CLK_CTRL

                                                    cpu_dai->driver->ops->hw_params ->    //platform dai,即cpu dai

                                                        rockchip_i2s_hw_params    //i2s设置,由于前面cpu已经设置好频率,这里就不用设置了.

                                                    platform->driver->ops->hw_params    //platform driver

                                                        dmaengine_pcm_hw_params    //只是配置dma,和framerate无关

                

从framerate的设置也可以了解到了hw_params的调用流程, 其他参数如format, channel也是一样的过程.

摘自: http://blog.csdn.net/droidphone/article/details/7165482
ASOC重要概念:

Machine  

是指某一款机器,可以是某款设备,某款开发板,又或者是某款智能手机,由此可以看出Machine几乎是不可重用的,每个Machine上的硬件实现可能都不一样,CPU不一样,Codec不一样,音频的输入、输出设备也不一样,Machine为CPU、Codec、输入输出设备提供了一个载体。

Platform  

一般是指某一个SoC平台,比如pxaxxx,s3cxxxx,omapxxx等等,与音频相关的通常包含该SoC中的时钟、DMA、I2S、PCM等等,只要指定了SoC,那么我们可以认为它会有一个对应的Platform,它只与SoC相关,与Machine无关,这样我们就可以把Platform抽象出来,使得同一款SoC不用做任何的改动,就可以用在不同的Machine中。实际上,把Platform认为是某个SoC更好理解。

Codec

字面上的意思就是编解码器,Codec里面包含了I2S接口、D/A、A/D、Mixer、PA(功放),通常包含多种输入(Mic、Line-in、I2S、PCM)和多个输出(耳机、喇叭、听筒,Line-out),Codec和Platform一样,是可重用的部件,同一个Codec可以被不同的Machine使用。嵌入式Codec通常通过I2C对内部的寄存器进行控制。

摘自: http://blog.csdn.net/droidphone/article/details/7316061
软件部分

Platform驱动的主要作用是完成音频数据的管理,最终通过CPU的数字音频接口(DAI)把音频数据传送给Codec进行处理,最终由Codec输出驱动耳机或者是喇叭的音信信号。在具体实现上,ASoC有把Platform驱动分为两个部分:snd_soc_platform_driver和snd_soc_dai_driver。其中,platform_driver负责管理音频数据,把音频数据通过dma或其他操作传送至cpu dai中,dai_driver则主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的dma等参数与snd_soc_platform_driver进行交互。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: