public void Support_Historical_Live_Stream(double seconds, int rate, int channels) { var events = Substitute.For <IEventAggregator>(); SamplesReceivedEvent samples = null; events.When(x => x.PublishOnCurrentThread(Arg.Any <SamplesReceivedEvent>())) .Do(x => samples = x.Arg <SamplesReceivedEvent>()); var source = new Uri("some://uri"); var waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(rate, channels); var bufferSize = TimeSpan.FromSeconds(seconds); using (var sut = new BufferedStreamingChannel(events, source, waveFormat, bufferSize)) { sut.Source.Should().Be(source); sut.Stream.TotalTime.Should().Be(bufferSize); var sampleTime = DateTime.UtcNow.AddHours(-2); var expected = waveFormat.Generate(bufferSize); // adding samples to now... sut.AddSamples(expected, audioSampleTimeStamp: sampleTime).Should().Be(expected.Length); sut.StartTime.Should().Be(sampleTime); // adding more data, but start time remains sut.AddSamples(expected).Should().Be(expected.Length); sut.StartTime.Should().Be(sampleTime); } }
public void Add_samples(double seconds, int rate, int channels) { var events = Substitute.For <IEventAggregator>(); SamplesReceivedEvent samples = null; events.When(x => x.PublishOnCurrentThread(Arg.Any <SamplesReceivedEvent>())) .Do(x => samples = x.Arg <SamplesReceivedEvent>()); var source = new Uri("some://uri"); var waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(rate, channels); var bufferSize = TimeSpan.FromSeconds(seconds); using (var sut = new BufferedStreamingChannel(events, source, waveFormat, bufferSize)) { sut.Source.Should().Be(source); sut.Stream.TotalTime.Should().Be(bufferSize); var expected = waveFormat.Generate(bufferSize); sut.AddSamples(expected).Should().Be(expected.Length); var stream = sut.BufferedStream; stream.WritePosition.Should().Be(0, "wrap around"); var actual = new byte[expected.Length]; var numbytes = stream.Read(actual, 0, actual.Length); numbytes.Should().Be(expected.Length); actual.Should().Equal(expected); stream.Position.Should().Be(0, "wrap around"); } samples.Should().NotBeNull("samples should be published"); samples.Source.Should().Be(source, "wave data should be published using original uri"); samples.Start.Should().Be(TimeSpan.Zero); samples.WaveFormat.Should().Be(waveFormat, "wave data should be published using original format"); // TODO: test wrap around & splitted publishing }