Implemented basic Strix player

This commit is contained in:
Yoshi Askharoun
2022-06-11 09:05:34 -05:00
parent 23c9c04c7f
commit 72f1b42fd4
4 changed files with 82 additions and 23 deletions
@@ -79,16 +79,27 @@ namespace Microsoft.Zune.Playback
return Task.CompletedTask;
}
public Task Play(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
public async Task Play(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
{
WaveStream reader = null;
var stream = sourceConfig.MediaConfig.FileStreamSource;
Guard.IsNotNull(stream, "sourceConfig.MediaConfig.FileStreamSource");
if (stream != null)
{
reader = new StreamMediaFoundationReader(sourceConfig.MediaConfig.FileStreamSource);
}
else if (sourceConfig.MediaConfig.MediaSourceUri.IsFile)
{
reader = new MediaFoundationReader(sourceConfig.MediaConfig.MediaSourceUri.ToString());
}
else if (sourceConfig.MediaConfig.MediaSourceUri.Scheme.StartsWith("http"))
{
System.Net.Http.HttpClient client = new();
stream = await client.GetStreamAsync(sourceConfig.MediaConfig.MediaSourceUri);
reader = new StreamMediaFoundationReader(stream);
}
StreamMediaFoundationReader mfr = new(sourceConfig.MediaConfig.FileStreamSource);
m_audio.Init(mfr);
m_audio.Init(reader);
m_audio.Play();
return Task.CompletedTask;
}
public Task Preload(PlaybackItem sourceConfig, CancellationToken cancellationToken = default)
@@ -28,7 +28,9 @@ using System.Linq;
#if OPENZUNE
using Microsoft.Zune.Playback;
using OwlCore.Events;
using StrixMusic.Sdk.AdapterModels;
using StrixMusic.Sdk.AppModels;
using StrixMusic.Sdk.CoreModels;
using StrixMusic.Sdk.MediaPlayback;
using StrixMusic.Sdk.PluginModels;
@@ -135,7 +137,7 @@ namespace Microsoft.Zune.Shell
#if OPENZUNE
string id = Guid.NewGuid().ToString();
var fileService = new OwlCore.AbstractStorage.Win32FileSystemService(@"D:\OneDrive\Music");
var fileService = new OwlCore.AbstractStorage.Win32FileSystemService(@"D:\Music\Zune\Test");
OwlCore.AbstractStorage.SystemIOFolderData settingsFolder =
new(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Zune\OpenZune"));
settingsFolder.EnsureExists().Wait();
@@ -158,19 +160,34 @@ namespace Microsoft.Zune.Shell
var mergedLayer = new MergedCore(new ICore[] { localCore }, prefs);
// Perform any async initialization needed. Authenticating, connecting to database, etc.
mergedLayer.InitAsync().ContinueWith(async task =>
// Add plugins
string mfAudioServiceId = Guid.NewGuid().ToString();
PlaybackHandlerService playbackHandler = new();
playbackHandler.RegisterAudioPlayer(MediaFoundationAudioService.Instance, localCore.InstanceId);
StrixDataRootPluginWrapper dataRoot = new(mergedLayer,
new PlaybackHandlerPlugin(playbackHandler)
);
dataRoot.InitAsync().ContinueWith(async task =>
{
mergedLayer.Library.TracksCountChanged += LibraryTracksAdded;
if (task.Status == System.Threading.Tasks.TaskStatus.Faulted)
{
Debug.WriteLine(task.Exception);
return;
}
// Add plugins
string mfAudioServiceId = Guid.NewGuid().ToString();
PlaybackHandlerService playbackHandler = new();
playbackHandler.RegisterAudioPlayer(MediaFoundationAudioService.Instance, mfAudioServiceId);
dataRoot.Library.TracksChanged += LibraryTracksChanged;
//mergedLayer.Library.TracksChanged += LibraryTracksChanged;
//dataRoot.Library.TracksCountChanged += LibraryTracksAdded;
StrixDataRootPluginWrapper pluginLayer = new(mergedLayer,
new PlaybackHandlerPlugin(playbackHandler)
);
await pluginLayer.InitAsync();
var tracks = await dataRoot.Library.GetTracksAsync(1, 0).ToListAsync();
bool hasTracks = tracks.Count > 0;
if (hasTracks)
{
var track = tracks[0];
await playbackHandler.PlayAsync(track, dataRoot.Library, track);
}
});
#endif
@@ -179,15 +196,37 @@ namespace Microsoft.Zune.Shell
}
#if OPENZUNE
private static async void LibraryTracksChanged(object sender,
IReadOnlyList<CollectionChangedItem<ITrack>> addedItems,
IReadOnlyList<CollectionChangedItem<ITrack>> removedItems)
{
if (sender is ILibrary library && addedItems.Count > 0)
{
library.TracksChanged -= LibraryTracksChanged;
ITrack firstTrack = addedItems[0].Data;
await PlayTrack(library, firstTrack);
}
}
private static async void LibraryTracksAdded(object sender, int count)
{
if (sender is StrixMusic.Sdk.AppModels.ILibrary library && count > 50)
if (sender is ILibrary library && count > 0)
{
library.TracksCountChanged -= LibraryTracksAdded;
var tracks = await library.GetTracksAsync(limit: 100, offset: 0).ToListAsync();
await library.PlayTrackCollectionAsync(tracks[0]);
ITrack firstTrack = await library.GetTracksAsync(limit: 1, offset: 0).FirstOrDefaultAsync();
await PlayTrack(library, firstTrack);
}
}
private static async System.Threading.Tasks.Task PlayTrack(ILibrary library, ITrack track)
{
if (library.IsPlayTrackCollectionAsyncAvailable && track != null)
await library.PlayTrackCollectionAsync(track);
}
#endif
private static void Phase2InitializationUIStage(object arg)
@@ -65,11 +65,19 @@ namespace OwlCore.AbstractStorage
}
/// <inheritdoc/>
public Task<IFolderData> CreateFolderAsync(string desiredName, CreationCollisionOption options)
public async Task<IFolderData> CreateFolderAsync(string desiredName, CreationCollisionOption options)
{
if (options != CreationCollisionOption.FailIfExists)
if (options == CreationCollisionOption.OpenIfExists)
{
SystemIOFolderData folder = new(System.IO.Path.Combine(Path, desiredName));
await folder.EnsureExists();
return folder;
}
else if (options == CreationCollisionOption.FailIfExists)
{
throw new NotImplementedException();
return CreateFolderAsync(desiredName);
}
return await CreateFolderAsync(desiredName);
}
/// <inheritdoc/>
+1
View File
@@ -1844,6 +1844,7 @@ namespace ZuneUI
{
if (this.IsDisposed || myID != this._lastKnownSetUriCallID)
return;
trackUri = "https://www.newgrounds.com/audio/download/641172";
this._playbackWrapper.SetUri(trackUri, 0L, track.PlaybackID);
this.ReportStreamingAction(PlayerState.Stopped);
this._tracksSubmittedToPlayer.Remove(track);