[alsa-devel] ALSA framework problem: FE disconnected, BE still connected!
lkasam at codeaurora.org
lkasam at codeaurora.org
Thu Apr 18 18:56:25 CEST 2013
Hi Liam,
We have a problem encountered in ALSA framework wrt FE/BE disconnection and
fix to it is mentioned in below code change. please check it and provide
your valuable comments.
----------------------
From: Laxminath Kasam <lkasam at codeaurora.org>
Date: Wed, 3 Apr 2013 14:03:17 +0530
Subject: [PATCH] ASoC: audio: Fix BE not disconnected even codec teardown
Scenario:
When FE1(LowLatency) comes in which opens BE1 and puts it in state
SND_SOC_DPCM_STATE_START. Similarly FE2(LPA) comes in with
connecting to same BE. Now FE2 is in SND_SOC_DPCM_STATE_PREPARE
state and waits for TRIGGER_START. Meanwhile FE1 is closed which
doesn't affect BE1 and FE2 which are connected.
Also, for FE2 pcm_close is called before TRIGGER_START itself.
In such a case, BE1 is not getting disconnected while Codec is teared
down resulting in failures.
Fix:
Whenever BE1 is found to be in SND_SOC_DPCM_STATE_START state
and FE1 being connected is not started yet, and close sequence
happens for this FE, then allow hw_free to happen for BE1 if
this is the only FE connected to this BE1. This allows BE to be
disconnected which calls afe_close then followed by Codec teardown
not resulting in any failures.
Signed-off-by: Laxminath Kasam <lkasam at codeaurora.org>
---
sound/soc/soc-pcm.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 915c3c2..ed0ea86 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -1765,7 +1765,12 @@ static int soc_dpcm_be_dai_hw_free(struct
snd_soc_pcm_runtime *fe, int stream)
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PREPARE) &&
(be->dpcm[stream].state !=
SND_SOC_DPCM_STATE_HW_FREE) &&
(be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED) &&
- (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP))
+ (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
+ !((be->dpcm[stream].state == SND_SOC_DPCM_STATE_START)&&
+ ((fe->dpcm[stream].state !=
SND_SOC_DPCM_STATE_START) &&
+ (fe->dpcm[stream].state !=
SND_SOC_DPCM_STATE_PAUSED) &&
+ (fe->dpcm[stream].state !=
+
SND_SOC_DPCM_STATE_SUSPEND))))
continue;
dev_dbg(be->dev, "dpcm: hw_free BE %s\n",
--
-----------------------------------------
Please let me know if you are looking for more details.
Thanks
Kasam
More information about the Alsa-devel
mailing list