[alsa-devel] DPCM: skip DAPM_STREAM_STOP event to BE, if still used by other FE
Hi, Let me illustrate the system first. FE1 -----+----> BE | FE2 -----+
When there is multi-FE stream to a single BE, the BE will receive SND_SOC_DAPM_STREAM_STOP if one of the FE shutdown. However, the BE is stilled used by another, this will let BE cpu_dai and codec_dai think they are inactive. The later power check will go wrong.
I have check the latest linux version, and didn't find any related change. The following is my change to address this, and will re-send a formal patch if it's ok.
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 70e8088..9c2d159 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -163,6 +163,13 @@ int dpcm_dapm_stream_event(struct snd_soc_pcm_runtime *fe, int dir, dev_dbg(be->dev, "ASoC: BE %s event %d dir %d\n", be->dai_link->name, event, dir);
+ /* don't sent stop event if this BE is used by other FE */ + if (event == SND_SOC_DAPM_STREAM_STOP && + be->dpcm[dir].users >= 1) { + pr_warn("kc, %s(), be->dai_link->name %s skip stop event\n", __func__, be->dai_link->name); + continue; + } + snd_soc_dapm_stream_event(be, dir, event); }
Sincerely, Kai Chieh
On Tue, May 31, 2016 at 01:45:32PM +0800, Kai Chieh Chuang wrote:
/* don't sent stop event if this BE is used by other FE */
if (event == SND_SOC_DAPM_STREAM_STOP &&
be->dpcm[dir].users >= 1) {
pr_warn("kc, %s(), be->dai_link->name %s skip stop event\n",
__func__, be->dai_link->name);
continue;
}
- snd_soc_dapm_stream_event(be, dir, event); }
If this isn't happening that seems like a bug, I'm a bit surprised nobody else ran into it? Shouldn't the counts of stream events that happen be symmetric (ie, we get as many stops as starts), or are we possibly missing some from things being switched in and out or something?
participants (2)
-
Kai Chieh Chuang
-
Mark Brown