mirror of
https://github.com/ZuneDev/ZuneShell.dll.git
synced 2026-07-27 13:11:51 -07:00
Finish PlayerInteropAudioService
This commit is contained in:
@@ -1,8 +1,12 @@
|
|||||||
#if OPENZUNE
|
#if OPENZUNE
|
||||||
|
|
||||||
|
using CommunityToolkit.Diagnostics;
|
||||||
using MicrosoftZunePlayback;
|
using MicrosoftZunePlayback;
|
||||||
|
using OwlCore.Storage;
|
||||||
|
using OwlCore.Storage.SystemIO;
|
||||||
using StrixMusic.Sdk.MediaPlayback;
|
using StrixMusic.Sdk.MediaPlayback;
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
@@ -11,8 +15,33 @@ namespace Microsoft.Zune.Playback
|
|||||||
public class PlayerInteropAudioService : IAudioPlayerService
|
public class PlayerInteropAudioService : IAudioPlayerService
|
||||||
{
|
{
|
||||||
private readonly PlayerInterop _playbackWrapper = PlayerInterop.Instance;
|
private readonly PlayerInterop _playbackWrapper = PlayerInterop.Instance;
|
||||||
|
private readonly IModifiableFolder _tempFolder;
|
||||||
|
private PlaybackItem m_currentSource;
|
||||||
|
private int _playbackId = 0;
|
||||||
|
|
||||||
public PlaybackItem CurrentSource { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
public PlayerInteropAudioService(IModifiableFolder tempFolder)
|
||||||
|
{
|
||||||
|
_tempFolder = tempFolder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerInteropAudioService()
|
||||||
|
{
|
||||||
|
DirectoryInfo cacheFolderPath = new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Zune\OpenZune\PlayerInteropTemp"));
|
||||||
|
cacheFolderPath.Create();
|
||||||
|
_tempFolder = new SystemFolder(cacheFolderPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PlayerInteropAudioService Instance => new();
|
||||||
|
|
||||||
|
public PlaybackItem CurrentSource
|
||||||
|
{
|
||||||
|
get => m_currentSource;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
m_currentSource = value;
|
||||||
|
CurrentSourceChanged?.Invoke(this, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public TimeSpan Position => new(_playbackWrapper.Position);
|
public TimeSpan Position => new(_playbackWrapper.Position);
|
||||||
|
|
||||||
@@ -20,7 +49,7 @@ namespace Microsoft.Zune.Playback
|
|||||||
|
|
||||||
public double Volume => _playbackWrapper.Volume / 100d;
|
public double Volume => _playbackWrapper.Volume / 100d;
|
||||||
|
|
||||||
public double PlaybackSpeed => 1.0d;
|
public double PlaybackSpeed => _playbackWrapper.Rate;
|
||||||
|
|
||||||
public event EventHandler<PlaybackItem> CurrentSourceChanged;
|
public event EventHandler<PlaybackItem> CurrentSourceChanged;
|
||||||
public event EventHandler<float[]> QuantumProcessed;
|
public event EventHandler<float[]> QuantumProcessed;
|
||||||
@@ -31,7 +60,8 @@ namespace Microsoft.Zune.Playback
|
|||||||
|
|
||||||
public Task ChangePlaybackSpeedAsync(double speed, CancellationToken cancellationToken = default)
|
public Task ChangePlaybackSpeedAsync(double speed, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
_playbackWrapper.Rate = (float)speed;
|
||||||
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task ChangeVolumeAsync(double volume, CancellationToken cancellationToken = default)
|
public Task ChangeVolumeAsync(double volume, CancellationToken cancellationToken = default)
|
||||||
@@ -46,15 +76,29 @@ namespace Microsoft.Zune.Playback
|
|||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Play(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
|
public async Task Play(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
_playbackWrapper.Play();
|
var media = await LoadAsync(sourceConfig.MediaConfig);
|
||||||
return Task.CompletedTask;
|
|
||||||
|
Iris.Application.DeferredInvoke(new Iris.DeferredInvokeHandler(delegate
|
||||||
|
{
|
||||||
|
// Play cannot be called immediately after SetUri,
|
||||||
|
// so we have to listen for when the change is done.
|
||||||
|
_playbackWrapper.UriSet += PlaybackWrapper_UriSet;
|
||||||
|
_playbackWrapper.SetUri(media.Uri, 0, media.Id);
|
||||||
|
}), Iris.DeferredInvokePriority.Normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task Preload(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
|
private void PlaybackWrapper_UriSet(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
_playbackWrapper.UriSet -= PlaybackWrapper_UriSet;
|
||||||
|
_playbackWrapper.Play();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task Preload(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var media = await LoadAsync(sourceConfig.MediaConfig);
|
||||||
|
_playbackWrapper.SetNextUri(media.Uri, 0, media.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task ResumeAsync(CancellationToken cancellationToken = default)
|
public Task ResumeAsync(CancellationToken cancellationToken = default)
|
||||||
@@ -69,6 +113,53 @@ namespace Microsoft.Zune.Playback
|
|||||||
_playbackWrapper.SeekToAbsolutePosition(position.Ticks);
|
_playbackWrapper.SeekToAbsolutePosition(position.Ticks);
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task<PlayerInteropMedia> LoadAsync(IMediaSourceConfig mediaConfig, bool saveStream = true)
|
||||||
|
{
|
||||||
|
Guard.IsNotNull(mediaConfig);
|
||||||
|
|
||||||
|
mediaConfig.FileStreamSource?.Dispose();
|
||||||
|
|
||||||
|
var url = mediaConfig.MediaSourceUri?.ToString();
|
||||||
|
if (url is null)
|
||||||
|
{
|
||||||
|
if (IsValidUri(mediaConfig.Id))
|
||||||
|
{
|
||||||
|
url = mediaConfig.Id;
|
||||||
|
}
|
||||||
|
else if (saveStream && mediaConfig.FileStreamSource is not null)
|
||||||
|
{
|
||||||
|
var dstFile = await _tempFolder.CreateFileAsync(mediaConfig.Id, true);
|
||||||
|
using (var stream = await dstFile.OpenStreamAsync(FileAccess.ReadWrite))
|
||||||
|
{
|
||||||
|
await mediaConfig.FileStreamSource.CopyToAsync(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
Guard.IsTrue(IsValidUri(url));
|
||||||
|
url = dstFile.Id;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new ArgumentException("PlayerInterop can only load media from a URI.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new(url, ++_playbackId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool IsValidUri(string? url) => Uri.TryCreate(url, UriKind.Absolute, out _);
|
||||||
|
|
||||||
|
private readonly struct PlayerInteropMedia
|
||||||
|
{
|
||||||
|
public PlayerInteropMedia(string uri, int id)
|
||||||
|
{
|
||||||
|
Uri = uri;
|
||||||
|
Id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Uri { get; }
|
||||||
|
public int Id { get; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -182,9 +182,9 @@ namespace Microsoft.Zune.Shell
|
|||||||
|
|
||||||
// Perform any async initialization needed. Authenticating, connecting to database, etc.
|
// Perform any async initialization needed. Authenticating, connecting to database, etc.
|
||||||
// Add plugins
|
// Add plugins
|
||||||
string mfAudioServiceId = Guid.NewGuid().ToString();
|
|
||||||
PlaybackHandler = new PlaybackHandlerService();
|
PlaybackHandler = new PlaybackHandlerService();
|
||||||
PlaybackHandler.RegisterAudioPlayer(VlcAudioService.Instance, localCore.InstanceId);
|
PlaybackHandler.RegisterAudioPlayer(VlcAudioService.Instance, localCore.InstanceId);
|
||||||
|
//PlaybackHandler.RegisterAudioPlayer(PlayerInteropAudioService.Instance, localCore.InstanceId);
|
||||||
|
|
||||||
DataRoot = new StrixDataRootPluginWrapper(mergedLayer,
|
DataRoot = new StrixDataRootPluginWrapper(mergedLayer,
|
||||||
new PlaybackHandlerPlugin(PlaybackHandler)
|
new PlaybackHandlerPlugin(PlaybackHandler)
|
||||||
@@ -219,7 +219,7 @@ namespace Microsoft.Zune.Shell
|
|||||||
|
|
||||||
ITrack firstTrack = addedItems[1].Data;
|
ITrack firstTrack = addedItems[1].Data;
|
||||||
|
|
||||||
await firstTrack.PlayArtistCollectionAsync();
|
//await firstTrack.PlayArtistCollectionAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ namespace ZuneUI
|
|||||||
{
|
{
|
||||||
partial class TransportControls
|
partial class TransportControls
|
||||||
{
|
{
|
||||||
|
private void OnInit() { }
|
||||||
|
private void OnUninit() { }
|
||||||
|
|
||||||
private void OnPlayClicked(object sender, EventArgs e)
|
private void OnPlayClicked(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (!this._play.Available)
|
if (!this._play.Available)
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using Microsoft.Zune.Util;
|
using Microsoft.Iris;
|
||||||
|
using Microsoft.Zune.Shell;
|
||||||
|
using Microsoft.Zune.Util;
|
||||||
using MicrosoftZunePlayback;
|
using MicrosoftZunePlayback;
|
||||||
using StrixMusic.Sdk.MediaPlayback;
|
using StrixMusic.Sdk.MediaPlayback;
|
||||||
using System;
|
using System;
|
||||||
@@ -7,7 +9,18 @@ namespace ZuneUI
|
|||||||
{
|
{
|
||||||
partial class TransportControls
|
partial class TransportControls
|
||||||
{
|
{
|
||||||
private readonly IPlaybackHandlerService _playbackHandler = Microsoft.Zune.Shell.ZuneApplication.PlaybackHandler;
|
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)
|
||||||
{
|
{
|
||||||
@@ -131,5 +144,25 @@ namespace ZuneUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void PlaybackHandler_CurrentItemChanged(object sender, PlaybackItem e)
|
||||||
|
{
|
||||||
|
// NOTE: This currently does not work. Perhaps something to do with
|
||||||
|
// the lack of a valid media ID?
|
||||||
|
|
||||||
|
string title = $"[Strix] {e.Track.Name}";
|
||||||
|
int num = e.Track.TrackNumber ?? 0;
|
||||||
|
string album = e.Track.Album?.Name ?? string.Empty;
|
||||||
|
|
||||||
|
string artist = string.Empty;
|
||||||
|
await foreach (var artistItem in e.Track.GetArtistItemsAsync(1, 0))
|
||||||
|
artist = artistItem.Name;
|
||||||
|
|
||||||
|
Application.DeferredInvoke(new DeferredInvokeHandler(delegate
|
||||||
|
{
|
||||||
|
Microsoft.Zune.Util.Notification.ResetNowPlaying();
|
||||||
|
Microsoft.Zune.Util.Notification.BroadcastNowPlaying(EMediaTypes.eMediaTypeAudio, album, artist, title, num, Guid.NewGuid());
|
||||||
|
}), DeferredInvokePriority.Normal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user