private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            //wasapiOut conversion
            wasapiOutDevice.PlaybackStopped += OnPlaybackStopped;
            //waveOutDevice.PlaybackStopped += OnPlaybackStopped;
            WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams;
            reader = new Mp3FileReader(waveformParams.Path);
            WaveChannel32 waveformInputStream = new WaveChannel32(reader);
            waveformInputStream.Sample += waveStream_Sample;

            int frameLength = fftDataSize;
            int frameCount = (int)((double)waveformInputStream.Length / (double)frameLength);
            int waveformLength = frameCount * 2;
            byte[] readBuffer = new byte[frameLength];
            waveformAggregator = new SampleAggregator(frameLength);

            float maxLeftPointLevel = float.MinValue;
            float maxRightPointLevel = float.MinValue;
            int currentPointIndex = 0;
            float[] waveformCompressedPoints = new float[waveformParams.Points];
            List<float> waveformData = new List<float>();
            List<int> waveMaxPointIndexes = new List<int>();

            for (int i = 1; i <= waveformParams.Points; i++)
            {
                waveMaxPointIndexes.Add((int)Math.Round(waveformLength * ((double)i / (double)waveformParams.Points), 0));
            }
            int readCount = 0;
            while (currentPointIndex * 2 < waveformParams.Points)
            {
                try
                {
                    waveformInputStream.Read(readBuffer, 0, readBuffer.Length);
                }
                catch
                {
                    Stop();
                    StopAndCloseStream();
                    waveformGenerateWorker.CancelAsync();
                    waveformGenerateWorker.Dispose();
                    //break;
                }
                waveformData.Add(waveformAggregator.LeftMaxVolume);
                waveformData.Add(waveformAggregator.RightMaxVolume);

                if (waveformAggregator.LeftMaxVolume > maxLeftPointLevel)
                    maxLeftPointLevel = waveformAggregator.LeftMaxVolume;
                if (waveformAggregator.RightMaxVolume > maxRightPointLevel)
                    maxRightPointLevel = 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)
                {
                    float[] clonedData = (float[])waveformCompressedPoints.Clone();
                    App.Current.Dispatcher.Invoke(new Action(() =>
                    {
                        WaveformData = clonedData;
                    }));
                }

                if (waveformGenerateWorker.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
                readCount++;
            }

            float[] finalClonedData = (float[])waveformCompressedPoints.Clone();
            App.Current.Dispatcher.Invoke(new Action(() =>
            {
                fullLevelData = waveformData.ToArray();
                WaveformData = finalClonedData;
            }));
            waveformInputStream.Close();
            waveformInputStream.Dispose();
            waveformInputStream = null;
            if (reader != null)
            {
                reader.Close();
                reader.Dispose();
                reader = null;
            }
        }
        public void OpenFile(string path)
        {
            if (ActiveStream == null)
            {
                SelectionBegin = TimeSpan.Zero;
                SelectionEnd = TimeSpan.Zero;
                ChannelPosition = 0;

                if (System.IO.File.Exists(path))
                {
                    try
                    {
                        if (currentDevice == null)
                        {
                            currentSelectedDevice();
                        }
                        AudioClientShareMode shareMode = AudioClientShareMode.Shared;
                        int latency = 100;
                        bool useEventSync = false;
                        wasapiOutDevice = new WasapiOut(currentDevice, shareMode, useEventSync, latency);
                        currentDevice.AudioEndpointVolume.MasterVolumeLevelScalar = (float)volumeValue;

                        ActiveStream = new Mp3FileReader(path);
                        inputStream = new WaveChannel32(ActiveStream);
                        sampleAggregator = new SampleAggregator(fftDataSize);
                        inputStream.Sample += inputStream_Sample;
                        wasapiOutDevice.Init(inputStream);
                        ChannelLength = inputStream.TotalTime.TotalSeconds;
                        FileTag = TagLib.File.Create(path);
                        GenerateWaveformData(path);
                        CanPlay = true;
                    }
                    catch
                    {
                        ActiveStream = null;
                        CanPlay = false;
                    }
                }
            }
        }