[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进行交互。
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进行交互。
相关文章推荐
- [RK3288][Android6.0] Audio的音量设置流程小结
- [RK3288][Android6.0] Audio录音HAL层的初始化流程分析
- [RK3288][Android6.0] Audio录音HAL层的数据读取流程分析
- [RK3288][Android6.0] Audio中的HW Params设置流程
- [RK3288][Android6.0] Audio中的录音重采样小结
- [RK3288][Android6.0] 开机播放音乐流程小结
- [RK3288][Android6.0] Wifi Service初始化流程小结
- [RK3288][Android6.0] USB hub初始化流程小结
- [RK3288][Android6.0] 串口驱动流程小结
- [RK3288][Android6.0] 调试笔记 --- Audio驱动层判断录音数据是否异常
- [RK3288][Android6.0] Audio中的混音过程小结
- [RK3288][Android6.0] Audio的音量计算过程小结
- [RK3288][Android6.0] Apk设置显示旋转过程小结
- [RK3288][Android6.0] Audio的DMA调用实例流程
- [RK3288][Android6.0] Display驱动初始化流程小结
- [RK3288][Android6.0] U-boot 启动流程小结
- [RK3288][Android6.0] 网络服务Netd初始化流程小结
- [RK3288][Android6.0] Camera HAL层拍照编码成JPEG流程小结
- [RK3288][Android6.0] ION 驱动流程小结
- [RK3288][Android6.0] DDR Frequency控制流程小结