[alsa-devel] [PATCH] ALSA: hda - Apply codec delay to wallclock.
Dylan Reid
dgreid at chromium.org
Sat Apr 6 02:22:04 CEST 2013
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 at 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);
--
1.8.1.3.605.g02339dd
More information about the Alsa-devel
mailing list