Пример #1
0
        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);
            }
        }
Пример #3
0
        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()
                            );
                    }
                }
            });
        }