예제 #1
0
        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()
                            );
                    }
                }
            });
        }
예제 #2
0
        public async Task Seek(TimeSpan time)
        {
            logger.Info("");
            var token = activeTaskCts.Token;

            try
            {
                bufferController.EnableEvents(StreamBufferEvent.DataRequest);
                bufferController.ReportFullBuffer();
                bufferController.PublishBufferState();
                // Make sure buffer publication is delivered.
                await Task.Yield();

                bufferController.EnableEvents(StreamBufferEvent.None);

                await SeekStreamInitialize(token);

                bufferController.ResetBuffers();

                time = await Client.Seek(time, token);

                bufferController.ReportActualBuffer();
                bufferController.EnableEvents(StreamBufferEvent.DataRequest);
                bufferController.PublishBufferState();
                // Make sure buffer publication is delivered.
                await Task.Yield();
                await StreamSeek(time, token);

                bufferController.EnableEvents(StreamBufferEvent.All);
            }
            catch (SeekException e)
            {
                logger.Error(e);
                playbackErrorSubject.OnNext($"Seek Failed, reason \"{e.Message}\"");
                throw;
            }
            catch (OperationCanceledException)
            {
                logger.Info("Operation Cancelled");
            }
            catch (Exception e)
            {
                logger.Error(e);
                playbackErrorSubject.OnNext("Seek Failed");
            }
        }