[alsa-devel] [PATCH 2/2] ASoC: pcm: Always honor DAI min and max sample rate constraints

Takashi Iwai tiwai at suse.de
Wed Nov 27 14:13:21 CET 2013


At Wed, 27 Nov 2013 12:21:53 +0000,
Mark Brown wrote:
> 
> On Wed, Nov 27, 2013 at 12:26:29PM +0100, Takashi Iwai wrote:
> > Lars-Peter Clausen wrote:
> 
> > > My thinking as well. There are some driver which do set CONTINUOUS or KNOT,
> > > but don't specify a minimum and maximum rate and probably rely on the fact
> > > that we always call snd_pcm_limit_hw_rates() (E.g. the kirkwood drivers do
> > > this). In my opinion those drivers should be fixed and once that is done we
> > > can add a check that skips snd_pcm_limit_hw_rates() if KNOT or CONTINUOUS is
> > > set. The current behavior isn't optimal e.g. if a driver sets
> > > SNDRV_PCM_RATE_CONTINUOUS and SNDRV_PCM_RATE_8000_192000 and rate_max to
> > > 384000, we'd still end up with a maximum rate of 192000 because of
> > > snd_pcm_limit_hw_rates().
> 
> > Right.  We should catch all them once, then add a sanity check
> > something like
> 
> It seems neater if snd_pcm_limit_hw_rates() does the right thing no
> matter what the rates are - this centralises the logic for handling this
> which reduces the complexity for drivers.

Well, the difficult point is to decide what is right, if the given
condition is already wrong (e.g. rate_min/max don't match with the
RATE bits).  We can accept it somehow silently (as of now), but I
think it's better to warn (and/or refuse).

> > 	WARN_ON((rates & SNDRV_PCM_RATE_KNOT) && \
> > 		(rates & ~SNDRV_PCM_RATE_KNOT));
> > 	WARN_ON((rates & SNDRV_PCM_RATE_CONTINUOUS) && \
> > 		(rates & ~SNDRV_PCM_RATE_CONTINUOUS));
> 
> This does make sense, though we'll need to change the constraint merging
> code in ASoC since right now it assumes that combining the masks will do
> the merge which won't be the case if you have devices with one of these
> flags together with any other flags (either specific rates or the other
> non-bitmask one).  It would be nice if we were just throwing the device
> constraints into the core constraint code and letting it merge them
> together.

I think Lars' fix will handle such a case nicely now; at least,
merging between RATE bits and rate_min/max is solved, as long as the
given conditions are consistent.

But yes, we can certainly put some sanity checks and more handling
code into a core stuff.  But the drivers giving wrong parameters must
be fixed in anyway.  IIRC, even ac97_codec.c does something
misaligned.  Warnings would be a help for hunting such ones, and I
didn't intend it being more than that in WARN_ON() above.


thanks,

Takashi


More information about the Alsa-devel mailing list