[alsa-devel] How to propagate parameters from FE to BE with compressed audio interfaces
Hello,
soc_compr_set_params_fe calls dpcm_be_dai_hw_params in order to setup BE hw_params.
Is there a way to transfer parameters like for example the rate from FE to BE?
In soc_compr_set_params_fe there is this code:
* * Create an empty hw_params for the BE as the machine driver must * fix this up to match DSP decoder and ASRC configuration. * I.e. machine driver fixup for compressed BE is mandatory. */ memset(&fe->dpcm[fe_substream->stream].hw_params, 0, sizeof(struct snd_pcm_hw_params));
So, information about parameters is just ignored.
The only way we can setup hw_params for BE is via be_hw_params_fixup() but this function doesn't have any information from FE.
My use case is something like this:
FE: - cpu: FSL SAI DAI interface - platform: DSP - codec: dummy codec BE: - cpu: dummy - platform: dummy - codec: cs42888.
codec could handle 44100Hz and 48000Hz streams, but the BE doesn't have any way to know what is the rate cplay sets to FE.
thanks, Daniel.
Hi Daniel,
On 11/14/18 9:35 AM, Daniel Baluta wrote:
Hello,
soc_compr_set_params_fe calls dpcm_be_dai_hw_params in order to setup BE hw_params.
Is there a way to transfer parameters like for example the rate from FE to BE?
In soc_compr_set_params_fe there is this code:
- Create an empty hw_params for the BE as the machine driver must
- fix this up to match DSP decoder and ASRC configuration.
- I.e. machine driver fixup for compressed BE is mandatory.
*/ memset(&fe->dpcm[fe_substream->stream].hw_params, 0, sizeof(struct snd_pcm_hw_params));
So, information about parameters is just ignored.
The only way we can setup hw_params for BE is via be_hw_params_fixup() but this function doesn't have any information from FE.
My use case is something like this:
FE: - cpu: FSL SAI DAI interface - platform: DSP - codec: dummy codec BE: - cpu: dummy - platform: dummy - codec: cs42888.
codec could handle 44100Hz and 48000Hz streams, but the BE doesn't have any way to know what is the rate cplay sets to FE.
I don't think we planned for the case you mention, but IIRC it was intentional.
In our implementations and the non-Intel ones I am familiar with, the BE typically handles data that is mixed between PCM channels (for tone/alerts/low latency) and decompressed data. So the rate adaptation of the decoder output is handled inside the DSP and the BE is configured at a set rate. I also don't remember when was the last time we supported 44.1 kHz, maybe 2011?
You *could* add support for dynamic BE reconfigurations but then it creates a headache for the mixer usages. Not to mention that decoders support rates that the BE may not support so SRC is likely required anyways. And I forget schemes like AAC+ implicit signaling where you first have to decode before figuring out if you have valid SBR data which will result in a 2x upsampling of the output - in other words you may not necessarily know what the output frequency of the decoder is just by looking up the file so doing a configuration at the DPCM level is complicated at best.
-Pierre
On Wed, Nov 14, 2018 at 6:52 PM Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com wrote:
Hi Daniel,
On 11/14/18 9:35 AM, Daniel Baluta wrote:
Hello,
soc_compr_set_params_fe calls dpcm_be_dai_hw_params in order to setup BE hw_params.
Is there a way to transfer parameters like for example the rate from FE to BE?
In soc_compr_set_params_fe there is this code:
- Create an empty hw_params for the BE as the machine driver must
- fix this up to match DSP decoder and ASRC configuration.
- I.e. machine driver fixup for compressed BE is mandatory.
*/ memset(&fe->dpcm[fe_substream->stream].hw_params, 0, sizeof(struct snd_pcm_hw_params));
So, information about parameters is just ignored.
The only way we can setup hw_params for BE is via be_hw_params_fixup() but this function doesn't have any information from FE.
My use case is something like this:
FE: - cpu: FSL SAI DAI interface - platform: DSP - codec: dummy codec BE: - cpu: dummy - platform: dummy - codec: cs42888.
codec could handle 44100Hz and 48000Hz streams, but the BE doesn't have any way to know what is the rate cplay sets to FE.
I don't think we planned for the case you mention, but IIRC it was intentional.
In our implementations and the non-Intel ones I am familiar with, the BE typically handles data that is mixed between PCM channels (for tone/alerts/low latency) and decompressed data. So the rate adaptation of the decoder output is handled inside the DSP and the BE is configured at a set rate. I also don't remember when was the last time we supported 44.1 kHz, maybe 2011?
Got your point. I will use (A)SRC to handle the rate conversion.
Thanks a lot Pierre!
Daniel.
participants (3)
-
Daniel Baluta
-
Daniel Baluta
-
Pierre-Louis Bossart