Skip to content

Commit 3da4b12

Browse files
committed
Add SpectrumVisualizer Based on @Johnwikix's original work — thanks for the great work!
1 parent 09fa47a commit 3da4b12

File tree

8 files changed

+16829
-12374
lines changed

8 files changed

+16829
-12374
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace DevWinUI;
2+
3+
public interface ISpectrumAnalyzer : IDisposable
4+
{
5+
event Action<float[]> SpectrumDataUpdated;
6+
7+
void Start();
8+
void Stop();
9+
}
10+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace DevWinUI;
2+
3+
public enum SpectrumColorType
4+
{
5+
GradientLoop,
6+
Intensity,
7+
Custom
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace DevWinUI;
2+
3+
public enum SpectrumType
4+
{
5+
Plain,
6+
Round,
7+
Wave
8+
}
Lines changed: 334 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
using Microsoft.UI.Text;
2+
3+
namespace DevWinUI;
4+
5+
public partial class SpectrumVisualizer
6+
{
7+
public Windows.UI.Text.FontWeight TitleFontWeight
8+
{
9+
get { return (Windows.UI.Text.FontWeight)GetValue(TitleFontWeightProperty); }
10+
set { SetValue(TitleFontWeightProperty, value); }
11+
}
12+
13+
public static readonly DependencyProperty TitleFontWeightProperty =
14+
DependencyProperty.Register(nameof(TitleFontWeight), typeof(Windows.UI.Text.FontWeight), typeof(SpectrumVisualizer), new PropertyMetadata(FontWeights.Bold, OnTextFormatChanged));
15+
16+
public CanvasHorizontalAlignment TitleHorizontalAlignment
17+
{
18+
get { return (CanvasHorizontalAlignment)GetValue(TitleHorizontalAlignmentProperty); }
19+
set { SetValue(TitleHorizontalAlignmentProperty, value); }
20+
}
21+
22+
public static readonly DependencyProperty TitleHorizontalAlignmentProperty =
23+
DependencyProperty.Register(nameof(TitleHorizontalAlignment), typeof(CanvasHorizontalAlignment), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasHorizontalAlignment.Center, OnTextFormatChanged));
24+
25+
public CanvasWordWrapping TitleWordWrapping
26+
{
27+
get { return (CanvasWordWrapping)GetValue(TitleWordWrappingProperty); }
28+
set { SetValue(TitleWordWrappingProperty, value); }
29+
}
30+
31+
public static readonly DependencyProperty TitleWordWrappingProperty =
32+
DependencyProperty.Register(nameof(TitleWordWrapping), typeof(CanvasWordWrapping), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasWordWrapping.NoWrap, OnTextFormatChanged));
33+
34+
public CanvasTrimmingSign TitleTrimmingSign
35+
{
36+
get { return (CanvasTrimmingSign)GetValue(TitleTrimmingSignProperty); }
37+
set { SetValue(TitleTrimmingSignProperty, value); }
38+
}
39+
40+
public static readonly DependencyProperty TitleTrimmingSignProperty =
41+
DependencyProperty.Register(nameof(TitleTrimmingSign), typeof(CanvasTrimmingSign), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasTrimmingSign.Ellipsis, OnTextFormatChanged));
42+
43+
public CanvasTextTrimmingGranularity TitleTrimmingGranularity
44+
{
45+
get { return (CanvasTextTrimmingGranularity)GetValue(TitleTrimmingGranularityProperty); }
46+
set { SetValue(TitleTrimmingGranularityProperty, value); }
47+
}
48+
49+
public static readonly DependencyProperty TitleTrimmingGranularityProperty =
50+
DependencyProperty.Register(nameof(TitleTrimmingGranularity), typeof(CanvasTextTrimmingGranularity), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasTextTrimmingGranularity.Character, OnTextFormatChanged));
51+
52+
public Windows.UI.Text.FontWeight ArtistFontWeight
53+
{
54+
get { return (Windows.UI.Text.FontWeight)GetValue(ArtistFontWeightProperty); }
55+
set { SetValue(ArtistFontWeightProperty, value); }
56+
}
57+
58+
public static readonly DependencyProperty ArtistFontWeightProperty =
59+
DependencyProperty.Register(nameof(ArtistFontWeight), typeof(Windows.UI.Text.FontWeight), typeof(SpectrumVisualizer), new PropertyMetadata(FontWeights.Bold, OnTextFormatChanged));
60+
61+
public CanvasHorizontalAlignment ArtistHorizontalAlignment
62+
{
63+
get { return (CanvasHorizontalAlignment)GetValue(ArtistHorizontalAlignmentProperty); }
64+
set { SetValue(ArtistHorizontalAlignmentProperty, value); }
65+
}
66+
67+
public static readonly DependencyProperty ArtistHorizontalAlignmentProperty =
68+
DependencyProperty.Register(nameof(ArtistHorizontalAlignment), typeof(CanvasHorizontalAlignment), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasHorizontalAlignment.Center, OnTextFormatChanged));
69+
70+
public CanvasWordWrapping ArtistWordWrapping
71+
{
72+
get { return (CanvasWordWrapping)GetValue(ArtistWordWrappingProperty); }
73+
set { SetValue(ArtistWordWrappingProperty, value); }
74+
}
75+
76+
public static readonly DependencyProperty ArtistWordWrappingProperty =
77+
DependencyProperty.Register(nameof(ArtistWordWrapping), typeof(CanvasWordWrapping), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasWordWrapping.NoWrap, OnTextFormatChanged));
78+
79+
public CanvasTrimmingSign ArtistTrimmingSign
80+
{
81+
get { return (CanvasTrimmingSign)GetValue(ArtistTrimmingSignProperty); }
82+
set { SetValue(ArtistTrimmingSignProperty, value); }
83+
}
84+
85+
public static readonly DependencyProperty ArtistTrimmingSignProperty =
86+
DependencyProperty.Register(nameof(ArtistTrimmingSign), typeof(CanvasTrimmingSign), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasTrimmingSign.Ellipsis, OnTextFormatChanged));
87+
88+
public CanvasTextTrimmingGranularity ArtistTrimmingGranularity
89+
{
90+
get { return (CanvasTextTrimmingGranularity)GetValue(ArtistTrimmingGranularityProperty); }
91+
set { SetValue(ArtistTrimmingGranularityProperty, value); }
92+
}
93+
94+
public static readonly DependencyProperty ArtistTrimmingGranularityProperty =
95+
DependencyProperty.Register(nameof(ArtistTrimmingGranularity), typeof(CanvasTextTrimmingGranularity), typeof(SpectrumVisualizer), new PropertyMetadata(CanvasTextTrimmingGranularity.Character, OnTextFormatChanged));
96+
97+
private static void OnTextFormatChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
98+
{
99+
var ctl = (SpectrumVisualizer)d;
100+
if (ctl != null)
101+
{
102+
ctl.InitializeText();
103+
ctl.spectrumCanvasControl?.Invalidate();
104+
}
105+
}
106+
107+
public bool ShowAlbumArt
108+
{
109+
get { return (bool)GetValue(ShowAlbumArtProperty); }
110+
set { SetValue(ShowAlbumArtProperty, value); }
111+
}
112+
113+
public static readonly DependencyProperty ShowAlbumArtProperty =
114+
DependencyProperty.Register(nameof(ShowAlbumArt), typeof(bool), typeof(SpectrumVisualizer), new PropertyMetadata(true, OnShowAlbumArtChanged));
115+
116+
private static void OnShowAlbumArtChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
117+
{
118+
var ctl = (SpectrumVisualizer)d;
119+
if (ctl != null)
120+
{
121+
ctl._showAlbumArt = (bool)e.NewValue;
122+
ctl.spectrumCanvasControl?.Invalidate();
123+
}
124+
}
125+
126+
public bool ShowTitle
127+
{
128+
get { return (bool)GetValue(ShowTitleProperty); }
129+
set { SetValue(ShowTitleProperty, value); }
130+
}
131+
132+
public static readonly DependencyProperty ShowTitleProperty =
133+
DependencyProperty.Register(nameof(ShowTitle), typeof(bool), typeof(SpectrumVisualizer), new PropertyMetadata(true, OnShowTitleChanged));
134+
135+
private static void OnShowTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
136+
{
137+
var ctl = (SpectrumVisualizer)d;
138+
if (ctl != null)
139+
{
140+
ctl._showTitle = (bool)e.NewValue;
141+
ctl.spectrumCanvasControl?.Invalidate();
142+
}
143+
}
144+
public bool ShowArtist
145+
{
146+
get { return (bool)GetValue(ShowArtistProperty); }
147+
set { SetValue(ShowArtistProperty, value); }
148+
}
149+
150+
public static readonly DependencyProperty ShowArtistProperty =
151+
DependencyProperty.Register(nameof(ShowArtist), typeof(bool), typeof(SpectrumVisualizer), new PropertyMetadata(true, OnShowArtistChanged));
152+
153+
private static void OnShowArtistChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
154+
{
155+
var ctl = (SpectrumVisualizer)d;
156+
if (ctl != null)
157+
{
158+
ctl._showArtist = (bool)e.NewValue;
159+
ctl.spectrumCanvasControl?.Invalidate();
160+
}
161+
}
162+
163+
public SpectrumType SpectrumType
164+
{
165+
get { return (SpectrumType)GetValue(SpectrumTypeProperty); }
166+
set { SetValue(SpectrumTypeProperty, value); }
167+
}
168+
169+
public static readonly DependencyProperty SpectrumTypeProperty =
170+
DependencyProperty.Register(nameof(SpectrumType), typeof(SpectrumType), typeof(SpectrumVisualizer), new PropertyMetadata(SpectrumType.Round, OnSpectrumModeChanged));
171+
172+
private static void OnSpectrumModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
173+
{
174+
var ctl = (SpectrumVisualizer)d;
175+
if (ctl != null)
176+
{
177+
ctl.spectrumMode = (SpectrumType)e.NewValue;
178+
ctl.spectrumCanvasControl?.Invalidate();
179+
}
180+
}
181+
182+
public double RotationSpeed
183+
{
184+
get { return (double)GetValue(RotationSpeedProperty); }
185+
set { SetValue(RotationSpeedProperty, value); }
186+
}
187+
188+
public static readonly DependencyProperty RotationSpeedProperty =
189+
DependencyProperty.Register(nameof(RotationSpeed), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(10.0d, OnRotationSpeedChanged));
190+
191+
private static void OnRotationSpeedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
192+
{
193+
var ctl = (SpectrumVisualizer)d;
194+
if (ctl != null)
195+
{
196+
ctl.rotationSpeed = (float)((double)e.NewValue);
197+
ctl.spectrumCanvasControl?.Invalidate();
198+
}
199+
}
200+
201+
public double CoverOpacity
202+
{
203+
get { return (double)GetValue(CoverOpacityProperty); }
204+
set { SetValue(CoverOpacityProperty, value); }
205+
}
206+
207+
public static readonly DependencyProperty CoverOpacityProperty =
208+
DependencyProperty.Register(nameof(CoverOpacity), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(1.0d, OnCoverOpacityChanged));
209+
210+
private static void OnCoverOpacityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
211+
{
212+
var ctl = (SpectrumVisualizer)d;
213+
if (ctl != null)
214+
{
215+
ctl.coverOpacity = (float)((double)e.NewValue);
216+
ctl.spectrumCanvasControl?.Invalidate();
217+
}
218+
}
219+
220+
public double SpectrumOpacity
221+
{
222+
get { return (double)GetValue(SpectrumOpacityProperty); }
223+
set { SetValue(SpectrumOpacityProperty, value); }
224+
}
225+
226+
public static readonly DependencyProperty SpectrumOpacityProperty =
227+
DependencyProperty.Register(nameof(SpectrumOpacity), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(1.0d, OnSpectrumOpacityChanged));
228+
229+
private static void OnSpectrumOpacityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
230+
{
231+
var ctl = (SpectrumVisualizer)d;
232+
if (ctl != null)
233+
{
234+
ctl.spectrumOpacity = (float)((double)e.NewValue);
235+
ctl.spectrumCanvasControl?.Invalidate();
236+
}
237+
}
238+
239+
public double FontOpacity
240+
{
241+
get { return (double)GetValue(FontOpacityProperty); }
242+
set { SetValue(FontOpacityProperty, value); }
243+
}
244+
245+
public static readonly DependencyProperty FontOpacityProperty =
246+
DependencyProperty.Register(nameof(FontOpacity), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(1.0d, OnFontOpacityChanged));
247+
private static void OnFontOpacityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
248+
{
249+
var ctl = (SpectrumVisualizer)d;
250+
if (ctl != null)
251+
{
252+
ctl.fontOpacity = (float)((double)e.NewValue);
253+
ctl.spectrumCanvasControl?.Invalidate();
254+
}
255+
}
256+
257+
public double SmoothingFactor
258+
{
259+
get { return (double)GetValue(SmoothingFactorProperty); }
260+
set { SetValue(SmoothingFactorProperty, value); }
261+
}
262+
263+
public static readonly DependencyProperty SmoothingFactorProperty =
264+
DependencyProperty.Register(nameof(SmoothingFactor), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(0.95d, OnSmoothingFactorChanged));
265+
266+
private static void OnSmoothingFactorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
267+
{
268+
var ctl = (SpectrumVisualizer)d;
269+
if (ctl != null)
270+
{
271+
ctl.smoothingFactor = (float)((double)e.NewValue);
272+
ctl.spectrumCanvasControl?.Invalidate();
273+
}
274+
}
275+
276+
public double Sensitivity
277+
{
278+
get { return (double)GetValue(SensitivityProperty); }
279+
set { SetValue(SensitivityProperty, value); }
280+
}
281+
282+
public static readonly DependencyProperty SensitivityProperty =
283+
DependencyProperty.Register(nameof(Sensitivity), typeof(double), typeof(SpectrumVisualizer), new PropertyMetadata(20.0d, OnSensitivityChanged));
284+
private static void OnSensitivityChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
285+
{
286+
var ctl = (SpectrumVisualizer)d;
287+
if (ctl != null)
288+
{
289+
ctl.sensitivity = (float)((double)e.NewValue);
290+
ctl.spectrumCanvasControl?.Invalidate();
291+
}
292+
}
293+
294+
public SpectrumColorType ColorType
295+
{
296+
get { return (SpectrumColorType)GetValue(ColorTypeProperty); }
297+
set { SetValue(ColorTypeProperty, value); }
298+
}
299+
300+
public static readonly DependencyProperty ColorTypeProperty =
301+
DependencyProperty.Register(nameof(ColorType), typeof(SpectrumColorType), typeof(SpectrumVisualizer), new PropertyMetadata(SpectrumColorType.GradientLoop, OnSpectrumColorChanged));
302+
303+
private static void OnSpectrumColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
304+
{
305+
var ctl = (SpectrumVisualizer)d;
306+
if (ctl != null)
307+
{
308+
ctl.colorType = (SpectrumColorType)e.NewValue;
309+
ctl.spectrumCanvasControl?.Invalidate();
310+
}
311+
}
312+
313+
public ISpectrumAnalyzer Analyzer
314+
{
315+
get => _analyzer;
316+
set
317+
{
318+
if (_analyzer != null)
319+
{
320+
_analyzer.SpectrumDataUpdated -= OnSpectrumDataUpdated;
321+
_analyzer.Dispose();
322+
}
323+
324+
_analyzer = value;
325+
326+
if (_analyzer != null)
327+
{
328+
_analyzer.SpectrumDataUpdated += OnSpectrumDataUpdated;
329+
_analyzer.Start();
330+
}
331+
}
332+
}
333+
}
334+

0 commit comments

Comments
 (0)