[alsa-devel] Question about hw_param with Ctrl-Z + fg

Kuninori Morimoto kuninori.morimoto.gx at renesas.com
Wed Apr 5 06:50:32 CEST 2017


Hi Sakamoto-san, again

Thanks you for your help.
I think I could find my issue on my system.
I will post patch, soon

> > > Hmm...
> > > Above .be_hw_params_fixup is used to convert sampling rate or channel
> > > number or some other related things between SoC / Codec as DPCM feature.
> > > Thus, I can't switch to .be_hw_params_fixup to .prepare I guess.
> > > But Mark, am I misunderstanding ?
> > 
> > In 'struct snd_pcm_ops.prepare' callback, configured parameters of PCM
> > substream are available via members of 'struct snd_pcm_runtime'. The
> > runtime is a member of 'struct snd_pcm_substream'. It's available in
> > any of .prepare callbacks in ALSA SoC part.
> 
> Thank you for detail explain.
> I investigated this, and I tried to use .prepare with below system.
> 
> 	[44.1kHz] -> CPU -> .be_hw_params_fixup[44.1kHz -> 48kHz] -> Codec
> 
> This means, CPU converts 44.1kHz to 48kHz, and
> Codec want to receive 48kHz as parameter.
> On CPU/Codec both side, these got 44.1kHz from runtime.
> 
> static int cpu/codec_prepare(struct snd_pcm_substream *substream)
> {
> 	/*
> 	 * In 44.1kHz -> 48kHz convert case,
> 	 * .be_hw_params_fixup() do convert magic.
> 	 * but here .prepare, it still receive 44.1kHz
> 	 */
> 	printk("rate = %d\n", substream->runtime->rate);
> }
> 
> On CPU side, I could get converted parameter somehow (see below),
> but it has zero chance to get converted parameter on Codec side .prepare ?
> Converted rate is located only struct snd_pcm_hw_params in my system (= simple-scu-card).
> Current .be_hw_params_fixup() is saving converted rate/channel in struct snd_interval,
> but it should save it to struct snd_soc_pcm_runtime ?
> 
> void asoc_simple_card_convert_fixup(...
> 				    struct snd_pcm_hw_params *hw_params)
> {
> 	struct snd_interval *rate = hw_param_interval(hw_params,
> 						SNDRV_PCM_HW_PARAM_RATE);
> 	struct snd_interval *channels = hw_param_interval(hw_params,
> 						SNDRV_PCM_HW_PARAM_CHANNELS);
> 	printk("------fixup\n");
> 	if (data->convert_rate)
> 		rate->min =
> 		rate->max = data->convert_rate;
> 
> 	if (data->convert_channels)
> 		channels->min =
> 		channels->max = data->convert_channels;
> }
> 
> 
> ---- CPU could get converted rate --------------------------
> static int cpu_prepare(struct snd_pcm_substream *substream)
> {
> 	struct snd_soc_pcm_runtime *fe = substream->private_data;
> 
> 	/* substream->runtime->rate is still 44.1kHz here */
> 
> 	if (fe->dai_link->dynamic) {
> 		int stream = substream->stream;
> 		struct snd_soc_dpcm *dpcm;
> 		struct snd_pcm_hw_params *be_params;
> 
> 		list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
> 			be_params = &dpcm->hw_params;
> 
> 			/*
> 			 * I could receive 48kHz here as params_rate(be_params)
> 			 */
> 		}
> 	}
> 
> 	return 0;
> }
> 
> 
> Best regards
> ---
> Kuninori Morimoto


More information about the Alsa-devel mailing list