mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
Use IAudioPlayerService as abstraction in TransportControls
This commit is contained in:
@@ -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());
|
||||||
|
}
|
||||||
@@ -19,20 +19,29 @@ namespace Microsoft.Zune.Playback
|
|||||||
private PlaybackItem m_currentSource;
|
private PlaybackItem m_currentSource;
|
||||||
private int _playbackId = 0;
|
private int _playbackId = 0;
|
||||||
|
|
||||||
public PlayerInteropAudioService(IModifiableFolder tempFolder)
|
public PlayerInteropAudioService(IModifiableFolder tempFolder) : this()
|
||||||
{
|
{
|
||||||
_tempFolder = tempFolder;
|
_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();
|
cacheFolderPath.Create();
|
||||||
_tempFolder = new SystemFolder(cacheFolderPath);
|
_tempFolder = new SystemFolder(cacheFolderPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PlayerInteropAudioService()
|
||||||
|
{
|
||||||
|
_playbackWrapper.Initialize();
|
||||||
|
}
|
||||||
|
|
||||||
public static PlayerInteropAudioService Instance => new();
|
public static PlayerInteropAudioService Instance => new();
|
||||||
|
|
||||||
|
public PlayerInterop PlaybackWrapper => _playbackWrapper;
|
||||||
|
|
||||||
public PlaybackItem CurrentSource
|
public PlaybackItem CurrentSource
|
||||||
{
|
{
|
||||||
get => m_currentSource;
|
get => m_currentSource;
|
||||||
@@ -45,7 +54,17 @@ namespace Microsoft.Zune.Playback
|
|||||||
|
|
||||||
public TimeSpan Position => new(_playbackWrapper.Position);
|
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;
|
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 _);
|
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;
|
DataRoot.Library.TracksChanged += LibraryTracksChanged;
|
||||||
|
|
||||||
await DataRoot.Library.PlayTrackCollectionAsync();
|
//await DataRoot.Library.PlayTrackCollectionAsync();
|
||||||
});
|
});
|
||||||
|
|
||||||
((ZuneUI.Shell)ZuneShell.DefaultInstance).ApplicationInitializationIsComplete = true;
|
((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.Iris;
|
||||||
using Microsoft.Zune.Shell;
|
using Microsoft.Zune.Playback;
|
||||||
using Microsoft.Zune.Util;
|
using Microsoft.Zune.Util;
|
||||||
using MicrosoftZunePlayback;
|
|
||||||
using StrixMusic.Sdk.MediaPlayback;
|
using StrixMusic.Sdk.MediaPlayback;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
@@ -9,19 +8,6 @@ namespace ZuneUI
|
|||||||
{
|
{
|
||||||
partial class TransportControls
|
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)
|
private async void OnPlayClicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!_play.Available)
|
if (!_play.Available)
|
||||||
@@ -30,13 +16,13 @@ namespace ZuneUI
|
|||||||
|
|
||||||
if (Playing || _playlistCurrent == null)
|
if (Playing || _playlistCurrent == null)
|
||||||
return;
|
return;
|
||||||
if (_lastKnownPlayerState != MCPlayerState.Closed)
|
if (_player.PlaybackState != PlaybackState.None)
|
||||||
{
|
{
|
||||||
SetPlayerState(PlayerState.Playing);
|
SetPlayerState(PlayerState.Playing);
|
||||||
|
|
||||||
if (_playbackHandler != null)
|
if (_player != null)
|
||||||
{
|
{
|
||||||
await _playbackHandler.ResumeAsync();
|
await _player.ResumeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PlayingVideo || _playlistCurrent.PlayNavigationOptions != PlayNavigationOptions.NavigateVideosToNowPlaying)
|
if (!PlayingVideo || _playlistCurrent.PlayNavigationOptions != PlayNavigationOptions.NavigateVideosToNowPlaying)
|
||||||
@@ -45,8 +31,7 @@ namespace ZuneUI
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_playlistPending != null)
|
_playlistPending?.Dispose();
|
||||||
_playlistPending.Dispose();
|
|
||||||
_playlistPending = _playlistCurrent;
|
_playlistPending = _playlistCurrent;
|
||||||
PlayPendingList();
|
PlayPendingList();
|
||||||
}
|
}
|
||||||
@@ -63,9 +48,9 @@ namespace ZuneUI
|
|||||||
|
|
||||||
SetPlayerState(PlayerState.Paused);
|
SetPlayerState(PlayerState.Paused);
|
||||||
|
|
||||||
if (_playbackHandler != null)
|
if (_player != null)
|
||||||
{
|
{
|
||||||
await _playbackHandler.PauseAsync();
|
await _player.PauseAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,10 +69,10 @@ namespace ZuneUI
|
|||||||
{
|
{
|
||||||
SetPlayerState(PlayerState.Stopped);
|
SetPlayerState(PlayerState.Stopped);
|
||||||
|
|
||||||
if (_playbackHandler != null)
|
if (_player != null)
|
||||||
{
|
{
|
||||||
await _playbackHandler.PauseAsync();
|
await _player.PauseAsync();
|
||||||
await _playbackHandler.SeekAsync(TimeSpan.Zero);
|
await _player.SeekAsync(TimeSpan.Zero);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -102,13 +87,14 @@ namespace ZuneUI
|
|||||||
|
|
||||||
if (_lastKnownPosition > 50000000L || !_playlistCurrent.CanRetreat)
|
if (_lastKnownPosition > 50000000L || !_playlistCurrent.CanRetreat)
|
||||||
{
|
{
|
||||||
await _playbackHandler.SeekAsync(TimeSpan.Zero);
|
await _player.SeekAsync(TimeSpan.Zero);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_playbackHandler != null)
|
if (_player != null)
|
||||||
{
|
{
|
||||||
await _playbackHandler.PreviousAsync();
|
// TODO: Play previous track
|
||||||
|
//await _player.PreviousAsync();
|
||||||
}
|
}
|
||||||
SetUriOnPlayer();
|
SetUriOnPlayer();
|
||||||
}
|
}
|
||||||
@@ -122,14 +108,15 @@ namespace ZuneUI
|
|||||||
|
|
||||||
if (_currentTrack != null && _currentTrack.IsVideo)
|
if (_currentTrack != null && _currentTrack.IsVideo)
|
||||||
return;
|
return;
|
||||||
if (_lastKnownPlaybackTrack != null)
|
_lastKnownPlaybackTrack?.OnSkip();
|
||||||
_lastKnownPlaybackTrack.OnSkip();
|
|
||||||
if (_playlistCurrent.CanAdvance)
|
if (_playlistCurrent.CanAdvance)
|
||||||
{
|
{
|
||||||
if (_playbackHandler != null && _playbackHandler.NextItems.Count > 0)
|
// TODO: Play next track
|
||||||
{
|
//if (_player != null && _player.NextItems.Count > 0)
|
||||||
await _playbackHandler.NextAsync();
|
//{
|
||||||
}
|
// await _player.NextAsync();
|
||||||
|
//}
|
||||||
|
|
||||||
SetUriOnPlayer();
|
SetUriOnPlayer();
|
||||||
}
|
}
|
||||||
@@ -137,19 +124,19 @@ namespace ZuneUI
|
|||||||
{
|
{
|
||||||
SetPlayerState(PlayerState.Stopped);
|
SetPlayerState(PlayerState.Stopped);
|
||||||
|
|
||||||
if (_playbackHandler != null)
|
if (_player != null)
|
||||||
{
|
await _player.StopAsync();
|
||||||
await _playbackHandler.PauseAsync();
|
|
||||||
await _playbackHandler.SeekAsync(TimeSpan.Zero);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
// NOTE: This currently does not work. Perhaps something to do with
|
||||||
// the lack of a valid media ID?
|
// the lack of a valid media ID?
|
||||||
|
|
||||||
|
if (e.Track is null)
|
||||||
|
return;
|
||||||
|
|
||||||
string title = $"[Strix] {e.Track.Name}";
|
string title = $"[Strix] {e.Track.Name}";
|
||||||
int num = e.Track.TrackNumber ?? 0;
|
int num = e.Track.TrackNumber ?? 0;
|
||||||
string album = e.Track.Album?.Name ?? string.Empty;
|
string album = e.Track.Album?.Name ?? string.Empty;
|
||||||
|
|||||||
Reference in New Issue
Block a user