On Mon, Aug 19, 2024 at 3:42 PM Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx> wrote: > > > > On 8/16/24 12:42, Shengjiu Wang wrote: > > Implement the ASRC memory to memory function using > > the compress framework, user can use this function with > > compress ioctl interface. > > > > Define below private metadata key value for output > > format, output rate and ratio modifier configuration. > > ASRC_OUTPUT_FORMAT 0x80000001 > > ASRC_OUTPUT_RATE 0x80000002 > > ASRC_RATIO_MOD 0x80000003 > > Can the output format/rate change at run-time? Seldom I think. > > If no, then these parameters should be moved somewhere else - e.g. > hw_params or something. This means I will do some changes in compress_params.h, add output format and output rate definition, follow Jaroslav's example right? > > I am still not very clear on the expanding the SET_METADATA ioctl to > deal with the ratio changes. This isn't linked to the control layer as > suggested before, and there's no precedent of calling it multiple times > during streaming. Which control layer? if you means the snd_kcontrol_new? it is bound with sound card, but in my case, I need to the control bind with the snd_compr_stream to support multi streams/instances. > > I also wonder how it was tested since tinycompress does not support this? I wrote a unit test to test these ASRC M2M functions. > > > > +static int fsl_asrc_m2m_fill_codec_caps(struct fsl_asrc *asrc, > > + struct snd_compr_codec_caps *codec) > > +{ > > + struct fsl_asrc_m2m_cap cap; > > + __u32 rates[MAX_NUM_BITRATES]; > > + snd_pcm_format_t k; > > + int i = 0, j = 0; > > + int ret; > > + > > + ret = asrc->m2m_get_cap(&cap); > > + if (ret) > > + return -EINVAL; > > + > > + if (cap.rate_in & SNDRV_PCM_RATE_5512) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_5512); > > this doesn't sound compatible with the patch2 definitions? > > cap->rate_in = SNDRV_PCM_RATE_8000_768000; This ASRC M2M driver is designed for two kinds of hw ASRC modules. one cap is : cap->rate_in = SNDRV_PCM_RATE_8000_192000 | SNDRV_PCM_RATE_5512; another is : cap->rate_in = SNDRV_PCM_RATE_8000_768000; they are in patch2 and patch3 > > > + if (cap.rate_in & SNDRV_PCM_RATE_8000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_8000); > > + if (cap.rate_in & SNDRV_PCM_RATE_11025) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_11025); > > + if (cap.rate_in & SNDRV_PCM_RATE_16000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_16000); > > + if (cap.rate_in & SNDRV_PCM_RATE_22050) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_22050); > > missing 24 kHz There is no SNDRV_PCM_RATE_24000 in ALSA. > > > + if (cap.rate_in & SNDRV_PCM_RATE_32000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_32000); > > + if (cap.rate_in & SNDRV_PCM_RATE_44100) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_44100); > > + if (cap.rate_in & SNDRV_PCM_RATE_48000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_48000); > > missing 64kHz Yes, will add it. Best regards Shengjiu Wang > > > + if (cap.rate_in & SNDRV_PCM_RATE_88200) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_88200); > > + if (cap.rate_in & SNDRV_PCM_RATE_96000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_96000); > > + if (cap.rate_in & SNDRV_PCM_RATE_176400) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_176400); > > + if (cap.rate_in & SNDRV_PCM_RATE_192000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_192000); > > + if (cap.rate_in & SNDRV_PCM_RATE_352800) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_352800); > > + if (cap.rate_in & SNDRV_PCM_RATE_384000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_384000); > > + if (cap.rate_in & SNDRV_PCM_RATE_705600) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_705600); > > + if (cap.rate_in & SNDRV_PCM_RATE_768000) > > + rates[i++] = snd_pcm_rate_bit_to_rate(SNDRV_PCM_RATE_768000); > > + > > + pcm_for_each_format(k) { > > + if (pcm_format_to_bits(k) & cap.fmt_in) { > > + codec->descriptor[j].max_ch = cap.chan_max; > > + memcpy(codec->descriptor[j].sample_rates, rates, i * sizeof(__u32)); > > + codec->descriptor[j].num_sample_rates = i; > > + codec->descriptor[j].formats = k; > > + j++; > > + } > > + } > > + > > + codec->codec = SND_AUDIOCODEC_PCM; > > + codec->num_descriptors = j; > > + return 0; > >