summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Chini <georg@chini.tk>2018-05-04 21:10:46 +0200
committerTanu Kaskinen <tanuk@iki.fi>2018-05-11 11:11:38 +0300
commitb32705a5d48e9fd022d406c5a803f5bf1585ce51 (patch)
tree5a80bf1bb884621850d26b4b4c83f9fd5a3ca648
parent3b04539d5ee3c8a67c5a10c1b8ac87544ed58180 (diff)
downloadpulseaudio-b32705a5d48e9fd022d406c5a803f5bf1585ce51.tar.gz
alsa-util: Set ALSA report_delay flag in pa_alsa_safe_delay()
The current code does not call snd_pcm_status_set_audio_htstamp_config() to configure the way timestamps are updated in ALSA. In kernel 4.14 and above a bug in ALSA has been fixed which changes timmestamp behavior. This leads to inconsistencies in the delay reporting because the time stamp no longer reflects the time when the delay was updated if the ALSA report_delay flag is not set. Therefore latencies are not calculated correctly. This patch uses snd_pcm_status_set_audio_htstamp_config() to set the ALSA report_delay flag to 1 before the call to snd_pcm_status(). With this, time stamps are updated as expected.
-rw-r--r--src/modules/alsa/alsa-util.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 61fb4903c..b91a0e987 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -1187,6 +1187,7 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
size_t abs_k;
int err;
snd_pcm_sframes_t avail = 0;
+ snd_pcm_audio_tstamp_config_t tstamp_config;
pa_assert(pcm);
pa_assert(delay);
@@ -1200,6 +1201,12 @@ int pa_alsa_safe_delay(snd_pcm_t *pcm, snd_pcm_status_t *status, snd_pcm_sframes
* avail, delay and timestamp values in a single kernel call to improve
* timer-based scheduling */
+ /* The time stamp configuration needs to be set so that the
+ * ALSA code will use the internal delay reported by the driver */
+ tstamp_config.type_requested = 1; /* ALSA default time stamp type */
+ tstamp_config.report_delay = 1;
+ snd_pcm_status_set_audio_htstamp_config(status, &tstamp_config);
+
if ((err = snd_pcm_status(pcm, status)) < 0)
return err;