public void OpenFile(string path = "") { if (useGlobal) { if (LoadedPath == null) { return; } path = LoadedPath; } if (!useGlobal) { LoadedPath = path; } Stop(); if (ActiveStream != null) { SelectionBegin = TimeSpan.Zero; SelectionEnd = TimeSpan.Zero; ChannelPosition = 0; } StopAndCloseStream(); if (System.IO.File.Exists(path)) { try { waveOutDevice = new WaveOut() { DesiredLatency = 100 }; ActiveStream = useGlobal ? LoadedSong.RawStream : new Mp3FileReader(path); inputStream = new WaveChannel32(ActiveStream); sampleAggregator = new SampleAggregator(fftDataSize); inputStream.Sample += inputStream_Sample; waveOutDevice.Init(inputStream); ChannelLength = inputStream.TotalTime.TotalSeconds; FileTag = TagLib.File.Create(path); GenerateWaveformData(path); CanPlay = true; } catch { ActiveStream = null; CanPlay = false; } } }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { var song = useGlobal ? LoadedSong : new Song(e.Argument as WaveformGenerationParams); if (!useGlobal) { LoadedSong = song; HasLoaded = true; } var wfParams = song.WfParams; var stream = useGlobal ? song.RawStream : song.Mp3Stream; var waveformInputStream = new WaveChannel32(stream); waveformInputStream.Sample += waveStream_Sample; int frameLength = fftDataSize; int frameCount = (int)(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[wfParams.Points]; List <float> waveformData = new List <float>(); List <int> waveMaxPointIndexes = new List <int>(); for (int i = 1; i <= wfParams.Points; i++) { waveMaxPointIndexes.Add((int)Math.Round(waveformLength * ((double)i / (double)wfParams.Points), 0)); } int readCount = 0; while (currentPointIndex * 2 < wfParams.Points) { waveformInputStream.Read(readBuffer, 0, readBuffer.Length); 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; })); }