/// <summary> /// Sets provided configuration to appropriate stream. /// </summary> /// <param name="config">StreamConfig</param> public void SetStreamConfiguration(BufferConfigurationPacket config) { var streamType = config.StreamType; logger.Info($"{streamType}:"); try { if (config.Config is MetaDataStreamConfig metaData) { bufferController.SetMetaDataConfiguration(metaData); return; } var pushResult = esStreams[(int)streamType].SetStreamConfig(config); // Configuration queued. Do not prepare stream :) if (pushResult == EsStream.SetStreamConfigResult.ConfigQueued) { return; } // Check if all initialized streams are configured if (!AllStreamsConfigured) { return; } var token = activeTaskCts.Token; bufferController.ResetBuffers(); StreamPrepare(token); } catch (NullReferenceException) { // packetQueue can hold ALL StreamTypes, but not all of them // have to be supported. logger.Warn($"Uninitialized Stream Type {streamType}"); } catch (OperationCanceledException) { logger.Info($"{streamType}: Operation Cancelled"); } catch (ObjectDisposedException) { logger.Info($"{streamType}: Operation Cancelled and disposed"); } catch (InvalidOperationException) { // Queue has been marked as completed logger.Warn($"Data queue terminated for stream: {streamType}"); } catch (UnsupportedStreamException use) { logger.Error(use, $"{streamType}"); OnEsStreamError(use.Message); } }
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() ); } } }); }