Hey, catching up with the thread :) On Fri, 28 Feb 2020, Kuninori Morimoto wrote: > > > start(substream-A); <= > > > start(substream-B); > > > start(substream-C); > > > > > > stop(substream-Z); <= > > > stop(substream-B); > > > stop(substream-C); [snip] > I don't want to have substream list on each components, > and keep simple code as much as possible. [snip] > My current idea is using ID. What do you think ? > It is not super simple though... Hmm, I think then we end up with new problems managing the IDs. Specifically: > int soc_pcm_open(...) > { > static u8 id; > > /* update ID */ > id++; > if (id == 0) > id++; ... this really isn't solid. If you have a complex scenario and something goes wrong, debugging the ids is going to be painful if they are assigned this way. I think in the end we should go back to this: int snd_soc_component_open(struct snd_soc_component *component, » » » struct snd_pcm_substream *substream) ... this essentially creates new state by assigning a new substream to the component, and we should explicitly track it. I know you wanted to avoid this, but I think in the end it's the cleanest solution and aligned to rest of ALSA. Aside cleaning up implementation of close(), this will help also in other methods, like e.g.: int snd_soc_component_prepare(struct snd_soc_component *component, » » » struct snd_pcm_substream *substream) { » if (component->driver->prepare) » » return component->driver->prepare(component, substream); » return 0; } .. if prepare() is called with a substream that is not opened for this component, we could catch it here if we were tracking substreams. Br, Kai