高通音频驱动录音流程(五)
mixer path 设置过程分析
snd_soc_register_card
-
- 录音通路配置
- 调用tinycap命令时的音频播放流程
网上关于音频驱动的文章,大多是进行框架性的介绍,关于音频驱动控件的配置及录音播放介绍的很少,下面就已高通sm6350的mic通路配置及录音的配置,进行音频驱动流程的介绍。
录音通路配置
/* 下面这三个是对swr侧进行配置 */
tinymix "TX DEC1 MUX" "SWR_MIC"
tinymix "TX SMIC MUX1" "ADC0"
tinymix "TX_AIF1_CAP Mixer DEC1" "1"
/* Enables soundwire slave device data path */
tinymix "ADC1_MIXER Switch" "1"
/* 配置DMA的channel及bolero的音量增益 */
tinymix "TX_CDC_DMA_TX_3 Channels" "One"
tinymix "TX_DEC1 Volume" "80"
/* 将fe与be连接,其中MultiMedia1对应的时deep buffer playback */
tinymix "MultiMedia1 Mixer TX_CDC_DMA_TX_3" "1"
调用tinycap命令时的音频播放流程
tinycap /sdcard/Music/test.wav -c 1 -r 48000 -b 16 -T 10
pcm->fd = open(fn, O_RDWR|O_NONBLOCK);
snd_open
snd_pcm_capture_open
snd_pcm_open
snd_pcm_open_file
snd_pcm_open_substream
substream->ops->open(substream))
dpcm_fe_dai_open
dpcm_fe_dai_startup
dpcm_be_dai_startup
soc_pcm_open
cpu_dai->driver->ops->startup(substream, cpu_dai)
component->driver->ops->open(substream)
codec_dai->driver->ops->startup(substream, codec_dai)
rtd->dai_link->ops->startup(substream);
ioctl(pcm->fd, SNDRV_PCM_IOCTL_INFO, &info))
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_info_user
snd_pcm_info
ioctl(pcm->fd, SNDRV_PCM_IOCTL_HW_PARAMS, ¶ms)
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_hw_params_user
snd_pcm_hw_params
substream->ops->hw_params(substream, params);
dpcm_fe_dai_hw_params
dpcm_be_dai_hw_params
rtd->dai_link->be_hw_params_fixup(rtd, params)
rtd->dai_link->ops->hw_params(substream, params)
soc_dai_hw_params(substream, &codec_params, codec_dai)
soc_dai_hw_params(substream, params, cpu_dai)
rtd->dai_link->be_hw_params_fixup(rtd, params)
dai->driver->ops->hw_params(substream, params, dai)
component->driver->ops->hw_params(substream, params)
ioctl(pcm->fd, SNDRV_PCM_IOCTL_SW_PARAMS, &sparams)
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_sw_params_user
snd_pcm_sw_params
ioctl(pcm->fd, SNDRV_PCM_IOCTL_PREPARE)
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_prepare
snd_pcm_action_nonatomic
snd_pcm_action_prepare
substream->ops->prepare(substream)
dpcm_fe_dai_prepare
dpcm_be_dai_prepare
soc_pcm_prepare
rtd->dai_link->ops->prepare(substream)
component->driver->ops->prepare(substream)
codec_dai->driver->ops->prepare(substream, codec_dai)
cpu_dai->driver->ops->prepare(substream, cpu_dai)
dai->driver->ops->mute_stream(dai, mute, direction)
ioctl(pcm->fd, SNDRV_PCM_IOCTL_START)
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_start_lock_irq
snd_pcm_action_lock_irq
snd_pcm_action_start
substream->ops->trigger(substream, SNDRV_PCM_TRIGGER_START)
dpcm_fe_dai_trigger
dpcm_fe_dai_do_trigger
dpcm_dai_trigger_fe_be
dpcm_be_dai_trigger
soc_pcm_trigger
codec_dai->driver->ops->trigger(substream, cmd, codec_dai)
cmponent->driver->ops->trigger(substream, cmd)
cpu_dai->driver->ops->trigger(substream, cmd, cpu_dai)
rtd->dai_link->ops->trigger(substream, cmd)
ioctl(pcm->fd, SNDRV_PCM_IOCTL_READI_FRAMES, &x)
snd_pcm_ioctl
snd_pcm_common_ioctl
snd_pcm_xferi_frames_ioctl
snd_pcm_lib_read
__snd_pcm_lib_xfer