Use IAudioPlayerService as abstraction in TransportControls

This commit is contained in:
Yoshi Askharoun
2023-05-07 21:56:54 -05:00
parent 5d801a7166
commit 345e2652c8
6 changed files with 286 additions and 166 deletions
@@ -0,0 +1,28 @@
using StrixMusic.Sdk.MediaPlayback;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace Microsoft.Zune.Playback;
public static class AudioServiceExtensions
{
public static async Task StopAsync(this IAudioPlayerService player, CancellationToken cancellationToken = default)
{
await player.PauseAsync(cancellationToken);
await player.SeekAsync(TimeSpan.Zero, cancellationToken);
}
public static void Stop(this IAudioPlayerService player) => AsyncHelper.Run(player.StopAsync());
public static Task MuteAsync(this IAudioPlayerService player, CancellationToken cancellationToken = default)
=> player.ChangeVolumeAsync(0.0, cancellationToken);
public static void Mute(this IAudioPlayerService player) => AsyncHelper.Run(player.MuteAsync());
public static void PlaySync(this IAudioPlayerService player, PlaybackItem item) => AsyncHelper.Run(player.Play(item));
public static void PreloadSync(this IAudioPlayerService player, PlaybackItem item) => AsyncHelper.Run(player.Preload(item));
public static void Resume(this IAudioPlayerService player) => AsyncHelper.Run(player.ResumeAsync());
}
+30 -5
View File
@@ -19,20 +19,29 @@ namespace Microsoft.Zune.Playback
private PlaybackItem m_currentSource;
private int _playbackId = 0;
public PlayerInteropAudioService(IModifiableFolder tempFolder)
public PlayerInteropAudioService(IModifiableFolder tempFolder) : this()
{
_tempFolder = tempFolder;
}
public PlayerInteropAudioService()
public PlayerInteropAudioService(string? path = null) : this()
{
DirectoryInfo cacheFolderPath = new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Zune\OpenZune\PlayerInteropTemp"));
path ??= Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Zune\OpenZune\PlayerInteropTemp");
DirectoryInfo cacheFolderPath = new(path);
cacheFolderPath.Create();
_tempFolder = new SystemFolder(cacheFolderPath);
}
private PlayerInteropAudioService()
{
_playbackWrapper.Initialize();
}
public static PlayerInteropAudioService Instance => new();
public PlayerInterop PlaybackWrapper => _playbackWrapper;
public PlaybackItem CurrentSource
{
get => m_currentSource;
@@ -45,7 +54,17 @@ namespace Microsoft.Zune.Playback
public TimeSpan Position => new(_playbackWrapper.Position);
public PlaybackState PlaybackState => throw new NotImplementedException();
public PlaybackState PlaybackState => _playbackWrapper.TransportState switch
{
MCTransportState.Playing => PlaybackState.Playing,
MCTransportState.Paused or
MCTransportState.Stopped => PlaybackState.Paused,
MCTransportState.Buffering => PlaybackState.Loading,
MCTransportState.Invalid or _ => PlaybackState.None,
};
public double Volume => _playbackWrapper.Volume / 100d;
@@ -147,7 +166,13 @@ namespace Microsoft.Zune.Playback
}
}
return new(url, ++_playbackId);
int playbackId;
if (mediaConfig is ZuneMediaSourceConfig zuneSrcCfg)
playbackId = zuneSrcCfg.PlaybackId;
else
playbackId = ++_playbackId;
return new(url, playbackId);
}
private static bool IsValidUri(string? url) => Uri.TryCreate(url, UriKind.Absolute, out _);
@@ -0,0 +1,38 @@
using StrixMusic.Sdk.CoreModels;
using StrixMusic.Sdk.MediaPlayback;
using System;
using System.IO;
namespace Microsoft.Zune.Playback;
public class ZuneMediaSourceConfig : IMediaSourceConfig
{
public ZuneMediaSourceConfig(string uri, int playbackId)
{
MediaSourceUri = new(uri);
Id = uri;
PlaybackId = playbackId;
}
public ICoreTrack Track => null;
public string Id { get; private set; }
public int PlaybackId { get; private set; }
public Uri MediaSourceUri { get; private set; }
public Stream FileStreamSource => null;
public string FileStreamContentType => null;
public DateTime? ExpirationDate => null;
public static PlaybackItem CreatePlaybackItem(string uri, int playbackId)
{
return new()
{
MediaConfig = new ZuneMediaSourceConfig(uri, playbackId)
};
}
}
@@ -179,7 +179,7 @@ namespace Microsoft.Zune.Shell
DataRoot.Library.TracksChanged += LibraryTracksChanged;
await DataRoot.Library.PlayTrackCollectionAsync();
//await DataRoot.Library.PlayTrackCollectionAsync();
});
((ZuneUI.Shell)ZuneShell.DefaultInstance).ApplicationInitializationIsComplete = true;
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,6 @@
using Microsoft.Iris;
using Microsoft.Zune.Shell;
using Microsoft.Zune.Playback;
using Microsoft.Zune.Util;
using MicrosoftZunePlayback;
using StrixMusic.Sdk.MediaPlayback;
using System;
@@ -9,19 +8,6 @@ namespace ZuneUI
{
partial class TransportControls
{
private IPlaybackHandlerService _playbackHandler;
private void OnInit()
{
_playbackHandler = ZuneApplication.PlaybackHandler;
_playbackHandler.CurrentItemChanged += PlaybackHandler_CurrentItemChanged;
}
private void OnUninit()
{
_playbackHandler.CurrentItemChanged -= PlaybackHandler_CurrentItemChanged;
}
private async void OnPlayClicked(object sender, EventArgs e)
{
if (!_play.Available)
@@ -30,13 +16,13 @@ namespace ZuneUI
if (Playing || _playlistCurrent == null)
return;
if (_lastKnownPlayerState != MCPlayerState.Closed)
if (_player.PlaybackState != PlaybackState.None)
{
SetPlayerState(PlayerState.Playing);
if (_playbackHandler != null)
if (_player != null)
{
await _playbackHandler.ResumeAsync();
await _player.ResumeAsync();
}
if (!PlayingVideo || _playlistCurrent.PlayNavigationOptions != PlayNavigationOptions.NavigateVideosToNowPlaying)
@@ -45,8 +31,7 @@ namespace ZuneUI
}
else
{
if (_playlistPending != null)
_playlistPending.Dispose();
_playlistPending?.Dispose();
_playlistPending = _playlistCurrent;
PlayPendingList();
}
@@ -63,9 +48,9 @@ namespace ZuneUI
SetPlayerState(PlayerState.Paused);
if (_playbackHandler != null)
if (_player != null)
{
await _playbackHandler.PauseAsync();
await _player.PauseAsync();
}
}
@@ -84,10 +69,10 @@ namespace ZuneUI
{
SetPlayerState(PlayerState.Stopped);
if (_playbackHandler != null)
if (_player != null)
{
await _playbackHandler.PauseAsync();
await _playbackHandler.SeekAsync(TimeSpan.Zero);
await _player.PauseAsync();
await _player.SeekAsync(TimeSpan.Zero);
}
}
else
@@ -102,13 +87,14 @@ namespace ZuneUI
if (_lastKnownPosition > 50000000L || !_playlistCurrent.CanRetreat)
{
await _playbackHandler.SeekAsync(TimeSpan.Zero);
await _player.SeekAsync(TimeSpan.Zero);
}
else
{
if (_playbackHandler != null)
if (_player != null)
{
await _playbackHandler.PreviousAsync();
// TODO: Play previous track
//await _player.PreviousAsync();
}
SetUriOnPlayer();
}
@@ -122,14 +108,15 @@ namespace ZuneUI
if (_currentTrack != null && _currentTrack.IsVideo)
return;
if (_lastKnownPlaybackTrack != null)
_lastKnownPlaybackTrack.OnSkip();
_lastKnownPlaybackTrack?.OnSkip();
if (_playlistCurrent.CanAdvance)
{
if (_playbackHandler != null && _playbackHandler.NextItems.Count > 0)
{
await _playbackHandler.NextAsync();
}
// TODO: Play next track
//if (_player != null && _player.NextItems.Count > 0)
//{
// await _player.NextAsync();
//}
SetUriOnPlayer();
}
@@ -137,19 +124,19 @@ namespace ZuneUI
{
SetPlayerState(PlayerState.Stopped);
if (_playbackHandler != null)
{
await _playbackHandler.PauseAsync();
await _playbackHandler.SeekAsync(TimeSpan.Zero);
}
if (_player != null)
await _player.StopAsync();
}
}
private async void PlaybackHandler_CurrentItemChanged(object sender, PlaybackItem e)
private async void Player_CurrentItemChanged(object sender, PlaybackItem e)
{
// NOTE: This currently does not work. Perhaps something to do with
// the lack of a valid media ID?
if (e.Track is null)
return;
string title = $"[Strix] {e.Track.Name}";
int num = e.Track.TrackNumber ?? 0;
string album = e.Track.Album?.Name ?? string.Empty;