Re: [PATCH] ALSA: hda - Apply codec delay to wallclock.

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

 



At Fri,  5 Apr 2013 17:22:04 -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@xxxxxxxxxxxx>
> ---
>  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;

I think the compensation is applied in a wrong direction.

For the playback, the wallclock indicates the timestamp corresponding
to the position currently being played.  With the codec delay, the
position is back more, i.e. the timestamp has to be subtracted.


Takashi

> +	}
> +
> +	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
> 
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel




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

  Powered by Linux