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

Dylan Reid dgreid at chromium.org
Mon Apr 8 17:44:12 CEST 2013


On Sun, Apr 7, 2013 at 12:41 AM, Takashi Iwai <tiwai at suse.de> wrote:
> 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 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;
>
> 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.
>

OK, I was thinking of the timestamp as the wall time when the next
sample will be played.  If it represents the time the currently
rendered sample was fed into the pipeline, this makes sense, I'll
change it to subtract for output.  In this case, what does it mean for
input?  I was thinking of it as the time the sample was converted by
the A-to-D.

Thanks,

-dg

>
> 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
>>


More information about the Alsa-devel mailing list