Ejemplo n.º 1
0
        private void UpdateBarLayout()
        {
            if (_soundPlayer == null || _spectrumCanvas == null)
            {
                return;
            }

            _barWidth = Math.Max(((_spectrumCanvas.RenderSize.Width - (BarSpacing * (BarCount + 1))) / BarCount), 1);
            _maximumFrequencyIndex = Math.Min(_soundPlayer.GetFftFrequencyIndex(MaximumFrequency) + 1, 2047);
            _minimumFrequencyIndex = Math.Min(_soundPlayer.GetFftFrequencyIndex(MinimumFrequency), 2047);

            int actualBarCount;

            actualBarCount = _barWidth >= 1.0d
                ? BarCount
                : Math.Max((int)((_spectrumCanvas.RenderSize.Width - BarSpacing) / (_barWidth + BarSpacing)), 1);
            _channelPeakData = new float[actualBarCount];

            var indexCount            = _maximumFrequencyIndex - _minimumFrequencyIndex;
            var linearIndexBucketSize = (int)Math.Round(indexCount / (double)actualBarCount, 0);
            var maxIndexList          = new List <int>();
            var maxLogScaleIndexList  = new List <int>();
            var maxLog = Math.Log(actualBarCount, actualBarCount);

            for (var i = 1; i < actualBarCount; i++)
            {
                maxIndexList.Add(_minimumFrequencyIndex + (i * linearIndexBucketSize));
                var logIndex = (int)((maxLog - Math.Log((actualBarCount + 1) - i, (actualBarCount + 1))) * indexCount) + _minimumFrequencyIndex;
                maxLogScaleIndexList.Add(logIndex);
            }
            maxIndexList.Add(_maximumFrequencyIndex);
            maxLogScaleIndexList.Add(_maximumFrequencyIndex);
            _barIndexMax         = maxIndexList.ToArray();
            _barLogScaleIndexMax = maxLogScaleIndexList.ToArray();

            _spectrumCanvas.Children.Clear();
            _barShapes.Clear();
            _peakShapes.Clear();

            var height        = _spectrumCanvas.RenderSize.Height;
            var peakDotHeight = Math.Max(_barWidth / 2.0f, 1);

            for (var i = 0; i < actualBarCount; i++)
            {
                var xCoord       = BarSpacing + (_barWidth * i) + (BarSpacing * i) + 1;
                var barRectangle = new Rectangle()
                {
                    Margin = new Thickness(xCoord, height, 0, 0),
                    Width  = _barWidth,
                    Height = 0,
                    Style  = BarStyle
                };
                _barShapes.Add(barRectangle);
                var peakRectangle = new Rectangle()
                {
                    Margin = new Thickness(xCoord, height - peakDotHeight, 0, 0),
                    Width  = _barWidth,
                    Height = peakDotHeight,
                    Style  = PeakStyle
                };
                _peakShapes.Add(peakRectangle);
            }

            foreach (var shape in _barShapes)
            {
                _spectrumCanvas.Children.Add(shape);
            }
            foreach (var shape in _peakShapes)
            {
                _spectrumCanvas.Children.Add(shape);
            }

            ActualBarWidth = _barWidth;
        }