static bool TickCb() { if (_sinks.Count == 0 || random.Next() % 2 == 0) { SinkStruct sink = new SinkStruct(); PadTemplate templ = _tee.GetPadTemplate("src_%u"); Console.Write("Add ... "); sink.teePad = _tee.RequestPad(templ); sink.queue = ElementFactory.Make("queue"); sink.conv = ElementFactory.Make("videoconvert"); sink.sink = ElementFactory.Make("autovideosink"); sink.removing = 0; _pipeline.Add(sink.queue, sink.conv, sink.sink); if (!Element.Link(sink.queue, sink.conv, sink.sink)) { "Cannot link elements".PrintErr(); return(false); } sink.queue.SyncStateWithParent(); sink.conv.SyncStateWithParent(); sink.sink.SyncStateWithParent(); using (var sinkPad = sink.queue.GetStaticPad("sink")) { sink.teePad.Link(sinkPad); } Console.WriteLine("added"); _sinks.AddLast(sink); } else { Console.Write("remove ... "); var sink = _sinks.Last.Value; _sinks.RemoveLast(); sink.teePad.AddProbe(PadProbeType.Idle, GetUnlinkCb(sink)); } return(true); }
static PadProbeCallback GetUnlinkCb(object userData) { SinkStruct sink = (SinkStruct)userData; PadProbeReturn UnlinkCb(Pad pad, PadProbeInfo info) { if (Interlocked.CompareExchange(ref sink.removing, 0, 1) == 1) { return(PadProbeReturn.Ok); } using (var sinkPad = sink.queue.GetStaticPad("sink")) { sink.teePad.Unlink(sinkPad); } _pipeline.Remove(sink.queue); _pipeline.Remove(sink.conv); _pipeline.Remove(sink.sink); sink.sink.SetState(State.Null); sink.conv.SetState(State.Null); sink.queue.SetState(State.Null); sink.queue.Dispose(); sink.conv.Dispose(); sink.sink.Dispose(); _tee.ReleaseRequestPad(sink.teePad); sink.teePad.Dispose(); Console.WriteLine("removed"); return(PadProbeReturn.Remove); } return(UnlinkCb); }