• Henrik Eriksson's avatar
    ALSA: pcm: update tstamp only if audio_tstamp changed · 20e3f985
    Henrik Eriksson authored
    commit 3179f620 ("ALSA: core: add .get_time_info") had a side effect
    of changing the behaviour of the PCM runtime tstamp.  Prior to this
    change tstamp was not updated by snd_pcm_update_hw_ptr0() unless the
    hw_ptr had moved, after this change tstamp was always updated.
    
    For an application using alsa-lib, doing snd_pcm_readi() followed by
    snd_pcm_status() to estimate the age of the read samples by subtracting
    status->avail * [sample rate] from status->tstamp this change degraded
    the accuracy of the estimate on devices where the pcm hw does not
    provide a granular hw_ptr, e.g., devices using
    soc-generic-dmaengine-pcm.c and a dma-engine with residue_granularity
    DMA_RESIDUE_GRANULARITY_DESCRIPTOR.  The accuracy of the estimate
    depended on the latency between the PCM hw completing a period and the
    driver called snd_pcm_period_elapsed() to notify ALSA core, typically
    determined by interrupt handling latency.  After the change the accuracy
    of the estimate depended on the latency between the PCM hw completing a
    period and the application calling snd_pcm_status(), determined by the
    scheduling of the application process.  The maximum error of the
    estimate is one period length in both cases, but the error average and
    variance is smaller when it depends on interrupt latency.
    
    Instead of always updating tstamp, update it only if audio_tstamp
    changed.
    
    Fixes: 3179f620 ("ALSA: core: add .get_time_info")
    Suggested-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: default avatarHenrik Eriksson <henrik.eriksson@axis.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    20e3f985
pcm_lib.c 67.5 KB