天天看點

高通音頻驅動錄音流程(五)

高通音頻驅動錄音流程(五)

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, &params)
	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
					
           

繼續閱讀