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 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;
|
||||
|
||||
Reference in New Issue
Block a user