On Sun, 11 Nov 2018 19:21:29 +0100, Mike Brady wrote: > > /* hardware definition */ > static const struct snd_pcm_hardware snd_bcm2835_playback_hw = { > .info = (SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_BLOCK_TRANSFER | > SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_MMAP_VALID | > - SNDRV_PCM_INFO_DRAIN_TRIGGER | SNDRV_PCM_INFO_SYNC_APPLPTR), > + SNDRV_PCM_INFO_BATCH | SNDRV_PCM_INFO_DRAIN_TRIGGER | > + SNDRV_PCM_INFO_SYNC_APPLPTR), As already mentioned, the addition of SNDRV_PCM_INFO_BATCH should be irrelevant with this change. Please create another patch to add this and clarify it in the changelog. > diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c > index 4e6110d778bd..574df7d7a1fa 100644 > --- a/sound/core/pcm_lib.c > +++ b/sound/core/pcm_lib.c > @@ -229,19 +229,38 @@ static void update_audio_tstamp(struct snd_pcm_substream *substream, > (runtime->audio_tstamp_report.actual_type == > SNDRV_PCM_AUDIO_TSTAMP_TYPE_DEFAULT)) { > > - /* > - * provide audio timestamp derived from pointer position > - * add delay only if requested > - */ > + // provide audio timestamp derived from pointer position > > audio_frames = runtime->hw_ptr_wrap + runtime->status->hw_ptr; > > - if (runtime->audio_tstamp_config.report_delay) { > + /* > + * If the runtime->delay is greater than zero, it's a > + * genuine delay, e.g. a delay due to a hardware fifo. > + * > + * But if the runtime->delay is less than zero, it's an > + * interpolated estimate of the number of frames output > + * since the hardware pointer was last updated. > + * > + * It would be calculated in the pointer callback. > + * For example, for the bcm_2835 driver, it is calculated in > + * snd_bcm2835_pcm_pointer(). > + */ > + > + if (runtime->delay < 0) { > + // The delay is an interpolated estimate... > if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) > - audio_frames -= runtime->delay; > - else > - audio_frames += runtime->delay; > + audio_frames += runtime->delay; > + } else { > + // The delay is a real delay. Add it if requested. > + if (runtime->audio_tstamp_config.report_delay) { > + if (substream->stream == > + SNDRV_PCM_STREAM_PLAYBACK) > + audio_frames -= runtime->delay; > + else > + audio_frames += runtime->delay; > + } > } Well, honestly speaking, I'm really not fond of changing the PCM core just for this. Can we make bcm audio driver providing the finer pointer update instead? If we have a module option to disable that behavior, it's an enough excuse in case anyone really cares about the accuracy. thanks, Takashi _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel