public void DataEventAfterSingleConfigurationChange() { Assert.DoesNotThrow( () => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var dataArgsHolder = new DataRequest[(int)StreamType.Count]; using (bufferController.DataNeededStateChanged() .Subscribe(a => { dataArgsHolder[(int)a.StreamType] = a; }, SynchronizationContext.Current)) { var conf = new MetaDataStreamConfig { Bandwidth = 123456789, BufferDuration = TimeSpan.FromSeconds(15), Stream = StreamType.Audio }; bufferController.SetMetaDataConfiguration(conf); SpinWait.SpinUntil(() => dataArgsHolder[(int)StreamType.Audio] != null, TimeSpan.FromSeconds(2)); Assert.IsTrue( dataArgsHolder[(int)StreamType.Audio].CompareMetaData(conf), $"Expected: Same Result: {conf} {dataArgsHolder[(int)StreamType.Audio]}"); } } }); }
public void NoEventsWhenEventsDisabled() { Assert.DoesNotThrowAsync( async() => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var dataArgsHolder = new DataRequest[(int)StreamType.Count]; var eventCount = 0; using (bufferController.DataNeededStateChanged() .Subscribe(a => { eventCount++; dataArgsHolder[(int)a.StreamType] = a; }, SynchronizationContext.Current)) { var audio = BuildPacketList(StreamType.Audio, TimeSpan.FromSeconds(15), 100); var video = BuildPacketList(StreamType.Video, TimeSpan.FromSeconds(15), 100); await Task.WhenAll( bufferController.PushPackets(audio), bufferController.PushPackets(video)); SpinWait.SpinUntil(() => eventCount >= 2, TimeSpan.FromSeconds(2)); await Task.WhenAll( bufferController.PullPackets(audio), bufferController.PullPackets(video)); SpinWait.SpinUntil(() => eventCount >= 4, TimeSpan.FromSeconds(2)); bufferController.EnableEvents(StreamBufferEvents.StreamBufferEvent.None); var currEventCount = eventCount; await Task.WhenAll( bufferController.PushPackets(audio), bufferController.PushPackets(video)); await Task.Delay(1500); await Task.WhenAll( bufferController.PullPackets(audio), bufferController.PullPackets(video)); await Task.Delay(1500); Assert.IsTrue(eventCount == currEventCount, $"Expected: eventCount==currEventCount Result {eventCount}!={currEventCount}"); await Task.WhenAll( audio.DisposePackets(), video.DisposePackets() ); } } }); }
public void DataEventsAfterSubscription() { Assert.DoesNotThrow( () => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var dataArgsHolder = new DataRequest[(int)StreamType.Count]; var eventCount = 0; using (bufferController.DataNeededStateChanged().Subscribe( a => { dataArgsHolder[(int)a.StreamType] = a; eventCount++; }, SynchronizationContext.Current)) { SpinWait.SpinUntil(() => eventCount == 2, TimeSpan.FromSeconds(2)); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio] != null, "dataArgsHolder[(int)StreamType.Audio] != null"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video] != null, "dataArgsHolder[(int)StreamType.Video] != null"); } } }); }
public void BufferFullBufferActualReported() { Assert.DoesNotThrowAsync( async() => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var dataArgsHolder = new DataRequest[(int)StreamType.Count]; var eventCount = 0; using (bufferController.DataNeededStateChanged() .Subscribe(a => { eventCount++; dataArgsHolder[(int)a.StreamType] = a; }, SynchronizationContext.Current)) { var audio = BuildPacketList(StreamType.Audio, TimeSpan.FromSeconds(7), 100); var video = BuildPacketList(StreamType.Video, TimeSpan.FromSeconds(7), 100); await Task.WhenAll( bufferController.PushPackets(audio), bufferController.PushPackets(video)); SpinWait.SpinUntil(() => eventCount >= 2, TimeSpan.FromSeconds(2)); var audioLevel = dataArgsHolder[(int)StreamType.Audio].Duration; var videoLevel = dataArgsHolder[(int)StreamType.Video].Duration; bufferController.ReportFullBuffer(); bufferController.PublishBufferState(); SpinWait.SpinUntil(() => eventCount >= 4, TimeSpan.FromSeconds(2)); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio].Duration == TimeSpan.Zero, $"Expected: audio Duration == 0 Result: Duration=={dataArgsHolder[(int)StreamType.Audio].Duration}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video].Duration == TimeSpan.Zero, $"Expected: video Duration == 0 Result: Duration=={dataArgsHolder[(int)StreamType.Video].Duration}"); bufferController.ReportActualBuffer(); bufferController.PublishBufferState(); SpinWait.SpinUntil(() => eventCount >= 6, TimeSpan.FromSeconds(2)); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio].Duration == audioLevel); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video].Duration == videoLevel); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio].Duration == audioLevel, $"Expected: audio Duration == {audioLevel} Result: Duration=={dataArgsHolder[(int)StreamType.Audio].Duration}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video].Duration == videoLevel, $"Expected: video Duration == {videoLevel} Result: Duration=={dataArgsHolder[(int)StreamType.Video].Duration}"); await Task.WhenAll( audio.DisposePackets(), video.DisposePackets() ); } } }); }
public void DataOffOnEventFromMultipleSources() { Assert.DoesNotThrowAsync( async() => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var dataArgsHolder = new DataRequest[(int)StreamType.Count]; var eventCount = 0; using (bufferController.DataNeededStateChanged() .Subscribe(a => { eventCount++; dataArgsHolder[(int)a.StreamType] = a; }, SynchronizationContext.Current)) { var audio = BuildPacketList(StreamType.Audio, TimeSpan.FromSeconds(15), 100); var video = BuildPacketList(StreamType.Video, TimeSpan.FromSeconds(15), 100); await Task.WhenAll( bufferController.PushPackets(audio), bufferController.PushPackets(video)); SpinWait.SpinUntil(() => eventCount >= 2, TimeSpan.FromSeconds(2)); Assert.IsTrue(eventCount >= 2, $"Expected: eventCount >=2 Result: eventCount={eventCount}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio].Duration <= TimeSpan.Zero, $"Expected: audio Duration <= 0 Result: Duration=={dataArgsHolder[(int)StreamType.Audio].Duration}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video].Duration <= TimeSpan.Zero, $"Expected: video Duration <= 0 Result: Duration=={dataArgsHolder[(int)StreamType.Video].Duration}"); await Task.WhenAll( bufferController.PullPackets(audio), bufferController.PullPackets(video)); SpinWait.SpinUntil(() => eventCount >= 4, TimeSpan.FromSeconds(2)); Assert.IsTrue(eventCount >= 4, $"Expected: eventCount >=4 Result: eventCount={eventCount}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Audio].Duration > TimeSpan.Zero, $"Expected: audio Duration > 0 Result: Duration=={dataArgsHolder[(int)StreamType.Audio].Duration}"); Assert.IsTrue(dataArgsHolder[(int)StreamType.Video].Duration > TimeSpan.Zero, $"Expected: video Duration > 0 Result: Duration=={dataArgsHolder[(int)StreamType.Video].Duration}"); await Task.WhenAll( audio.DisposePackets(), video.DisposePackets() ); } } }); }
public IObservable <DataRequest> DataNeededStateChanged() => bufferController.DataNeededStateChanged();