[PATCH 1/2] pcm: hw: reinterpret the drain_silence setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



It makes no sense to have a config option which determines the entire
silencing time, because useful values strongly depend on the period size
runtime setting.

So instead we interpret the setting as an override for the "overhang"
which is used to compensate FIFOs and IRQ delays. The reasonable worst
case of this is determined by the hardware, so it makes sense to have
this as a config option.

In a next step, we may want to derive the default value from the
declared FIFO size (whiche few drivers do) and the minimal period size
(which is generally linked to the FIFO size).

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@xxxxxx>
---
 src/pcm/pcm_hw.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c
index 8ffebed9..ecc47a76 100644
--- a/src/pcm/pcm_hw.c
+++ b/src/pcm/pcm_hw.c
@@ -737,18 +737,19 @@ static int snd_pcm_hw_drain(snd_pcm_t *pcm)
 {
 	snd_pcm_hw_t *hw = pcm->private_data;
 	snd_pcm_sw_params_t sw_params;
+	snd_pcm_uframes_t silence_slack;
 	snd_pcm_uframes_t silence_size;
 	int err;
 
 	if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
 		goto __skip_silence;
 	if (hw->drain_silence == 0 || hw->perfect_drain)
 		goto __skip_silence;
 	snd_pcm_sw_params_current_no_lock(pcm, &sw_params);
-	if (hw->drain_silence > 0) {
-		silence_size = (pcm->rate * hw->drain_silence) / 1000;
-		goto __manual_silence;
-	}
+	if (hw->drain_silence > 0)
+		silence_slack = (pcm->rate * hw->drain_silence) / 1000;
+	else
+		silence_slack = pcm->rate / 10;	/* 1/10th of second */
 	/* compute end silence size, align to period size + extra time */
 	if ((pcm->boundary % pcm->period_size) == 0) {
 		silence_size = pcm->period_size - (*pcm->appl.ptr % pcm->period_size);
@@ -761,8 +762,7 @@ static int snd_pcm_hw_drain(snd_pcm_t *pcm)
 		 */
 		silence_size = pcm->period_size;
 	}
-	silence_size += pcm->rate / 10;	/* 1/10th of second */
-__manual_silence:
+	silence_size += silence_slack;
 	if (sw_params.silence_size < silence_size) {
 		/* fill the silence soon as possible (in the bellow ioctl
 		 * or the next period wake up)
-- 
2.40.0.152.g15d061e6df




[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux