From b3c6bea39c5302163a131b8576fa5ffb1d310b17 Mon Sep 17 00:00:00 2001 From: William Pereira Date: Mon, 8 Jul 2024 23:42:39 -0400 Subject: [PATCH] feature: subtune support! --- .../PlaySubtune/PlaySubtuneHandler.cs | 31 +++++ .../Music/Sid/SidMetadataService.cs | 5 +- .../src/TeensyRom.Core/Music/Sid/SidRecord.cs | 3 +- .../TeensyRom.Core/Music/Sid/SidRecordMap.cs | 2 +- .../src/TeensyRom.Core/Serial/TeensyToken.cs | 1 + .../Storage/Entities/SongItem.cs | 3 + .../Controls/PlayToolbar/PlayToolbarView.xaml | 65 ++++++++-- .../PlayToolbar/PlayToolbarViewModel.cs | 122 +++++++++++++++--- .../Features/Discover/DiscoverViewModel.cs | 3 +- .../Discover/State/Player/IPlayerContext.cs | 1 + .../Discover/State/Player/PlayerContext.cs | 7 + .../src/TeensyRom.Ui/TeensyRom.Ui.csproj | 2 +- 12 files changed, 209 insertions(+), 36 deletions(-) create mode 100644 Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Commands/PlaySubtune/PlaySubtuneHandler.cs diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Commands/PlaySubtune/PlaySubtuneHandler.cs b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Commands/PlaySubtune/PlaySubtuneHandler.cs new file mode 100644 index 00000000..67a91ea4 --- /dev/null +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Commands/PlaySubtune/PlaySubtuneHandler.cs @@ -0,0 +1,31 @@ +using MediatR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using TeensyRom.Core.Commands.File.LaunchFile; +using TeensyRom.Core.Serial.State; +using TeensyRom.Core.Serial; + +namespace TeensyRom.Core.Commands.PlaySubtune +{ + public class PlaySubtuneCommand (int subtuneIndex) : IRequest + { + public int SubtuneIndex { get; } = subtuneIndex; + } + + public class PlaySubtuneResult : TeensyCommandResult; + + public class PlaySubtuneHandler(ISerialStateContext serialState) : IRequestHandler + { + public async Task Handle(PlaySubtuneCommand request, CancellationToken cancellationToken) + { + serialState.ClearBuffers(); + serialState.SendIntBytes(TeensyToken.PlaySubtune, 2); + serialState.SendIntBytes((uint)request.SubtuneIndex - 1, 1); + serialState.HandleAck(); + return new PlaySubtuneResult(); + } + } +} diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidMetadataService.cs b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidMetadataService.cs index 7722a6d9..e77b91dd 100644 --- a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidMetadataService.cs +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidMetadataService.cs @@ -91,6 +91,8 @@ private void EnrichWithHsvcMetadata(SongItem song, SidRecord? sidRecord) song.Creator = sidRecord.Author; song.Title = sidRecord.Title; song.PlayLength = sidRecord.SongLengthSpan; + song.StartSubtuneNum = sidRecord.StartSong; + song.SubtuneLengths = sidRecord.SubTuneSongLengths.Select(s => s).ToList(); song.ReleaseInfo = sidRecord.Released; song.Meta1 = sidRecord.Clock; song.Meta2 = sidRecord.SidModel; @@ -194,8 +196,9 @@ private static Dictionary ParseSids(Dictionary SubTuneSongLengths = []; public int SizeInBytes { get; set; } //public string InitAddr { get; set; } = string.Empty; //public string PlayAddr { get; set; } = string.Empty; diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidRecordMap.cs b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidRecordMap.cs index fac5d519..4c611913 100644 --- a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidRecordMap.cs +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Music/Sid/SidRecordMap.cs @@ -15,7 +15,7 @@ public SidRecordMap() Map(m => m.Author).Name("AUTHOR"); Map(m => m.Released).Name("RELEASED"); //Map(m => m.Songs).Name("SONGS"); - //Map(m => m.StartSong).Name("STARTSONG"); + Map(m => m.StartSong).Name("STARTSONG"); Map(m => m.SongLength).Name("SONGLEN (per tune)"); Map(m => m.SizeInBytes).Name("SIZE (in bytes)"); //Map(m => m.InitAddr).Name("INITADDR"); diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Serial/TeensyToken.cs b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Serial/TeensyToken.cs index a1b4e007..60adc2bb 100644 --- a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Serial/TeensyToken.cs +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Serial/TeensyToken.cs @@ -9,6 +9,7 @@ public sealed class TeensyToken : SmartEnum public static readonly TeensyToken StartDirectoryList = new(0x5A5A, nameof(StartDirectoryList)); public static readonly TeensyToken EndDirectoryList = new(0xA5A5, nameof(EndDirectoryList)); public static readonly TeensyToken LaunchFile = new(0x6444, nameof(LaunchFile)); + public static readonly TeensyToken PlaySubtune = new(0x6488, nameof(PlaySubtune)); public static readonly TeensyToken SendFile = new(0x64BB, nameof(SendFile)); public static readonly TeensyToken CopyFile = new(0x64FF, nameof(CopyFile)); public static readonly TeensyToken GetFile = new(0x64B0, nameof(GetFile)); diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Storage/Entities/SongItem.cs b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Storage/Entities/SongItem.cs index 22dfaf1d..162a9e8e 100644 --- a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Storage/Entities/SongItem.cs +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Core/Storage/Entities/SongItem.cs @@ -1,5 +1,6 @@ using System; using System.Numerics; +using System.Text.Json.Serialization; using TeensyRom.Core.Common; namespace TeensyRom.Core.Storage.Entities @@ -7,6 +8,8 @@ namespace TeensyRom.Core.Storage.Entities public class SongItem : FileItem, ILaunchableItem, IViewableItem { public TimeSpan PlayLength { get; set; } = TimeSpan.FromMinutes(3); + public List SubtuneLengths { get; set; } = []; + public int StartSubtuneNum { get; set; } public List Images { get; init; } = []; public SongItem() diff --git a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Ui/Controls/PlayToolbar/PlayToolbarView.xaml b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Ui/Controls/PlayToolbar/PlayToolbarView.xaml index 85213a3d..e5ef69d3 100644 --- a/Source/Windows/TeensyRom.Ui/src/TeensyRom.Ui/Controls/PlayToolbar/PlayToolbarView.xaml +++ b/Source/Windows/TeensyRom.Ui/src/TeensyRom.Ui/Controls/PlayToolbar/PlayToolbarView.xaml @@ -21,6 +21,7 @@ + @@ -134,7 +135,48 @@ - + + + + + + + + + @@ -146,7 +188,7 @@ - + + - - -