public void Handle(SamplesReceivedEvent samples) { var start = samples.Start.TotalSeconds; var end = start + ((double)samples.Data.Length / samples.WaveFormat.AverageBytesPerSecond); var peaks = _peakProvider.Sample(samples.WaveFormat, samples.Data); if (peaks.Any()) { _events.PublishOnCurrentThread(new PeaksReceivedEvent(samples.Source, start, end, peaks, samples.CurrentAudioTime)); } }
private WaveformData Generate(IWaveProviderEx audioStream) { var position = audioStream.Position; var volume = audioStream.Volume; var pan = audioStream.Pan; audioStream.Position = 0; audioStream.Volume = 1f; audioStream.Pan = 0; try { var stopWatch = Stopwatch.StartNew(); var peaks = new List <PeakInfo>(); var buffer = new byte[audioStream.WaveFormat.AverageBytesPerSecond]; int bytesRead; do { bytesRead = audioStream.Read(buffer, 0, buffer.Length); var data = bytesRead == buffer.Length ? buffer : buffer.Take(bytesRead).ToArray(); var p = _peakProvider.Sample(audioStream.WaveFormat, data); peaks.AddRange(p); } while (bytesRead > 0 && audioStream.Position < audioStream.Length); var elapsed = stopWatch.Elapsed; var mibPerSecond = audioStream.Length / elapsed.TotalSeconds / 1024 / 1024; #if DEBUG Trace.WriteLine($"Sampled '{audioStream.TotalTime}' of wave data in '{elapsed}' ({mibPerSecond:F1} MiB/sec)."); #endif return(new WaveformData(audioStream.TotalTime, peaks)); } finally { audioStream.Position = position; audioStream.Volume = volume; audioStream.Pan = pan; } }