Re: [PATCH 01/13] ASoC: soc-pcm: Don't reconnect an already active BE
From: Pierre-Louis Bossart
Date: Thu Sep 30 2021 - 12:14:00 EST
>>>> Can you describe the sequence that you used to start them? That may be
>>>> useful to understand the criteria you used?
>>> I have something like this:
>>>
>>> FE1 --> Crossbar -> Mixer Input1 |
>>> FE2 --> Crossbar -> Mixer Input2 |
>>> ... | --> Mixer Output -->
>>> ... |
>>> FE10 --> Crossbar -> Mixer Input10 |
>>>
>>> All these FEs are started one after the other. This is an example of
>>> 10x1. Similarly we can have 2x1, 3x1 etc.,
>>> In our system, the crossbar [0] and mixer [1] are separate ASoC
>>> components. Basically audio paths consist of a group of ASoC components
>>> which are connected back to back.
>> Not following. Can you explain how starting FE1 does not change the
>> state of the mixer output then?
>>
>> Or is each 'Crossbar' instance a full-blown BE? In that case you have a
>> 1:1 mapping between FE and BE, a *really* simple topology...
>
> Yes 'Crossbar' exposes multiple ports and it is 1:1 mapping with FE.
> Starting FE1 does configure mixer output.
Ah ok, now I get the difference with the N:1 topology we used.
Thanks for explaining this.
>>> In the interim, may be we can have following patch to keep both systems
>>> working and keep the discussion going to address the oustanding
>>> requirements/issues?
>>>
>>> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
>>> index ab25f99..0fbab50 100644
>>> --- a/sound/soc/soc-pcm.c
>>> +++ b/sound/soc/soc-pcm.c
>>> @@ -1395,7 +1395,13 @@ static int dpcm_add_paths(struct
>>> snd_soc_pcm_runtime *fe, int stream,
>>> if (!fe->dpcm[stream].runtime && !fe->fe_compr)
>>> continue;
>>>
>>> - if ((be->dpcm[stream].state !=
>>> SND_SOC_DPCM_STATE_NEW) &&
>>> + /*
>>> + * Filter for systems with 'component_chaining' enabled.
>>> + * This helps to avoid unnecessary re-configuration
>>> of an
>>> + * already active BE on such systems.
>>> + */
>>> + if (fe->card->component_chaining &&
>>> + (be->dpcm[stream].state !=
>>> SND_SOC_DPCM_STATE_NEW) &&
>>> (be->dpcm[stream].state !=
>>> SND_SOC_DPCM_STATE_CLOSE))
>>> continue;
>> that wouldn't work. We need to support the STOP and START cases as well.
>>
>
> I meant with flag 'fe->card->component_chaining', which is currently
> used by Tegra audio only.
Ah yes, this may be a temporary solution that gets us both back to a
'working solution'. Let me give it a try.
Good discussion, thanks!
-Pierre