[alsa-devel] [PATCH v2] ASoC: sun4i-codec: fix first delay on Speaker
Allwinner DAC seems to have a delay in the Speaker audio routing. When playing a sound for the first time, the sound gets chopped. On a second play the sound is played correctly. After some time (~5s) the issue gets back.
This commit seems to be fixing the same issue as bf14da7 but for another codepath.
This is the DTS that was used to debug the problem.
&codec { allwinner,pa-gpios = <&r_pio 0 11 GPIO_ACTIVE_HIGH>; /* PL11 */ allwinner,audio-routing = "Speaker", "LINEOUT";
status = "okay"; }
Signed-off-by: Georgii Staroselskii georgii.staroselskii@emlid.com --- sound/soc/sunxi/sun4i-codec.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c index f2deffe..9e1f00e 100644 --- a/sound/soc/sunxi/sun4i-codec.c +++ b/sound/soc/sunxi/sun4i-codec.c @@ -1320,6 +1320,15 @@ static int sun4i_codec_spk_event(struct snd_soc_dapm_widget *w, gpiod_set_value_cansleep(scodec->gpio_pa, !!SND_SOC_DAPM_EVENT_ON(event));
+ if (SND_SOC_DAPM_EVENT_ON(event)) { + /* + * Need a delay to wait for DAC to push the data. 700ms seems + * to be the best compromise not to feel this delay while + * playing a sound. + */ + msleep(700); + } + return 0; }
On Tue, May 28, 2019 at 6:48 PM Georgii Staroselskii georgii.staroselskii@emlid.com wrote:
Allwinner DAC seems to have a delay in the Speaker audio routing. When playing a sound for the first time, the sound gets chopped. On a second play the sound is played correctly. After some time (~5s) the issue gets back.
FYI that is DAPM powering down the amp. You'll here a light pop when that happens.
This commit seems to be fixing the same issue as bf14da7 but for another codepath.
This is the DTS that was used to debug the problem.
&codec { allwinner,pa-gpios = <&r_pio 0 11 GPIO_ACTIVE_HIGH>; /* PL11 */ allwinner,audio-routing = "Speaker", "LINEOUT";
status = "okay";
}
Signed-off-by: Georgii Staroselskii georgii.staroselskii@emlid.com
sound/soc/sunxi/sun4i-codec.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c index f2deffe..9e1f00e 100644 --- a/sound/soc/sunxi/sun4i-codec.c +++ b/sound/soc/sunxi/sun4i-codec.c @@ -1320,6 +1320,15 @@ static int sun4i_codec_spk_event(struct snd_soc_dapm_widget *w, gpiod_set_value_cansleep(scodec->gpio_pa, !!SND_SOC_DAPM_EVENT_ON(event));
if (SND_SOC_DAPM_EVENT_ON(event)) {
/*
* Need a delay to wait for DAC to push the data. 700ms seems
* to be the best compromise not to feel this delay while
* playing a sound.
It is not that the DAC is not pushing data, it's just the internal headphone amp needs some time to charge up. So this patch basically adds a delay before sound is actually pushed out, thereby preventing any sound from being silently dropped. It doesn't help with the pop on power down though, and the latency might not be that great.
I wonder if we shouldn't just keep the amplifier section powered up all the time. Also it seems not very many codec drivers go all out with DAPM.
Mark, any suggestions on the matter?
ChenYu
*/
msleep(700);
}
return 0;
}
-- 2.7.4
On Wed, May 29, 2019 at 10:34:25AM +0800, Chen-Yu Tsai wrote:
I wonder if we shouldn't just keep the amplifier section powered up all the time. Also it seems not very many codec drivers go all out with DAPM.
Leaving the amplifier powered up all the time is going to burn a lot of power and make any pop/click issues in the inputs more apparent.
On Wed, May 29, 2019 at 6:28 PM Mark Brown broonie@kernel.org wrote:
On Wed, May 29, 2019 at 10:34:25AM +0800, Chen-Yu Tsai wrote:
I wonder if we shouldn't just keep the amplifier section powered up all the time. Also it seems not very many codec drivers go all out with DAPM.
Leaving the amplifier powered up all the time is going to burn a lot of power and make any pop/click issues in the inputs more apparent.
Sounds like this patch is a better compromise. Thanks for the insight.
The patch is
Reviewed-by: Chen-Yu Tsai wens@csie.org
The patch
ASoC: sun4i-codec: fix first delay on Speaker
has been applied to the asoc tree at
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-5.2
All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying to this mail.
Thanks, Mark
From 1f2675f6655838aaf910f911fd0abc821e3ff3df Mon Sep 17 00:00:00 2001
From: Georgii Staroselskii georgii.staroselskii@emlid.com Date: Tue, 28 May 2019 13:47:39 +0300 Subject: [PATCH] ASoC: sun4i-codec: fix first delay on Speaker
Allwinner DAC seems to have a delay in the Speaker audio routing. When playing a sound for the first time, the sound gets chopped. On a second play the sound is played correctly. After some time (~5s) the issue gets back.
This commit seems to be fixing the same issue as bf14da7 but for another codepath.
This is the DTS that was used to debug the problem.
&codec { allwinner,pa-gpios = <&r_pio 0 11 GPIO_ACTIVE_HIGH>; /* PL11 */ allwinner,audio-routing = "Speaker", "LINEOUT";
status = "okay"; }
Signed-off-by: Georgii Staroselskii georgii.staroselskii@emlid.com Reviewed-by: Chen-Yu Tsai wens@csie.org Signed-off-by: Mark Brown broonie@kernel.org --- sound/soc/sunxi/sun4i-codec.c | 9 +++++++++ 1 file changed, 9 insertions(+)
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c index 15d08e343b47..28d2f7713f8d 100644 --- a/sound/soc/sunxi/sun4i-codec.c +++ b/sound/soc/sunxi/sun4i-codec.c @@ -1329,6 +1329,15 @@ static int sun4i_codec_spk_event(struct snd_soc_dapm_widget *w, gpiod_set_value_cansleep(scodec->gpio_pa, !!SND_SOC_DAPM_EVENT_ON(event));
+ if (SND_SOC_DAPM_EVENT_ON(event)) { + /* + * Need a delay to wait for DAC to push the data. 700ms seems + * to be the best compromise not to feel this delay while + * playing a sound. + */ + msleep(700); + } + return 0; }
participants (3)
-
Chen-Yu Tsai
-
Georgii Staroselskii
-
Mark Brown