Skip to content

Commit 66c42f8

Browse files
committed
fix: song timeline offset, lyrics scroll overlay offset
1 parent 3e6ba72 commit 66c42f8

File tree

16 files changed

+371
-267
lines changed

16 files changed

+371
-267
lines changed

BetterLyrics.WinUI3/BetterLyrics.WinUI3/App.xaml.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
using System.Threading;
2626
using System.Threading.Tasks;
2727
using Vanara.PInvoke;
28+
using WinUIEx;
2829

2930
namespace BetterLyrics.WinUI3
3031
{
@@ -68,6 +69,10 @@ private void EnsureSingleInstance()
6869

6970
protected override void OnLaunched(LaunchActivatedEventArgs args)
7071
{
72+
// 设置托盘
73+
WindowHook.OpenOrShowWindow<SystemTrayWindow>();
74+
WindowHook.HideWindow<SystemTrayWindow>();
75+
7176
WindowHook.OpenOrShowWindow<NowPlayingWindow>();
7277
if (Ioc.Default.GetRequiredService<ISettingsService>().AppSettings.MusicGallerySettings.AutoOpen)
7378
{
@@ -109,11 +114,13 @@ private static void ConfigureServices()
109114
.AddSingleton<LyricsWindowSettingsControlViewModel>()
110115
.AddSingleton<LyricsWindowSwitchControlViewModel>()
111116
.AddSingleton<LyricsWindowSwitchWindowViewModel>()
117+
112118
.AddSingleton<NowPlayingWindowViewModel>()
119+
.AddSingleton<NowPlayingPageViewModel>()
120+
113121
.AddSingleton<SettingsWindowViewModel>()
114122
.AddSingleton<SystemTrayViewModel>()
115123
.AddSingleton<SettingsPageViewModel>()
116-
.AddSingleton<NowPlayingPageViewModel>()
117124
.AddSingleton<MusicGalleryViewModel>()
118125
.AddSingleton<AboutControlViewModel>()
119126
.BuildServiceProvider()

BetterLyrics.WinUI3/BetterLyrics.WinUI3/BetterLyrics.WinUI3.csproj

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
<None Remove="Views\MusicGalleryPage.xaml" />
4545
<None Remove="Views\MusicGalleryWindow.xaml" />
4646
<None Remove="Views\SettingsWindow.xaml" />
47+
<None Remove="Views\SystemTrayWindow.xaml" />
4748
</ItemGroup>
4849
<ItemGroup>
4950
<Content Include="Logo.ico" />
@@ -67,10 +68,10 @@
6768
<PackageReference Include="ComputeSharp.D2D1.WinUI" Version="3.2.0" />
6869
<PackageReference Include="csharp-kana" Version="1.0.2" />
6970
<PackageReference Include="csharp-pinyin" Version="1.0.1" />
70-
<PackageReference Include="DevWinUI.Controls" Version="9.6.0" />
71+
<PackageReference Include="DevWinUI.Controls" Version="9.7.0" />
7172
<PackageReference Include="Dubya.WindowsMediaController" Version="2.5.5" />
72-
<PackageReference Include="F23.StringSimilarity" Version="7.0.0" />
73-
<PackageReference Include="H.NotifyIcon.WinUI" Version="2.3.2" />
73+
<PackageReference Include="F23.StringSimilarity" Version="7.0.1" />
74+
<PackageReference Include="H.NotifyIcon.WinUI" Version="2.4.1" />
7475
<PackageReference Include="Hqub.Last.fm" Version="2.5.1" />
7576
<PackageReference Include="Lyricify.Lyrics.Helper-NativeAot" Version="0.1.4-alpha.5" />
7677
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0" />
@@ -336,6 +337,11 @@
336337
<ItemGroup>
337338
<Folder Include="TemplateSelector\" />
338339
</ItemGroup>
340+
<ItemGroup>
341+
<Page Update="Views\SystemTrayWindow.xaml">
342+
<Generator>MSBuild:Compile</Generator>
343+
</Page>
344+
</ItemGroup>
339345
<ItemGroup>
340346
<Page Update="Controls\WindowSettingsControl.xaml">
341347
<Generator>MSBuild:Compile</Generator>

BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/LyricsCanvas.xaml.cs

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
using Microsoft.UI.Xaml;
2020
using Microsoft.UI.Xaml.Controls;
2121
using System;
22+
using System.Collections.Generic;
2223
using System.Linq;
2324
using System.Numerics;
2425
using Windows.Foundation;
@@ -96,6 +97,7 @@ public sealed partial class LyricsCanvas : UserControl,
9697
easingType: EasingType.EaseInOutSine
9798
);
9899

100+
private TimeSpan _songPositionWithOffset;
99101
private TimeSpan _songPosition; // 当前歌曲时刻
100102
private TimeSpan _totalPlayedTime; // 当前歌曲播放总时长(包括来来回回重复播放的时间)
101103
private bool _isLastFMTracked = false;
@@ -112,7 +114,7 @@ public sealed partial class LyricsCanvas : UserControl,
112114
private bool _isMousePressing = false;
113115
private bool _isMouseScrolling = false;
114116

115-
private LyricsData? _lyricsData;
117+
private List<RenderLyricsLine>? _renderLyricsLines = null;
116118

117119
private bool _isLayoutChanged = true;
118120
private bool _isMouseScrollingChanged = false;
@@ -123,7 +125,7 @@ public sealed partial class LyricsCanvas : UserControl,
123125

124126
public TimeSpan SongPosition => _songPosition;
125127
public double CurrentCanvasYScroll => _canvasYScrollTransition.Value;
126-
public double ActualLyricsHeight => LyricsLayoutManager.CalculateActualHeight(_lyricsData?.LyricsLines);
128+
public double ActualLyricsHeight => LyricsLayoutManager.CalculateActualHeight(_renderLyricsLines);
127129
public int CurrentHoveringLineIndex => _mouseHoverLineIndex;
128130

129131
// 歌词区域起始横 X 坐标
@@ -316,8 +318,6 @@ private void Canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventA
316318
double songDuration = _mediaSessionsService.CurrentSongInfo?.DurationMs ?? 0;
317319
bool isForceWordByWord = _settingsService.AppSettings.GeneralSettings.IsForceWordByWordEffect;
318320

319-
double fixedSongPositionMs = _songPosition.TotalMilliseconds + (_mediaSessionsService.CurrentMediaSourceProviderInfo?.PositionOffset ?? 0);
320-
321321
var lyricsThemeColors = _mediaSessionsService.AlbumArtThemeColors;
322322

323323
Color overlayColor;
@@ -355,7 +355,7 @@ private void Canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventA
355355
_lyricsRenderer.Draw(
356356
control: sender,
357357
ds: args.DrawingSession,
358-
lyricsData: _lyricsData,
358+
lines: _renderLyricsLines,
359359
playingLineIndex: _playingLineIndex,
360360
mouseHoverLineIndex: _mouseHoverLineIndex,
361361
isMousePressing: _isMousePressing,
@@ -374,15 +374,15 @@ private void Canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventA
374374
fgColor: lyricsThemeColors.FgFontColor,
375375
getPlaybackState: (lineIndex) =>
376376
{
377-
if (_lyricsData == null) return new LinePlaybackState();
377+
if (_renderLyricsLines == null) return new LinePlaybackState();
378378

379-
var line = _lyricsData.LyricsLines.ElementAtOrDefault(lineIndex);
379+
var line = _renderLyricsLines.ElementAtOrDefault(lineIndex);
380380
if (line == null) return new LinePlaybackState();
381381

382-
var nextLine = _lyricsData.LyricsLines.ElementAtOrDefault(lineIndex + 1);
382+
var nextLine = _renderLyricsLines.ElementAtOrDefault(lineIndex + 1);
383383

384384
return _synchronizer.GetLinePlayingProgress(
385-
fixedSongPositionMs,
385+
_songPositionWithOffset.TotalMilliseconds,
386386
line,
387387
nextLine,
388388
songDuration,
@@ -411,12 +411,12 @@ private void Canvas_Draw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventA
411411
args.DrawingSession.DrawText(
412412
$"Lyrics render start pos: ({(int)_renderLyricsStartX}, {(int)_renderLyricsStartY})\n" +
413413
$"Lyrics render size: [{(int)_renderLyricsWidth} x {(int)_renderLyricsHeight}]\n" +
414-
$"Lyrics actual height: {LyricsLayoutManager.CalculateActualHeight(_lyricsData?.LyricsLines)}\n" +
414+
$"Lyrics actual height: {LyricsLayoutManager.CalculateActualHeight(_renderLyricsLines)}\n" +
415415
$"Playing line (idx): {_playingLineIndex}\n" +
416416
$"Mouse hovering line (idx): {_mouseHoverLineIndex}\n" +
417417
$"Visible lines range (idx): [{_visibleRange.Start}, {_visibleRange.End}]\n" +
418-
$"Total line count: {LyricsLayoutManager.CalculateMaxRange(_lyricsData?.LyricsLines).End + 1}\n" +
419-
$"Played: {TimeSpan.FromMilliseconds(fixedSongPositionMs)} / {TimeSpan.FromMilliseconds(_mediaSessionsService.CurrentSongInfo?.DurationMs ?? 0)}\n" +
418+
$"Total line count: {LyricsLayoutManager.CalculateMaxRange(_renderLyricsLines).End + 1}\n" +
419+
$"Played: {_songPosition} / {TimeSpan.FromMilliseconds(_mediaSessionsService.CurrentSongInfo?.DurationMs ?? 0)}\n" +
420420
$"Y offset: {_canvasYScrollTransition.Value}\n" +
421421
$"User scroll offset: {_mouseYScrollTransition.Value}",
422422
new Vector2(0, 0), Colors.Red);
@@ -430,6 +430,7 @@ private void Canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEv
430430
var lyricsStyle = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsStyleSettings;
431431
var lyricsEffect = _liveStatesService.LiveStates.LyricsWindowStatus.LyricsEffectSettings;
432432
var albumArtThemeColors = _mediaSessionsService.AlbumArtThemeColors;
433+
var lyricsData = _mediaSessionsService.CurrentLyricsData;
433434

434435
TimeSpan elapsedTime = args.Timing.ElapsedTime;
435436

@@ -447,7 +448,7 @@ private void Canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEv
447448

448449
#region UpdatePlayingLineIndex
449450

450-
int newPlayingIndex = _synchronizer.GetCurrentLineIndex(_songPosition.TotalMilliseconds, _lyricsData);
451+
int newPlayingIndex = _synchronizer.GetCurrentLineIndex(_songPositionWithOffset.TotalMilliseconds, lyricsData);
451452
bool isPlayingLineChanged = newPlayingIndex != _playingLineIndex;
452453
_playingLineIndex = newPlayingIndex;
453454

@@ -457,7 +458,7 @@ private void Canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEv
457458

458459
if (isPlayingLineChanged || _isLayoutChanged)
459460
{
460-
var targetScroll = LyricsLayoutManager.CalculateTargetScrollOffset(_lyricsData, _playingLineIndex);
461+
var targetScroll = LyricsLayoutManager.CalculateTargetScrollOffset(_renderLyricsLines, _playingLineIndex);
461462
if (targetScroll.HasValue) _canvasTargetScrollOffset = targetScroll.Value;
462463

463464
_canvasYScrollTransition.SetEasingType(lyricsEffect.LyricsScrollEasingType);
@@ -471,7 +472,7 @@ private void Canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEv
471472
_mouseYScrollTransition.Update(elapsedTime);
472473

473474
_mouseHoverLineIndex = LyricsLayoutManager.FindMouseHoverLineIndex(
474-
_lyricsData?.LyricsLines,
475+
_renderLyricsLines,
475476
_isMouseInLyricsArea,
476477
_mousePosition,
477478
_canvasYScrollTransition.Value + _mouseYScrollTransition.Value,
@@ -481,18 +482,18 @@ private void Canvas_Update(ICanvasAnimatedControl sender, CanvasAnimatedUpdateEv
481482
);
482483

483484
_visibleRange = LyricsLayoutManager.CalculateVisibleRange(
484-
_lyricsData?.LyricsLines,
485+
_renderLyricsLines,
485486
_canvasYScrollTransition.Value + _mouseYScrollTransition.Value, // 当前滚动位置
486487
_renderLyricsStartY,
487488
_renderLyricsHeight,
488489
sender.Size.Height,
489490
lyricsStyle.PlayingLineTopOffset / 100.0
490491
);
491492

492-
var maxRange = LyricsLayoutManager.CalculateMaxRange(_lyricsData?.LyricsLines);
493+
var maxRange = LyricsLayoutManager.CalculateMaxRange(_renderLyricsLines);
493494

494495
_animator.UpdateLines(
495-
_lyricsData,
496+
_renderLyricsLines,
496497
_isMouseScrolling ? maxRange.Start : _visibleRange.Start,
497498
_isMouseScrolling ? maxRange.End : _visibleRange.End,
498499
_playingLineIndex,
@@ -591,11 +592,11 @@ private void DisposeAnalyzer()
591592

592593
private void TriggerRelayout()
593594
{
594-
if (_lyricsData == null || !_isLayoutChanged) return;
595+
if (_renderLyricsLines == null || !_isLayoutChanged) return;
595596

596597
LyricsLayoutManager.MeasureAndArrange(
597598
resourceCreator: Canvas,
598-
lyricsData: _lyricsData,
599+
lines: _renderLyricsLines,
599600
status: _liveStatesService.LiveStates.LyricsWindowStatus,
600601
appSettings: _settingsService.AppSettings,
601602
canvasWidth: Canvas.Size.Width,
@@ -611,6 +612,7 @@ private void UpdatePlaybackState(TimeSpan elapsedTime)
611612
{
612613
_songPosition += elapsedTime;
613614
_totalPlayedTime += elapsedTime;
615+
_songPositionWithOffset = _songPosition + TimeSpan.FromMilliseconds(_mediaSessionsService.CurrentMediaSourceProviderInfo?.PositionOffset ?? 0);
614616
CheckAndScrobbleLastFM();
615617
}
616618
}
@@ -632,7 +634,7 @@ private void CheckAndScrobbleLastFM()
632634

633635
private void ResetPlaybackState()
634636
{
635-
_totalPlayedTime = TimeSpan.Zero;
637+
_songPosition = TimeSpan.Zero;
636638
_totalPlayedTime = TimeSpan.Zero;
637639
_isLastFMTracked = false;
638640
}
@@ -694,7 +696,19 @@ public void Receive(PropertyChangedMessage<LyricsData?> message)
694696
{
695697
if (message.PropertyName == nameof(IMediaSessionsService.CurrentLyricsData))
696698
{
697-
_lyricsData = message.NewValue;
699+
_renderLyricsLines = null;
700+
if (_mediaSessionsService.CurrentLyricsData is LyricsData lyricsData)
701+
{
702+
_renderLyricsLines = lyricsData.LyricsLines.Select(x => new RenderLyricsLine()
703+
{
704+
LyricsSyllables = x.LyricsSyllables,
705+
StartMs = x.StartMs,
706+
EndMs = x.EndMs,
707+
PhoneticText = x.PhoneticText,
708+
OriginalText = x.OriginalText,
709+
TranslatedText = x.TranslatedText
710+
}).ToList();
711+
}
698712
_isLayoutChanged = true;
699713
}
700714
}

BetterLyrics.WinUI3/BetterLyrics.WinUI3/Extensions/PointExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ public static class PointExtensions
1111

1212
public Point AddX(double deltaX) => new(point.X + deltaX, point.Y);
1313
public Point AddY(double deltaY) => new(point.X, point.Y + deltaY);
14+
15+
public Point WithX(double x) => new(x, point.Y);
16+
public Point WithY(double y) => new(point.X, y);
1417
}
1518
}
1619
}

BetterLyrics.WinUI3/BetterLyrics.WinUI3/Hooks/WindowHook.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public static void MinimizeWindow<T>()
100100
public static void OpenOrShowWindow<T>()
101101
{
102102
var window = _activeWindows.Find(w => w is T);
103+
//window = null;
103104
if (window == null)
104105
{
105106
if (typeof(T) == typeof(NowPlayingWindow))
@@ -123,6 +124,10 @@ public static void OpenOrShowWindow<T>()
123124
{
124125
window = new LyricsWindowSwitchWindow();
125126
}
127+
else if (typeof(T) == typeof(SystemTrayWindow))
128+
{
129+
window = new SystemTrayWindow();
130+
}
126131
else
127132
{
128133
throw new ArgumentException("Unsupported window type", nameof(T));

BetterLyrics.WinUI3/BetterLyrics.WinUI3/Logic/LyricsAnimator.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using BetterLyrics.WinUI3.Models;
33
using BetterLyrics.WinUI3.Models.Settings;
44
using System;
5+
using System.Collections.Generic;
56
using System.Linq;
67
using Windows.UI;
78

@@ -13,7 +14,7 @@ public class LyricsAnimator
1314
private readonly double _highlightedScale = 1.0f;
1415

1516
public void UpdateLines(
16-
LyricsData? lyricsData,
17+
IList<RenderLyricsLine>? lines,
1718
int startIndex,
1819
int endIndex,
1920
int playingLineIndex,
@@ -31,14 +32,14 @@ public void UpdateLines(
3132
bool isMouseScrollingChanged
3233
)
3334
{
34-
if (lyricsData == null) return;
35+
if (lines == null) return;
3536

36-
var currentPlayingLine = lyricsData.LyricsLines.ElementAtOrDefault(playingLineIndex);
37+
var currentPlayingLine = lines.ElementAtOrDefault(playingLineIndex);
3738
if (currentPlayingLine == null) return;
3839

3940
for (int i = startIndex; i <= endIndex + 1; i++)
4041
{
41-
var line = lyricsData.LyricsLines.ElementAtOrDefault(i);
42+
var line = lines.ElementAtOrDefault(i);
4243
if (line == null) continue;
4344

4445
if (isLayoutChanged || isPlayingLineChanged || isMouseScrollingChanged)

0 commit comments

Comments
 (0)