public void OpenFile(string path) { this.Stop(); if (this.ActiveStream != null) { this.SelectionBegin = TimeSpan.Zero; this.SelectionEnd = TimeSpan.Zero; this.ChannelPosition = 0; } this.StopAndCloseStream(); if (File.Exists(path)) { try { this.waveOutDevice = new WaveOut { DesiredLatency = 100 }; // ActiveStream = new Mp3FileReader(path); this.ActiveStream = new WaveFileReader(path); this.inputStream = new WaveChannel32(this.ActiveStream); this.sampleAggregator = new SampleAggregator(this.fftDataSize); this.inputStream.Sample += this.inputStream_Sample; this.waveOutDevice.Init(this.inputStream); this.ChannelLength = this.inputStream.TotalTime.TotalSeconds; this.GenerateWaveformData(path); this.CanPlay = true; } catch { this.ActiveStream = null; this.CanPlay = false; } } }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { var waveformParams = e.Argument as WaveformGenerationParams; //Mp3FileReader waveformMp3Stream; WaveFileReader waveformWaveStream; WaveChannel32 waveformInputStream; try { //waveformMp3Stream = new Mp3FileReader(waveformParams.Path); //waveformInputStream = new WaveChannel32(waveformMp3Stream); waveformWaveStream = new WaveFileReader(waveformParams.Path); waveformInputStream = new WaveChannel32(waveformWaveStream); } catch (Exception) { return; //why that object is set to null ref...?! } waveformInputStream.Sample += this.waveStream_Sample; var frameLength = this.fftDataSize; var frameCount = (int)(waveformInputStream.Length / (double)frameLength); var waveformLength = frameCount * 2; var readBuffer = new byte[frameLength]; this.waveformAggregator = new SampleAggregator(frameLength); var maxLeftPointLevel = float.MinValue; var maxRightPointLevel = float.MinValue; var currentPointIndex = 0; var waveformCompressedPoints = new float[waveformParams.Points]; var waveformData = new List <float>(); var waveMaxPointIndexes = new List <int>(); for (var i = 1; i <= waveformParams.Points; i++) { waveMaxPointIndexes.Add((int)Math.Round(waveformLength * (i / (double)waveformParams.Points), 0)); } var readCount = 0; while (currentPointIndex * 2 < waveformParams.Points) { waveformInputStream.Read(readBuffer, 0, readBuffer.Length); waveformData.Add(this.waveformAggregator.LeftMaxVolume); waveformData.Add(this.waveformAggregator.RightMaxVolume); if (this.waveformAggregator.LeftMaxVolume > maxLeftPointLevel) { maxLeftPointLevel = this.waveformAggregator.LeftMaxVolume; } if (this.waveformAggregator.RightMaxVolume > maxRightPointLevel) { maxRightPointLevel = this.waveformAggregator.RightMaxVolume; } if (readCount > waveMaxPointIndexes[currentPointIndex]) { waveformCompressedPoints[(currentPointIndex * 2)] = maxLeftPointLevel; waveformCompressedPoints[(currentPointIndex * 2) + 1] = maxRightPointLevel; maxLeftPointLevel = float.MinValue; maxRightPointLevel = float.MinValue; currentPointIndex++; } if (readCount % 3000 == 0) { var clonedData = (float[])waveformCompressedPoints.Clone(); DispatcherHelper.UIDispatcher.Invoke(() => { this.WaveformData = clonedData; }); } if (this.waveformGenerateWorker.CancellationPending) { e.Cancel = true; break; } readCount++; } var finalClonedData = (float[])waveformCompressedPoints.Clone(); DispatcherHelper.UIDispatcher.Invoke(() => { this.fullLevelData = waveformData.ToArray(); this.WaveformData = finalClonedData; }); waveformInputStream.Close(); waveformInputStream.Dispose(); waveformInputStream = null; //waveformMp3Stream.Close(); //waveformMp3Stream.Dispose(); //waveformMp3Stream = null; waveformWaveStream.Close(); waveformWaveStream.Dispose(); waveformWaveStream = null; }