ALSA: Add support for wildcard msbits constraints
authorLars-Peter Clausen <lars@metafoo.de>
Mon, 29 Dec 2014 17:43:37 +0000 (18:43 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 30 Dec 2014 15:27:47 +0000 (16:27 +0100)
Currently the msbits constraints requires to specify a specific sample
format width for which the constraint should be applied. But often the
number of most significant bits is not sample format specific, but rather a
absolute limit. E.g. the PCM interface might accept 32-bit and 24-bit
samples, but the DAC has a 16-bit resolution and throws away the LSBs. In
this case for both 32-bit and 24-bit format msbits should be set to 16. This
patch extends snd_pcm_hw_constraint_msbits() so that a wildcard constraint
can be setup that is applied for all formats with a sample width larger than
the specified msbits. Choosing the wildcard constraint is done by setting
the sample width parameter of the function to 0.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_lib.c

index b0c1535..db05e04 100644 (file)
@@ -1299,8 +1299,14 @@ static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params,
        int width = l & 0xffff;
        unsigned int msbits = l >> 16;
        struct snd_interval *i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
-       if (snd_interval_single(i) && snd_interval_value(i) == width)
+
+       if (!snd_interval_single(i))
+               return 0;
+
+       if ((snd_interval_value(i) == width) ||
+           (width == 0 && snd_interval_value(i) > msbits))
                params->msbits = min_not_zero(params->msbits, msbits);
+
        return 0;
 }
 
@@ -1311,6 +1317,11 @@ static int snd_pcm_hw_rule_msbits(struct snd_pcm_hw_params *params,
  * @width: sample bits width
  * @msbits: msbits width
  *
+ * This constraint will set the number of most significant bits (msbits) if a
+ * sample format with the specified width has been select. If width is set to 0
+ * the msbits will be set for any sample format with a width larger than the
+ * specified msbits.
+ *
  * Return: Zero if successful, or a negative error code on failure.
  */
 int snd_pcm_hw_constraint_msbits(struct snd_pcm_runtime *runtime,