[alsa-devel] [PATCH v2] ALSA: hda - Apply codec delay to wallclock.

Takashi Iwai tiwai at suse.de
Tue Apr 9 08:03:46 CEST 2013


At Mon,  8 Apr 2013 18:20:30 -0700,
Dylan Reid wrote:
> 
> 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>

Thanks, applied now.


Takashi
> ---
> Changes since v1:
> Calculate nsec from frames, subtract delay for playback as well as
> capture.
> 
>  sound/pci/hda/hda_intel.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 735567e..3e6f2c6 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1889,6 +1889,23 @@ static void azx_timecounter_init(struct snd_pcm_substream *substream,
>  		tc->cycle_last = last;
>  }
>  
> +static u64 azx_subtract_codec_delay(struct snd_pcm_substream *substream,
> +				u64 nsec)
> +{
> +	struct azx_pcm *apcm = snd_pcm_substream_chip(substream);
> +	struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream];
> +	u64 codec_frames, codec_nsecs;
> +
> +	if (!hinfo->ops.get_delay)
> +		return nsec;
> +
> +	codec_frames = hinfo->ops.get_delay(hinfo, apcm->codec, substream);
> +	codec_nsecs = div_u64(codec_frames * 1000000000LL,
> +			      substream->runtime->rate);
> +
> +	return (nsec > codec_nsecs) ? nsec - codec_nsecs : 0;
> +}
> +
>  static int azx_get_wallclock_tstamp(struct snd_pcm_substream *substream,
>  				struct timespec *ts)
>  {
> @@ -1897,6 +1914,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_subtract_codec_delay(substream, nsec);
>  
>  	*ts = ns_to_timespec(nsec);
>  
> -- 
> 1.8.1.3.605.g02339dd
> 


More information about the Alsa-devel mailing list