Richard Zhao wrote:
Sure I can add rules. but the rules will be checked as hw_param. If hw_param failed, does alsalib convert fmt or sample rate automatically?
For example: One codec, support: 44.1k : s8 s16 s24 s32 96k: s24 s32
When user try to play s8/s16 96k audio file, hw_param will fail.
This is not how the rules work.
Initializing a device works like this: 1) The application opens the device, and the driver's open callback gets called. 2) The application chooses hardware parameters; ALSA checks that these values conform to the device's limitations. 3) After all hardware parameters are known, the driver's hw_params callback gets called.
When you driver adds constraint rules, it has do this in the open callback (so that the rules are available in step 2 above). Your constraint rules will be called when the application tries to select parameters; this is before the hw_params callback gets called.
In your example above, the open callback would install two rule functions: one to remove s8/s16 if 96k has been selected, and one to remove 96k if s8/s16 has been selected.
When the hw_params callback is called, ALSA guarantees that the parameters are valid for the device.
HTH Clemens