Dne 05. 03. 19 v 15:23 Sven Van Asbroeck napsal(a):
Hi Takashi,
On Mon, Mar 4, 2019 at 11:42 PM Takashi Sakamoto o-takashi@sakamocchi.jp wrote:
Anyway, when posting to change UAPI of Linux sound subsystem, it's better to describe the reason fot new stuffs; what they're designed for, and the reason to require them. Wnen posting in a result of series of discussion done previously, it's better to add any reference to it.
My apologies for not linking in previous discussions, I'll certainly make sure to link in the future.
The original problem was that the fsl_ssi did not appear to work with the tda998x hdmi codec. This codec seems to be 'unique' in the sense that it needs to know the number of clocks per frame on the wire, i.e. the bclk_ratio, which no-one in alsa is providing or using at the moment.
I first made the error of conflating the physical width and the bclk_ratio, and posted this patch - Russell King quickly pointed out my error: https://mailman.alsa-project.org/pipermail/alsa-devel/2019-February/145916.h...
This then led to the following discussions: https://mailman.alsa-project.org/pipermail/alsa-devel/2019-February/thread.h... https://mailman.alsa-project.org/pipermail/alsa-devel/2019-February/thread.h...
Most of the discussion is about a mechanism to convey bclk_ratio from the frame master to the tda998x. We don't yet seem to have a consensus on how to do this best.
My rfc patch was only intended to provoke discussion, and to allow people to experiment with a flawed solution that would allow the alsa core to negotiate bclk_ratio between components. The uapi change is a serious flaw. bclk_ratio negotiation should be invisible to userspace. But I cannot see a way to accomplish this.
I think that this might be resolved using double constraint rules in the affected driver:
snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_FORMAT, bclk_format_constraint, substream, SNDRV_PCM_HW_PARAM_CHANNELS, -1); snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, bclk_channels_constraint, substream, SNDRV_PCM_HW_PARAM_FORMAT, -1);
And refine the format bitmask / channel interval according your bclk constraint. The physical sample width can be obtained in both bclk_format_constraint / bclk_channels_constraint function so all input values are known. The final bclk value can be obtained like in your proposed code:
params_channels(params) * params_width(params)
Jaroslav