[vlc-devel] [PATCH 0/8] asynchronous aout stream

Remi Denis-Courmont remi at remlab.net
Sun Mar 10 17:08:35 CET 2019


Le 2019-03-10 10:10, Thomas Guillem a écrit :
> On Sat, Mar 9, 2019, at 19:09, Rémi Denis-Courmont wrote:
>> Le perjantaina 8. maaliskuuta 2019, 17.24.38 EET Thomas Guillem a 
>> écrit :
>> > Hello,
>> >
>> > This patch set should be applied on top of my clock branch:
>> > https://code.videolan.org/jbk/vlc/commits/clock-core/32
>> >
>> > All aout stream commands are now asynchronous.
>> >
>> > From an aout module point view, this mean that play/drain/flush/start/stop
>> > are always executed from the same thread.
>> 
>> This is not a promise that should be made. If/when audio decoder or 
>> filter get
>> threaded, it will not be reasonable to provide such guarantee any 
>> longer. It
>> wouldn't be the first or even the second time that we shoot ourselves 
>> in the
>> feet with that silly API guarantee.
> 
> OK but these calls need to be protected with a mutex. It is possible
> now to call flush and play from 2 threads without a protection.

It is the caller's responsibility that this does not happen. Adding a 
mutex will not change that: flusing and playing at the same time makes 
no sense.

I fail to see a problem here.

>> If you don't want Play to block, you need to implement it that way in 
>> the
>> individual plugins. You cannot cheat your way out of that with core 
>> changes.
>> However, again, this will break flow control, so it does not seem like 
>> a good
>> idea anyhow.
> 
> It's quite easy to make the play not blocking. Modules should be able
> to return the same block with an offsert change, corresponding to data
> to written.

Well that's one way. Another way is to queue inside the aout plugin, 
which does not involve changing the Play() calling convention.

But anyway, the points are:
1) It cannot be done (entirely) in the core without changing plugins.
2) It cannot be done unless/until another mechanism handles flow 
control.
3) Adding yet another thread in the pipeline does not help with this.

>> And if you don't want Flush to block, then you actually need to change 
>> the
>> plugin API so that we know when the buffers are drained/flushed. You 
>> cannot
>> cheat your way out if it either
> 
> I'm not sure that all audio API provide a way to have a
> async/nonblocking drain. I will check tomorrow.

If an aout plugin does not support asynchronous flush/drain, nor can be 
made reentrant, then it's unfixable in the sense that draining or 
flushing will involve a latency. This patch series will not fix what's 
unfixable.

-- 
Rémi Denis-Courmont


More information about the vlc-devel mailing list