On Tue, 16 Jun 2020 15:17:43 +0200, Mark Hills wrote: > > +/* Update software pointer to match the hardware > + * > + * Return: 1 if we crossed a period threshold, otherwise 0 > + */ > +static int snd_echo_poll_substream(struct snd_pcm_substream *substream) This is a bit confusing name. One would imagine from the function name as if it were about the handling of poll() syscall. > +{ > + struct snd_pcm_runtime *runtime = substream->runtime; > + struct audiopipe *pipe = runtime->private_data; > + unsigned counter, step, period, last_period; > + size_t buffer_bytes; > + > + if (pipe->state != PIPE_STATE_STARTED) > + return 0; > + > + counter = le32_to_cpu(*pipe->dma_counter); > + > + period = bytes_to_frames(runtime, counter) > + / runtime->period_size; > + last_period = bytes_to_frames(runtime, pipe->last_counter) > + / runtime->period_size; > + > + if (period == last_period) > + return 0; /* don't do any work yet */ > + > + step = counter - pipe->last_counter; > + pipe->last_counter = counter; Dose this calculation consider the overlap of 32bit integer of the counter? (I'm not sure whether the old code did it right, though.) thanks, Takashi