From 6597c1162c925baf6c47ff9902c962b9b5786d01 Mon Sep 17 00:00:00 2001 From: CQ Chen Date: Wed, 22 Jul 2020 01:41:09 +0800 Subject: [PATCH] Handle SMTC command --- AilianBT/Constant/Definition.cs | 2 + AilianBT/Services/MusicManager.cs | 55 +++++++++++++++++++++----- AilianBT/Services/MusicService.cs | 6 +-- AilianBT/ViewModels/PlayerViewModel.cs | 25 ++++++++++++ AilianBT/Views/MusicView.xaml | 6 +-- 5 files changed, 76 insertions(+), 18 deletions(-) diff --git a/AilianBT/Constant/Definition.cs b/AilianBT/Constant/Definition.cs index da73f0a..9c93960 100644 --- a/AilianBT/Constant/Definition.cs +++ b/AilianBT/Constant/Definition.cs @@ -12,5 +12,7 @@ public class Definition public const string SETTING_MAGNET_AUTO_DOWNLOAD_PROTOCAL_THUNDER = "thunder://"; public const double WINDOW_MODE_WIDE_WIDTH = 768; + + public const string MUSIC_DOWNLOAD_GROUP_NAME = "MusicCaching"; } } diff --git a/AilianBT/Services/MusicManager.cs b/AilianBT/Services/MusicManager.cs index 159702a..262e8dd 100644 --- a/AilianBT/Services/MusicManager.cs +++ b/AilianBT/Services/MusicManager.cs @@ -1,19 +1,24 @@ using AilianBT.Models; using GalaSoft.MvvmLight.Ioc; -using Microsoft.EntityFrameworkCore.Query.Internal; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Windows.Media; using Windows.Media.Core; using Windows.Media.Playback; -using Windows.UI.WebUI; namespace AilianBT.Services { + public enum SMTCCommandType + { + Play, + Pause, + Previous, + Next + } + public class MusicManager { private MediaPlayer _mediaPlayer; @@ -36,6 +41,16 @@ public MusicManager() _mediaPlayer.Source = _mediaPlaybackList; _mediaPlayer.PlaybackSession.PositionChanged += PlaybackSession_PositionChanged; _mediaPlayer.MediaEnded += _mediaPlayerMediaEnded; + + _mediaPlayer.CommandManager.PlayBehavior.EnablingRule = MediaCommandEnablingRule.Always; + _mediaPlayer.CommandManager.PauseBehavior.EnablingRule = MediaCommandEnablingRule.Always; + _mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Always; + _mediaPlayer.CommandManager.PreviousBehavior.EnablingRule = MediaCommandEnablingRule.Always; + + _mediaPlayer.CommandManager.PlayReceived += _commandManagerPlayReceived; + _mediaPlayer.CommandManager.PauseReceived += _commandManagerPauseReceived; + _mediaPlayer.CommandManager.NextReceived += _commandManagerNextReceived; + _mediaPlayer.CommandManager.PreviousReceived += _commandManagerPreviousReceived; } private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args) @@ -48,8 +63,8 @@ private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object public event Action MediaFailed; public event Action MediaCached; public event Action PositionChanged; + public event Action SMTCCommandReceived; - #region MediaPlaybackList callbacks private void _mediaPlaybackListItemOpened(MediaPlaybackList sender, MediaPlaybackItemOpenedEventArgs args) { @@ -156,6 +171,7 @@ public async Task Seek(TimeSpan position) { _mediaPlayer.PlaybackSession.Position = position; } + private async Task _play(MusicModel model) { try @@ -189,11 +205,6 @@ private async Task _play(MusicModel model) return index; } - private MediaPlaybackItem _createPlaceholderItem() - { - return new MediaPlaybackItem(MediaSource.CreateFromUri(new Uri("cq://cq"))); - } - private async Task _cacheMusic(MusicModel model) { if (!CachedMusicList.Any(m => m.Title == model.Title)) @@ -202,5 +213,31 @@ private async Task _cacheMusic(MusicModel model) } return await Add(model); } + + #region SMTC commnad + private void _commandManagerPreviousReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPreviousReceivedEventArgs args) + { + args.Handled = true; + SMTCCommandReceived?.Invoke(SMTCCommandType.Previous); + } + + private void _commandManagerNextReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerNextReceivedEventArgs args) + { + args.Handled = true; + SMTCCommandReceived?.Invoke(SMTCCommandType.Next); + } + + private void _commandManagerPauseReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPauseReceivedEventArgs args) + { + args.Handled = true; + SMTCCommandReceived?.Invoke(SMTCCommandType.Pause); + } + + private void _commandManagerPlayReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPlayReceivedEventArgs args) + { + args.Handled = true; + SMTCCommandReceived?.Invoke(SMTCCommandType.Play); + } + #endregion } } diff --git a/AilianBT/Services/MusicService.cs b/AilianBT/Services/MusicService.cs index 1809012..d8fd889 100644 --- a/AilianBT/Services/MusicService.cs +++ b/AilianBT/Services/MusicService.cs @@ -2,7 +2,6 @@ using AilianBT.Constant; using AilianBT.Helpers; using AilianBT.Models; -using Microsoft.EntityFrameworkCore.Internal; using System; using System.Collections.Generic; using System.IO; @@ -15,7 +14,6 @@ using Windows.Networking.BackgroundTransfer; using Windows.Storage; using Windows.Storage.Streams; -using Windows.UI.WindowManagement; namespace AilianBT.Services { @@ -31,7 +29,7 @@ public class MusicService private StorageService _storageService; private BackgroundDownloader _backgroundDownloader; - private BackgroundTransferGroup _backgroundDownloaderGroup = BackgroundTransferGroup.CreateGroup(DOWNLOAD_GROUP_NAME); + private BackgroundTransferGroup _backgroundDownloaderGroup = BackgroundTransferGroup.CreateGroup(Definition.MUSIC_DOWNLOAD_GROUP_NAME); public MusicService(UtilityHelper utilityHelper,LogService logger, StorageService storageService) { @@ -43,7 +41,6 @@ public MusicService(UtilityHelper utilityHelper,LogService logger, StorageServic } #region Playlist - public async Task> GetNetPlayListAsync() { var musicList = new List(); @@ -129,7 +126,6 @@ public async Task CachePlayListAsync(IList playlist) } #endregion - private const string DOWNLOAD_GROUP_NAME = "MusicCaching"; private void _initDownloader() { _backgroundDownloader = new BackgroundDownloader(); diff --git a/AilianBT/ViewModels/PlayerViewModel.cs b/AilianBT/ViewModels/PlayerViewModel.cs index 1420290..9815ea5 100644 --- a/AilianBT/ViewModels/PlayerViewModel.cs +++ b/AilianBT/ViewModels/PlayerViewModel.cs @@ -20,6 +20,7 @@ public PlayerViewModel() _musicManager.MediaLoaded += _musicManagerMediaLoaded; _musicManager.MediaEnd += _musicManagerMediaEnd; _musicManager.MediaFailed += _musicManagerMediaFailed; + _musicManager.SMTCCommandReceived += _musicManagerSMTCCommandReceived; } public void SetMusicList(Collection musicList) @@ -226,6 +227,30 @@ private void _playbackPositionChanged(TimeSpan position, TimeSpan length) }, null); } } + + private void _musicManagerSMTCCommandReceived(SMTCCommandType command) + { + SynchronizationContext.Post((o) => + { + switch (command) + { + case SMTCCommandType.Play: + PlayClicked(); + break; + case SMTCCommandType.Pause: + PauseClicked(); + break; + case SMTCCommandType.Previous: + PreviousClicked(); + break; + case SMTCCommandType.Next: + NextClicked(); + break; + default: + break; + } + }, null); + } #endregion } } \ No newline at end of file diff --git a/AilianBT/Views/MusicView.xaml b/AilianBT/Views/MusicView.xaml index 60cb723..bb84ce6 100644 --- a/AilianBT/Views/MusicView.xaml +++ b/AilianBT/Views/MusicView.xaml @@ -51,8 +51,7 @@ Text="{x:Bind Title, Mode=OneWay}" TextWrapping="Wrap" />