Skip to content

Commit

Permalink
Handle SMTC command
Browse files Browse the repository at this point in the history
  • Loading branch information
cjw1115 committed Jul 21, 2020
1 parent c0b5ddb commit 6597c11
Show file tree
Hide file tree
Showing 5 changed files with 76 additions and 18 deletions.
2 changes: 2 additions & 0 deletions AilianBT/Constant/Definition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
}
55 changes: 46 additions & 9 deletions AilianBT/Services/MusicManager.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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)
Expand All @@ -48,8 +63,8 @@ private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object
public event Action<MusicModel> MediaFailed;
public event Action<MusicModel> MediaCached;
public event Action<TimeSpan, TimeSpan> PositionChanged;
public event Action<SMTCCommandType> SMTCCommandReceived;


#region MediaPlaybackList callbacks
private void _mediaPlaybackListItemOpened(MediaPlaybackList sender, MediaPlaybackItemOpenedEventArgs args)
{
Expand Down Expand Up @@ -156,6 +171,7 @@ public async Task Seek(TimeSpan position)
{
_mediaPlayer.PlaybackSession.Position = position;
}

private async Task _play(MusicModel model)
{
try
Expand Down Expand Up @@ -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<MediaPlaybackItem> _cacheMusic(MusicModel model)
{
if (!CachedMusicList.Any(m => m.Title == model.Title))
Expand All @@ -202,5 +213,31 @@ private async Task<MediaPlaybackItem> _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
}
}
6 changes: 1 addition & 5 deletions AilianBT/Services/MusicService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -15,7 +14,6 @@
using Windows.Networking.BackgroundTransfer;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.WindowManagement;

namespace AilianBT.Services
{
Expand All @@ -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)
{
Expand All @@ -43,7 +41,6 @@ public MusicService(UtilityHelper utilityHelper,LogService logger, StorageServic
}

#region Playlist

public async Task<IList<MusicModel>> GetNetPlayListAsync()
{
var musicList = new List<MusicModel>();
Expand Down Expand Up @@ -129,7 +126,6 @@ public async Task CachePlayListAsync(IList<MusicModel> playlist)
}
#endregion

private const string DOWNLOAD_GROUP_NAME = "MusicCaching";
private void _initDownloader()
{
_backgroundDownloader = new BackgroundDownloader();
Expand Down
25 changes: 25 additions & 0 deletions AilianBT/ViewModels/PlayerViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public PlayerViewModel()
_musicManager.MediaLoaded += _musicManagerMediaLoaded;
_musicManager.MediaEnd += _musicManagerMediaEnd;
_musicManager.MediaFailed += _musicManagerMediaFailed;
_musicManager.SMTCCommandReceived += _musicManagerSMTCCommandReceived;
}

public void SetMusicList(Collection<MusicModel> musicList)
Expand Down Expand Up @@ -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
}
}
6 changes: 2 additions & 4 deletions AilianBT/Views/MusicView.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,7 @@
Text="{x:Bind Title, Mode=OneWay}"
TextWrapping="Wrap" />
<TextBlock Grid.Column="2"
Width="40"
Margin="4"
Margin="16,0"
VerticalAlignment="Center"
FontFamily="{StaticResource FontAwesome}"
FontSize="16"
Expand All @@ -63,8 +62,7 @@
Visibility="{Binding Path=Visibility, ElementName=tbIconCached, Converter={StaticResource VisibilityInverseConverter}}" />
<TextBlock x:Name="tbIconCached"
Grid.Column="2"
Width="40"
Margin="4"
Margin="16,0"
VerticalAlignment="Center"
FontFamily="{StaticResource FontAwesome}"
FontSize="16"
Expand Down

0 comments on commit 6597c11

Please sign in to comment.