private bool ProcessPairWaveForm(WaveformGenerationParams argument) { bool isCancel = false; WaveFileReader forwardStream = new WaveFileReader(new MemoryStream(argument.Path)); WaveFileReader backStream = new WaveFileReader(new MemoryStream(argument.BackPath)); WaveChannel32 forwardChannel = new WaveChannel32(forwardStream); WaveChannel32 backChannel = new WaveChannel32(backStream); backChannel.Sample += waveStream_Sample; forwardChannel.Sample += waveStream_Sample; long frameLength = 2 * backChannel.Length / argument.Points; frameLength = frameLength - frameLength % backChannel.WaveFormat.BlockAlign; waveformAggregator = new SampleAggregator((int)(frameLength / backChannel.WaveFormat.BlockAlign)); float[] numArray = new float[argument.Points]; byte[] buffer = new byte[frameLength]; int factPointsCount = argument.Points / 2; for (int i = 0; i < factPointsCount; i++) { backChannel.Read(buffer, 0, buffer.Length); numArray[i * 2] = waveformAggregator.LeftMaxVolume * verticalScale; forwardChannel.Read(buffer, 0, buffer.Length); numArray[i * 2 + 1] = waveformAggregator.LeftMaxVolume * verticalScale; if (this.waveformGenerateWorker.CancellationPending) { isCancel = true; break; } } float[] finalClonedData = (float[])numArray.Clone(); Application.Current.Dispatcher.Invoke(new Action(() => this.WaveformData = finalClonedData)); forwardChannel.Close(); forwardChannel.Dispose(); forwardChannel = null; backChannel.Close(); backChannel.Dispose(); backChannel = null; forwardStream.Close(); forwardStream.Dispose(); forwardStream = null; backStream.Close(); backStream.Dispose(); backStream = null; return(isCancel); }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams argument = e.Argument as WaveformGenerationParams; bool isCancel = false; if (argument.BackPath == null) { isCancel = ProcessSingleWaveForm(argument); } else { isCancel = ProcessPairWaveForm(argument); } if (isCancel) { e.Cancel = true; } }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams; int stream = Bass.BASS_StreamCreateFile(waveformParams.Path, 0, 0, BASSFlag.BASS_STREAM_DECODE | BASSFlag.BASS_SAMPLE_FLOAT | BASSFlag.BASS_STREAM_PRESCAN); int frameLength = (int)Bass.BASS_ChannelSeconds2Bytes(stream, 0.02); long streamLength = Bass.BASS_ChannelGetLength(stream, 0); int frameCount = (int)(streamLength / (double)frameLength); int waveformLength = frameCount * 2; float[] waveformData = new float[waveformLength]; float[] levels = new float[2]; int actualPoints = Math.Min(waveformParams.Points, frameCount); int compressedPointCount = actualPoints * 2; float[] waveformCompressedPoints = new float[compressedPointCount]; List <int> waveMaxPointIndexes = new List <int>(); for (int i = 1; i <= actualPoints; i++) { waveMaxPointIndexes.Add((int)Math.Round(waveformLength * (i / (double)actualPoints), 0)); } float maxLeftPointLevel = float.MinValue; float maxRightPointLevel = float.MinValue; int currentPointIndex = 0; for (int i = 0; i < waveformLength; i += 2) { Bass.BASS_ChannelGetLevel(stream, levels, 0.02f, BASSLevel.BASS_LEVEL_STEREO); waveformData[i] = levels[0]; waveformData[i + 1] = levels[1]; if (levels[0] > maxLeftPointLevel) { maxLeftPointLevel = levels[0]; } if (levels[1] > maxRightPointLevel) { maxRightPointLevel = levels[1]; } if (i > waveMaxPointIndexes[currentPointIndex]) { waveformCompressedPoints[(currentPointIndex * 2)] = maxLeftPointLevel; waveformCompressedPoints[(currentPointIndex * 2) + 1] = maxRightPointLevel; maxLeftPointLevel = float.MinValue; maxRightPointLevel = float.MinValue; currentPointIndex++; } if (i % 3000 == 0) { float[] clonedData = (float[])waveformCompressedPoints.Clone(); App.Current.Dispatcher.Invoke(new Action(() => { WaveformData = clonedData; })); } if (waveformGenerateWorker.CancellationPending) { e.Cancel = true; break;; } } float[] finalClonedData = (float[])waveformCompressedPoints.Clone(); App.Current.Dispatcher.Invoke(new Action(() => { fullLevelData = waveformData; WaveformData = finalClonedData; })); Bass.BASS_StreamFree(stream); }
void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams; Mp3FileReader waveformMp3Stream = new Mp3FileReader(waveformParams.Path); WaveChannel32 waveformInputStream = new WaveChannel32(waveformMp3Stream); waveformInputStream.Sample += waveStream_Sample; int frameLength = (int)((20.0d / waveformInputStream.TotalTime.TotalMilliseconds) * waveformInputStream.Length); // Sample 20ms of data. 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) { 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; })); waveformInputStream.Close(); waveformInputStream.Dispose(); waveformInputStream = null; waveformMp3Stream.Close(); waveformMp3Stream.Dispose(); waveformMp3Stream = null; }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams; //var extension = Path.GetExtension(waveformParams.Path); //if (extension == null) //{ // Debug.WriteLine(string.Format("只能播放有标准后缀名的文件,此文件{0}不标准", path)); // return; //} ////判断是MP3文件还是Wav //if (extension.Equals(".mp3", StringComparison.InvariantCultureIgnoreCase)) //{ // ActiveStream = new Mp3FileReader(waveformParams.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); FileTag获取专辑图片,不需要专辑图片 // GenerateWaveformData(waveformParams.Path); // CanPlay = true; //} //else if (extension.Equals(".wav", StringComparison.InvariantCultureIgnoreCase)) //{ // ActiveStream = new WaveFileReader(waveformParams.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); FileTag获取专辑图片,不需要专辑图片 // GenerateWaveformData(waveformParams.Path); // CanPlay = true; //} WaveFileReader waveformMp3Stream = new WaveFileReader(waveformParams.Path); WaveChannel32 waveformInputStream = new WaveChannel32(waveformMp3Stream); 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) { 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; })); waveformInputStream.Close(); waveformInputStream.Dispose(); waveformInputStream = null; waveformMp3Stream.Close(); waveformMp3Stream.Dispose(); waveformMp3Stream = null; }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams; Mp3FileReader waveformMp3Stream = new Mp3FileReader(waveformParams.Path); WaveChannel32 waveformInputStream = new WaveChannel32(waveformMp3Stream); waveformInputStream.Sample += waveStream_Sample; int frameCount = (int)((double)waveformInputStream.Length / (double)frameLength); byte[] readBuffer = new byte[frameLength]; waveformAggregator = new SampleAggregator(frameLength); int currentPointIndex = 0; float[] waveformArray = new float[frameCount * 2]; float waveformLeftMax = 0; float waveformRightMax = 0; int readCount = 0; while (currentPointIndex < frameCount * 2) { waveformInputStream.Read(readBuffer, 0, readBuffer.Length); waveformArray[currentPointIndex++] = waveformAggregator.LeftMaxVolume; waveformArray[currentPointIndex++] = waveformAggregator.RightMaxVolume; if (waveformAggregator.LeftMaxVolume > waveformLeftMax) { waveformLeftMax = waveformAggregator.LeftMaxVolume; } if (waveformAggregator.RightMaxVolume > waveformRightMax) { waveformRightMax = waveformAggregator.RightMaxVolume; } waveformAggregator.Clear(); if (waveformGenerateWorker.CancellationPending) { e.Cancel = true; break; } readCount++; } byte[] waveformBytes = new byte[waveformArray.Length]; float factor = 31f / Math.Max(Math.Abs(waveformLeftMax), Math.Abs(waveformRightMax)); for (int ndx = 0; ndx < waveformArray.Length; ndx++) { waveformBytes[ndx] = (byte)Math.Abs(Math.Abs(waveformArray[ndx]) * factor); } //UI.Invoke(new Action(() => { WaveformData = waveformBytes; })); waveformData = waveformBytes; waveformInputStream.Close(); waveformInputStream.Dispose(); waveformInputStream = null; waveformMp3Stream.Close(); waveformMp3Stream.Dispose(); waveformMp3Stream = null; }
private void waveformGenerateWorker_DoWork(object sender, DoWorkEventArgs e) { WaveformGenerationParams waveformParams = e.Argument as WaveformGenerationParams; /* * float[] audio = CommonUtils.Audio.NAudio.AudioUtilsNAudio.ReadMonoFromFile(waveformParams.Path, 44100, 0, 0); * Dispatcher.CurrentDispatcher.Invoke(new Action(() => * { * WaveformData = audio; * })); * return; */ ISampleProvider sampleProvider = new AudioFileReader(waveformParams.Path); WaveStream fileWaveStream = (WaveStream)sampleProvider; WaveChannel32 waveformInputStream = new WaveChannel32(fileWaveStream); waveformInputStream.PadWithZeroes = false; waveformInputStream.Sample += waveStream_Sample; int frameLength = fftDataSize; int frameCount = (int)((double)waveformInputStream.Length / (double)frameLength); int waveformLength = frameCount * 2; float[] samples = new float[frameLength]; List <float> floatList = new List <float>(); while (sampleProvider.Read(samples, 0, samples.Length) > 0) { if (waveformInputStream.WaveFormat.Channels == 1) { floatList.AddRange(samples); } else if (waveformInputStream.WaveFormat.Channels == 2) { switch (stereoProcessing) { case StereoProcessingType.CHANNEL_STEREO_LEFT: for (int i = 0; i < samples.Length; i += 2) { float left = samples[i]; float right = samples[i + 1]; floatList.Add(left); } break; case StereoProcessingType.CHANNEL_STEREO_RIGHT: for (int i = 0; i < samples.Length; i += 2) { float left = samples[i]; float right = samples[i + 1]; floatList.Add(right); } break; case StereoProcessingType.CHANNEL_MONOMIX: default: for (int i = 0; i < samples.Length; i += 2) { float left = samples[i]; float right = samples[i + 1]; // Make stored channel data stereo by averaging left and right values. floatList.Add(((left + right) / 2.0f)); } break; } } if (waveformGenerateWorker.CancellationPending) { e.Cancel = true; break; } } Dispatcher.CurrentDispatcher.Invoke(new Action(() => { WaveformData = floatList.ToArray(); })); waveformInputStream.Close(); waveformInputStream.Dispose(); waveformInputStream = null; }