On Wed 11 Sep 2024 at 12:51, Takashi Iwai <tiwai@xxxxxxx> wrote: > On Wed, 11 Sep 2024 12:33:01 +0200, > Péter Ujfalusi wrote: >> >> On 11/09/2024 12:21, Takashi Iwai wrote: >> >> Wondering if this is backwards compatible with the alsa-lib definitions, >> >> specifically the topology parts which did unfortunately have a list of >> >> rates that will map to a different index now: >> >> >> >> >> >> typedef enum _snd_pcm_rates { >> >> SND_PCM_RATE_UNKNOWN = -1, >> >> SND_PCM_RATE_5512 = 0, >> >> SND_PCM_RATE_8000, >> >> SND_PCM_RATE_11025, >> >> SND_PCM_RATE_16000, >> >> SND_PCM_RATE_22050, >> >> SND_PCM_RATE_32000, >> >> SND_PCM_RATE_44100, >> >> SND_PCM_RATE_48000, >> >> SND_PCM_RATE_64000, >> >> SND_PCM_RATE_88200, >> >> SND_PCM_RATE_96000, >> >> SND_PCM_RATE_176400, >> >> SND_PCM_RATE_192000, >> >> SND_PCM_RATE_CONTINUOUS = 30, >> >> SND_PCM_RATE_KNOT = 31, >> >> SND_PCM_RATE_LAST = SND_PCM_RATE_KNOT, >> >> } snd_pcm_rates_t; >> > >> > As far as I understand correctly, those rate bits used for topology >> > are independent from the bits used for PCM core, although it used to >> > be the same. Maybe better to rename (such as SND_TPLG_RATE_*) so that >> > it's clearer only for topology stuff. >> >> Even if we rename these in alsa-lib we will need translation from >> SND_TPLG_RATE_ to SND_PCM_RATE_ in kernel likely? >> >> The topology files are out there and this is an ABI... >> >> > But it'd be better if anyone can double-check. >> >> Since the kernel just copies the rates bitfield, any rate above 11025 >> will be misaligned and result broken setup. > > Yep, I noticed it now, too. > > Below is the fix patch, totally untested. > It'd be appreciated if anyone can test it quickly. > > > thanks, > > Takashi > > -- 8< -- > From: Takashi Iwai <tiwai@xxxxxxx> > Subject: [PATCH] ALSA: pcm: Fix breakage of PCM rates used for topology > > It turned out that the topology ABI takes the standard PCM rate bits > as is, and it means that the recent change of the PCM rate bits would > lead to the inconsistent rate values used for topology. > > This patch reverts the original PCM rate bit definitions while adding > the new rates to the extended bits instead. This needed the change of > snd_pcm_known_rates, too. And this also required to fix the handling > in snd_pcm_hw_limit_rates() that blindly assumed that the list is > sorted while it became unsorted now. > > Fixes: 090624b7dc83 ("ALSA: pcm: add more sample rate definitions") > Signed-off-by: Takashi Iwai <tiwai@xxxxxxx> > --- > include/sound/pcm.h | 35 ++++++++++++++++++----------------- > sound/core/pcm_misc.c | 18 ++++++++++-------- > sound/core/pcm_native.c | 10 +++++++--- > 3 files changed, 35 insertions(+), 28 deletions(-) > > diff --git a/include/sound/pcm.h b/include/sound/pcm.h > index c993350975a9..824216799070 100644 > --- a/include/sound/pcm.h > +++ b/include/sound/pcm.h > @@ -109,23 +109,24 @@ struct snd_pcm_ops { > #define SNDRV_PCM_RATE_5512 (1U<<0) /* 5512Hz */ > #define SNDRV_PCM_RATE_8000 (1U<<1) /* 8000Hz */ > #define SNDRV_PCM_RATE_11025 (1U<<2) /* 11025Hz */ > -#define SNDRV_PCM_RATE_12000 (1U<<3) /* 12000Hz */ > -#define SNDRV_PCM_RATE_16000 (1U<<4) /* 16000Hz */ > -#define SNDRV_PCM_RATE_22050 (1U<<5) /* 22050Hz */ > -#define SNDRV_PCM_RATE_24000 (1U<<6) /* 24000Hz */ > -#define SNDRV_PCM_RATE_32000 (1U<<7) /* 32000Hz */ > -#define SNDRV_PCM_RATE_44100 (1U<<8) /* 44100Hz */ > -#define SNDRV_PCM_RATE_48000 (1U<<9) /* 48000Hz */ > -#define SNDRV_PCM_RATE_64000 (1U<<10) /* 64000Hz */ > -#define SNDRV_PCM_RATE_88200 (1U<<11) /* 88200Hz */ > -#define SNDRV_PCM_RATE_96000 (1U<<12) /* 96000Hz */ > -#define SNDRV_PCM_RATE_128000 (1U<<13) /* 128000Hz */ > -#define SNDRV_PCM_RATE_176400 (1U<<14) /* 176400Hz */ > -#define SNDRV_PCM_RATE_192000 (1U<<15) /* 192000Hz */ > -#define SNDRV_PCM_RATE_352800 (1U<<16) /* 352800Hz */ > -#define SNDRV_PCM_RATE_384000 (1U<<17) /* 384000Hz */ > -#define SNDRV_PCM_RATE_705600 (1U<<18) /* 705600Hz */ > -#define SNDRV_PCM_RATE_768000 (1U<<19) /* 768000Hz */ > +#define SNDRV_PCM_RATE_16000 (1U<<3) /* 16000Hz */ > +#define SNDRV_PCM_RATE_22050 (1U<<4) /* 22050Hz */ > +#define SNDRV_PCM_RATE_32000 (1U<<5) /* 32000Hz */ > +#define SNDRV_PCM_RATE_44100 (1U<<6) /* 44100Hz */ > +#define SNDRV_PCM_RATE_48000 (1U<<7) /* 48000Hz */ > +#define SNDRV_PCM_RATE_64000 (1U<<8) /* 64000Hz */ > +#define SNDRV_PCM_RATE_88200 (1U<<9) /* 88200Hz */ > +#define SNDRV_PCM_RATE_96000 (1U<<10) /* 96000Hz */ > +#define SNDRV_PCM_RATE_176400 (1U<<11) /* 176400Hz */ > +#define SNDRV_PCM_RATE_192000 (1U<<12) /* 192000Hz */ > +#define SNDRV_PCM_RATE_352800 (1U<<13) /* 352800Hz */ > +#define SNDRV_PCM_RATE_384000 (1U<<14) /* 384000Hz */ > +#define SNDRV_PCM_RATE_705600 (1U<<15) /* 705600Hz */ > +#define SNDRV_PCM_RATE_768000 (1U<<16) /* 768000Hz */ > +/* extended rates */ > +#define SNDRV_PCM_RATE_12000 (1U<<17) /* 12000Hz */ > +#define SNDRV_PCM_RATE_24000 (1U<<18) /* 24000Hz */ > +#define SNDRV_PCM_RATE_128000 (1U<<19) /* 128000Hz */ > > #define SNDRV_PCM_RATE_CONTINUOUS (1U<<30) /* continuous range */ > #define SNDRV_PCM_RATE_KNOT (1U<<31) /* supports more non-continuous rates */ > diff --git a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c > index 5588b6a1ee8b..4f556211bb56 100644 > --- a/sound/core/pcm_misc.c > +++ b/sound/core/pcm_misc.c > @@ -494,18 +494,20 @@ EXPORT_SYMBOL(snd_pcm_format_set_silence); > int snd_pcm_hw_limit_rates(struct snd_pcm_hardware *hw) > { > int i; > + unsigned int rmin, rmax; > + > + rmin = UINT_MAX; > + rmax = 0; > for (i = 0; i < (int)snd_pcm_known_rates.count; i++) { > if (hw->rates & (1 << i)) { > - hw->rate_min = snd_pcm_known_rates.list[i]; > - break; > - } > - } > - for (i = (int)snd_pcm_known_rates.count - 1; i >= 0; i--) { > - if (hw->rates & (1 << i)) { > - hw->rate_max = snd_pcm_known_rates.list[i]; > - break; > + rmin = min(rmin, snd_pcm_known_rates.list[i]); > + rmax = max(rmax, snd_pcm_known_rates.list[i]); > } > } > + if (rmin > rmax) > + return -EINVAL; > + hw->rate_min = rmin; > + hw->rate_max = rmax; > return 0; > } > EXPORT_SYMBOL(snd_pcm_hw_limit_rates); > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 7461a727615c..5e1e6006707b 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -2418,13 +2418,17 @@ static int snd_pcm_hw_rule_sample_bits(struct snd_pcm_hw_params *params, > return snd_interval_refine(hw_param_interval(params, rule->var), &t); > } > > -#if SNDRV_PCM_RATE_5512 != 1 << 0 || SNDRV_PCM_RATE_768000 != 1 << 19 > +#if SNDRV_PCM_RATE_5512 != 1 << 0 || SNDRV_PCM_RATE_192000 != 1 << 12 ||\ > + SNDRV_PCM_RATE_128000 != 1 << 19 > #error "Change this table" > #endif > > +/* NOTE: the list is unsorted! */ > static const unsigned int rates[] = { > - 5512, 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, > - 88200, 96000, 128000, 176400, 192000, 352800, 384000, 705600, 768000, > + 5512, 8000, 11025, 16000, 22050, 32000, 44100, > + 48000, 64000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000, > + /* extended */ > + 12000, 24000, 128000 > }; > > const struct snd_pcm_hw_constraint_list snd_pcm_known_rates = { I've quickly tested this version with a few rates (48, 128, 768k), amlogic device. Looks Ok. Tested-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx> Can't say for topology. -- Jerome