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;
        }