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;
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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;
        }
예제 #5
0
        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;
        }
예제 #6
0
        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;
        }
예제 #7
0
        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;
        }