Esempio n. 1
0
        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));
            }
        }
Esempio n. 2
0
        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;
            }
        }