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 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"); } }