private void Initialize(AudioPlayer audioPlayer, SpectrumVisualizer element) { Task.Run(() => { var track = audioPlayer.CurrentlyPlaying; var callerElement = element; var result = audioPlayer.CalculateSpecterumData(callerElement.BandCount); lock (VisualizersData) { if (!VisualizersData.TryGetValue(track, out List <TimeSpectrumData> data)) { VisualizersData.Add(track, result); } else { VisualizersData[track] = result; } } }); }
protected override void InternalRender(SpectrumVisualizer element, AudioPlayer audioPlayer, DrawGraphicsEventArgs renderArgs) { if (audioPlayer.CurrentlyPlaying != CurrentlyPlaying) { CurrentlyPlaying = audioPlayer.CurrentlyPlaying; Initialize(audioPlayer, element); } if (!VisualizersData.TryGetValue(audioPlayer.CurrentlyPlaying, out List <TimeSpectrumData> spectrumData)) { return; } if (!(spectrumData?.Any() ?? false)) { return; } var currentTime = audioPlayer.CurrentTime.TotalMilliseconds; TimeSpectrumData playingSpectrumPart = null; for (int i = 0; i < spectrumData.Count - 1; i++) { if (spectrumData[i + 1].Time > currentTime && spectrumData[i].Time <= currentTime) { playingSpectrumPart = spectrumData[i]; break; } } playingSpectrumPart = playingSpectrumPart ?? spectrumData[spectrumData.Count - 1]; var gfx = renderArgs.Graphics; foreach (var drawer in SpectrumDrawers) { if ((drawer.Key & element.VisualizationType) == 0) { continue; } float startingPosition = element.BandSpace; if (element.VisualizationType == SpectrumVisualizationType.Bottom || element.VisualizationType == SpectrumVisualizationType.Top) { startingPosition += element.Location.X; } else { startingPosition += element.Location.Y; } for (int index = 0; index < playingSpectrumPart.SpectrumData.Length; index++) { var band = playingSpectrumPart.SpectrumData[index]; if (!Brushes.TryGetValue(element, out IBrush brush)) { brush = gfx.CreateSolidBrush(element.BandColor.ToOverlayColor()); Brushes.Add(element, brush); } drawer.Value(element, band * element.Multiplier, startingPosition, gfx, brush); startingPosition += element.BandWidth + element.BandSpace; } } }