For playback add the codec-side delay to the timestamp, for capture subtract it. This brings the timestamps in line with the time that was recently added to the delay reporting.
Signed-off-by: Dylan Reid dgreid@chromium.org --- sound/pci/hda/hda_intel.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 735567e..ec8ac71 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c @@ -1889,6 +1889,27 @@ static void azx_timecounter_init(struct snd_pcm_substream *substream, tc->cycle_last = last; }
+static u64 azx_add_codec_delay_nsec(struct snd_pcm_substream *substream, + u64 nsec) +{ + struct azx_pcm *apcm = snd_pcm_substream_chip(substream); + int stream = substream->stream; + struct hda_pcm_stream *hinfo = apcm->hinfo[stream]; + struct hda_codec *codec = apcm->codec; + u64 codec_nsec; + + if (hinfo->ops.get_delay) { + codec_nsec = + hinfo->ops.get_delay(hinfo, codec, substream) * 1000000; + if (stream == SNDRV_PCM_STREAM_CAPTURE) + nsec = (nsec > codec_nsec) ? nsec - codec_nsec : 0; + else if (stream == SNDRV_PCM_STREAM_PLAYBACK) + nsec += codec_nsec; + } + + return nsec; +} + static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream, struct timespec *ts) { @@ -1897,6 +1918,7 @@ static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
nsec = timecounter_read(&azx_dev->azx_tc); nsec = div_u64(nsec, 3); /* can be optimized */ + nsec = azx_add_codec_delay_nsec(substream, nsec);
*ts = ns_to_timespec(nsec);