[alsa-devel] More snd_pcm_ioplug_avail_update() questions

Takashi Iwai tiwai at suse.de
Thu Jul 26 17:14:34 CEST 2018


On Thu, 26 Jul 2018 17:02:33 +0200,
Rob Duncan wrote:
> 
> 
> At 07:37 on Thu, Jul 26 2018, Takashi wrote:
> > OK, I seem to have misunderstood about what you meant as committed in
> > the context.  Yes, if the available is partial, it might be not
> > committed.  But I don't understand the next part.
> >
> > How will it be discarded at the next snd_pcm_ioplug_avail_update()?
> > The data remains on the buffer, and applptr isn't changed.
> 
> Yes, that's the problem.  Because when snd_pcm_ioplug_avail_update() is
> subsequently called it uses snd_pcm_mmap_begin() to get the offset into
> the mmap for the destination of the capture transfer operation.  This is
> essentially appl_ptr, which means that the data that has not yet been
> commited will be overwritten by the transfer.

OK, point taken.  Yeah, if the ioplug driver expects that the transfer
happens only once, it's a problem.

> I guess that the offset could somehow be adjusted to point to after the
> uncommitted data but I don't see a straightforward way to do that.  A
> scheme along these lines would also have to adjust the size parameter
> accordingly, of course.  This would sometimes mean that we cannot
> transfer all the available data from the IO plugin.  Would that cause
> any issues?

Maybe we can track the own applptr (e.g. transfer_ptr or such) and
calculate the transfer size from it instead of snd_pcm_mmap_begin();
i.e. write some open codes of alternative snd_pcm_mmap_begin() there.

Then transfer_ptr is updated again in snd_pcm_ioplug_mmap_commit() as
well when applptr is updated.

Of course, there is a smarter way, I'd happily take another approach.


thanks,

Takashi


More information about the Alsa-devel mailing list