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?
If no, then these parameters should be moved somewhere else - e.g. hw_params or something.
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.
I also wonder how it was tested since tinycompress does not support this?
+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;
- 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
- 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
- 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;