diff --git a/docs/random/wtay/eos3 b/docs/random/wtay/eos3 index 40d92fdaaa..abe7afda41 100644 --- a/docs/random/wtay/eos3 +++ b/docs/random/wtay/eos3 @@ -198,29 +198,56 @@ case 5) and audio is playing again... - - - - - - - - - - - - - - - - - - - - - - - - +case 6) + +(-------------------------------------------------------------------------------------) +! bin ! +! (---------------) ! +! (---------------------------------------------) !audiosink ! ! +! ! thread1 ! ! ! ! +! ! (--------) (----------) (-----) ! (--------) ! ! ! +! ! !disksrc1! ! effect ! !queue! ! ! mixer ! ! ! ! +! ! ! src -- sink src -- sink src -- sink src -- sink ! ! +! ! (--------) (----------) (-----) ! ! ! ! ! ! +! (---------------------------------------------) ! ! ! ! ! +! ! ! (---------------) ! +! (---------------------------------------------) ! ! ! +! ! thread2 ! ! ! ! +! ! (--------) (----------) (-----) ! ! ! ! +! ! !disksrc2! ! effect ! !queue! ! ! ! ! +! ! ! src -- sink src -- sink src -- sink ! ! +! ! (--------) (----------) (-----) ! (--------) ! +! (---------------------------------------------) ! +(-------------------------------------------------------------------------------------) + + This is a simple audio mixer (mp3audio mixer). + We assume disksrc1 is going to be in EOS while disksrc2 is still in !EOS + +.scheduling. + + Scheduling is a bit tricky here: we have two threads with each one chain ds1-e-q and + ds2-e-q. the mixer element is loop based and forms a third chain, mixer-audiosink + +.eos. + + disksrc1 has passed the last buffer in the _get function. with its next + call to _get, it will return a NULL buffer and set the src pad to EOS. + + the EOS call travels up till the queue element because it has overridden + the handler. The first chain is disabled from the scheduler. thread1 fires EOS + because it does not have any chains to schedule. + + the mixer element pulls buffers from queue1 until queue1 is empty. At that time, + queue1 sets the pad to EOS, mixer now knows that it does not have to request + another buffer from that pad again. + + disksrc2 finally sets its pad to EOS, rendering chain2 unscheduled which makes + the thread2 fire an EOS. + + the mixer element pulls buffers from queue2 until queue2 is empty. At that time, + queue2 sets the pad to EOS, mixer now knows that it does not have to request + another buffer from that pad again. all pads for the mixer are in EOS now so + it sets the src pad to EOS. the last chain now also becomes unscheduled and + the bin fires EOS.