On Tue, 16 Jun 2020, Takashi Iwai wrote: > 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. Poll felt intuitive to me; maybe from FreeBSD where network drivers can poll on a timer instead of interrupts. I do know about poll(), though. How about snd_echo_update_substream()? > > +{ > > + 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.) I believe it does, since (small - big) as unsigned gives small value. And period is checked only for equality (not greater than). I'll add a comment as such. I have run it with long streams. Would it be clearer, or should it be that buffer_bytes to "unsigned"? Though size_t conveys that it is a byte length, in memory. In general I haven't deviated from existing code without need to, so I inherited these types. The same goes for the pattern of calculating "step" with unsigned values, and then using a loop to wrap it to the buffer: while (pipe->position >= buffer_bytes) pipe->position -= buffer_bytes; I've assumed this was a recognised pattern in ALSA code, preferred over modulus. -- Mark