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() ); } } }); }
/// <summary> /// Stops playback on all initialized streams. /// </summary> public void Stop() { logger.Info(""); var state = player.GetState(); if (state != ESPlayer.ESPlayerState.Paused && state != ESPlayer.ESPlayerState.Playing) { return; } try { bufferController.EnableEvents(StreamBufferEvent.None); DisableTransfer(); StopClockGenerator(); player.Stop(); stateChangedSubject.OnNext(PlayerState.Idle); } catch (InvalidOperationException ioe) { logger.Error(ioe); } }
public void BufferOnOffEventsFromMultipleSources() { Assert.DoesNotThrowAsync( async() => { using (var bufferController = new StreamBufferController(Observable.Return <PlayerState>(PlayerState.Playing))) { bufferController.Initialize(StreamType.Audio); bufferController.Initialize(StreamType.Video); var eventCount = 0; var eventOnCount = 0; var eventOffCount = 0; var bufferState = false; using (bufferController.BufferingStateChanged() .Subscribe(a => { eventCount++; if (a) { eventOnCount++; } else { eventOffCount++; } bufferState = 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) ); await Task.WhenAll( bufferController.PullPackets(audio), bufferController.PullPackets(video) ); SpinWait.SpinUntil(() => eventOnCount > 0, TimeSpan.FromSeconds(2)); Assert.IsTrue(eventOnCount == 1, $"Expected: eventOnCount==1 Result: eventOnCount=={eventOnCount}"); Assert.IsTrue(eventOffCount == 0, $"Expected: eventOffCount==0 Result: eventOffCount=={eventOffCount}"); Assert.IsTrue(bufferState, $"Expected: bufferState==true Result bufferState=={bufferState}"); bufferController.EnableEvents(StreamBufferEvents.StreamBufferEvent.None); bufferController.ResetBuffers(); bufferController.EnableEvents(StreamBufferEvents.StreamBufferEvent.All); await bufferController.PushPackets(video); await Task.Delay(TimeSpan.FromSeconds(1.5)); Assert.IsTrue(eventOnCount == 1, $"Expected: eventOnCount==1 Result: eventOnCount=={eventOnCount}"); Assert.IsTrue(eventOffCount == 0, $"Expected: eventOffCount==0 Result: eventOffCount=={eventOffCount}"); Assert.IsTrue(bufferState, $"Expected: bufferState==true Result bufferState=={bufferState}"); await bufferController.PushPackets(audio); SpinWait.SpinUntil(() => eventOnCount > 0 && eventOffCount > 0, TimeSpan.FromSeconds(2)); Assert.IsTrue(eventOnCount == 1, $"Expected: eventOnCount==1 Result: eventOnCount=={eventOnCount}"); Assert.IsTrue(eventOffCount == 1, $"Expected: eventOffCount==1 Result: eventOffCount=={eventOffCount}"); Assert.IsTrue(!bufferState, $"Expected: bufferState==false Result bufferState=={bufferState}"); await Task.WhenAll( audio.DisposePackets(), video.DisposePackets() ); } } }); }