[PATCH] ASoC: soc-pcm: Revert "call snd_soc_component_open/close() once"
Kuninori Morimoto
kuninori.morimoto.gx at renesas.com
Fri Feb 28 08:57:43 CET 2020
Hi Kai, again, and, again
> > start(substream-A); <=
> > start(substream-B);
> > start(substream-C);
> >
> > stop(substream-Z); <=
> > stop(substream-B);
> > stop(substream-C);
(snip)
> Ohh, yes indeed !! I was confused.
> But Hmm... I don't want to have substream list on each component...
> Hmm... I will re-consider it again.
I don't want to have substream list on each components,
and keep simple code as much as possible.
My current idea is using ID. What do you think ?
It is not super simple though...
int soc_pcm_components_open(struct snd_pcm_substream *substream, u8 id)
{
int ret = 0;
/*
* Add ID to each component to know "which open".
*/
for_each_rtd_components(rtd, i, component) {
if (component->driver->open) {
ret = component->driver->open(component, substream);
if (ret < 0)
return ret;
component->open_id = id; /* add ID */
}
}
return 0;
}
int soc_pcm_components_close(struct snd_pcm_substream *substream, u8 id)
{
/*
* if ID > 0, it is only target.
* if ID == 0, all components are the target
*/
for_each_rtd_components(rtd, i, component) {
if ((id == 0 ||
id == component->open_id) &&
component->driver->close)
component->driver->close(component, substream);
}
...
}
=> int soc_pcm_clear(..., u8 id)
{
...
/*
* if ID > 0, it is only target.
* if ID == 0, all components are the target
*/
soc_pcm_components_close(substream, id);
...
}
int soc_pcm_close(...)
{
/*
* ID = 0
* All components are target of close
*/
=> soc_pcm_clear(xxx, 0);
}
int soc_pcm_open(...)
{
static u8 id;
/* update ID */
id++;
if (id == 0)
id++;
...
ret = soc_pcm_components_open(substream, id);
if (ret < 0)
goto open_err;
...
return 0; /* success */
open_err:
/*
* ID = id
* Only this IDs are the target
*/
=> soc_pcm_clear(xxx, id)
return ret;
}
Thank you for your help !!
Best regards
---
Kuninori Morimoto
More information about the Alsa-devel
mailing list