Prototyped SMTC support for Windows 10+

This commit is contained in:
Yoshi Askharoun
2022-07-13 22:29:44 -05:00
parent aac0f8cfc0
commit 4cc8082248
4 changed files with 102 additions and 7 deletions
+1 -1
View File
@@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<TargetFramework>net6.0-windows10.0.22000</TargetFramework>
<UseWPF>true</UseWPF>
<ApplicationIcon>Assets\ZuneFluentGem.ico</ApplicationIcon>
</PropertyGroup>
+8
View File
@@ -1,5 +1,6 @@
using System.Reflection;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security.Permissions;
[assembly: AssemblyCompany("Microsoft Corporation")]
@@ -16,4 +17,11 @@ using System.Security.Permissions;
#else
[assembly: AssemblyFileVersion("4.8.2345.0")]
[assembly: AssemblyVersion("4.7.0.0")]
#endif
// Workaround for CA1416
#if WINDOWS10
[assembly: SupportedOSPlatform("windows10.0.10240")]
#elif WINDOWS8_0_OR_GREATER
[assemby: SupportedOSPlatform("windows8.0.0")]
#endif
+27 -5
View File
@@ -11,7 +11,7 @@
<AssemblyVersion>$(ApplicationVersion)</AssemblyVersion>
<FileVersion>$(ApplicationVersion)</FileVersion>
<TargetFrameworks>net6.0;net35;net40;net6.0-windows8</TargetFrameworks>
<TargetFrameworks>net6.0;net6.0-windows10.0.22000;net35;net40</TargetFrameworks>
<Platforms>x64;x86</Platforms>
<FileAlignment>512</FileAlignment>
@@ -42,9 +42,31 @@
</Reference>
</ItemGroup>
<PropertyGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<UseOpenZune>True</UseOpenZune>
</PropertyGroup>
<Choose>
<When Condition=" $(TargetFramework.StartsWith('net6.0-windows')) ">
<PropertyGroup>
<!--<UseOpenZune>True</UseOpenZune>-->
<DefineConstants Condition="$(TargetFramework.StartsWith('net6.0-windows10'))">$(DefineConstants);WINDOWS10</DefineConstants>
<DefineConstants Condition="$(TargetFramework.StartsWith('net6.0-windows8'))">$(DefineConstants);WINDOWS8</DefineConstants>
</PropertyGroup>
</When>
<When Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<PropertyGroup>
<UseOpenZune>True</UseOpenZune>
</PropertyGroup>
</When>
<!--
.NET Core 3.1 is only used to target Windows 8/8.1
-->
<When Condition=" $(TargetFramework.StartsWith('netcoreapp')) ">
<PropertyGroup>
<UseOpenZune>True</UseOpenZune>
</PropertyGroup>
</When>
</Choose>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net35' ">
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
@@ -61,7 +83,7 @@
<Reference Include="Accessibility" />
</ItemGroup>
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
<ItemGroup Condition=" $(TargetFramework.StartsWith('netcoreapp')) ">
<PackageReference Include="Microsoft.Windows.SDK.Contracts" Version="10.0.22621.1" />
</ItemGroup>
+66 -1
View File
@@ -824,6 +824,21 @@ namespace ZuneUI
if (this.PlaybackStopped != null)
this.PlaybackStopped(this, null);
}
#if WINDOWS
if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Media.SystemMediaTransportControls"))
{
// On Windows 8.1 / 10 / 11
var _systemMediaTransportControls = Windows.Media.SystemMediaTransportControlsInterop.GetForWindow(Application.Window.Handle);
_systemMediaTransportControls.PlaybackStatus = stateNew switch
{
PlayerState.Stopped => Windows.Media.MediaPlaybackStatus.Stopped,
PlayerState.Playing => Windows.Media.MediaPlaybackStatus.Playing,
PlayerState.Paused => Windows.Media.MediaPlaybackStatus.Paused,
_ => throw new NotImplementedException(),
};
}
#endif
}
this.UpdatePropertiesAndCommands();
this.ReportStreamingAction(playerState);
@@ -1505,7 +1520,7 @@ namespace ZuneUI
{
#if OPENZUNE
var playbackHandler = Microsoft.Zune.Shell.ZuneApplication.PlaybackHandler;
if (playbackHandler != null)
if (playbackHandler != null && playbackHandler.NextItems.Count > 0)
{
await playbackHandler.NextAsync();
}
@@ -1752,11 +1767,61 @@ namespace ZuneUI
break;
case MCTransportState.Playing:
PerfTrace.TraceUICollectionEvent(UICollectionEvent.PlayRequestComplete, "");
// Use SMTC when available
#if WINDOWS
if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Media.SystemMediaTransportControls"))
{
// On Windows 8.1 / 10 / 11
var _systemMediaTransportControls = Windows.Media.SystemMediaTransportControlsInterop.GetForWindow(Application.Window.Handle);
_systemMediaTransportControls.IsPlayEnabled = true;
_systemMediaTransportControls.IsPauseEnabled = true;
_systemMediaTransportControls.IsStopEnabled = true;
_systemMediaTransportControls.IsNextEnabled = true;
_systemMediaTransportControls.IsPreviousEnabled = true;
if (!isInit)
{
isInit = true;
_systemMediaTransportControls.ButtonPressed += (e, args) =>
{
Action<object, EventArgs> method = args.Button switch
{
Windows.Media.SystemMediaTransportControlsButton.Play => OnPlayClicked,
Windows.Media.SystemMediaTransportControlsButton.Pause => OnPauseClicked,
Windows.Media.SystemMediaTransportControlsButton.Stop => OnStopClicked,
Windows.Media.SystemMediaTransportControlsButton.Next => OnForwardClicked,
Windows.Media.SystemMediaTransportControlsButton.Previous => OnBackClicked,
_ => throw new NotImplementedException()
};
Application.DeferredInvoke(_ => method(null, null), null);
};
}
// Get the updater
Windows.Media.SystemMediaTransportControlsDisplayUpdater updater = _systemMediaTransportControls.DisplayUpdater;
// Music metadata
updater.Type = _lastKnownPlaybackTrack.MediaType == MediaType.Video
? Windows.Media.MediaPlaybackType.Video
: Windows.Media.MediaPlaybackType.Music;
updater.MusicProperties.Title = _lastKnownPlaybackTrack.Title;
if (_lastKnownPlaybackTrack is LibraryPlaybackTrack track)
{
updater.MusicProperties.Artist = track.DisplayArtist;
}
updater.Update();
}
#endif
break;
}
}
this._lastKnownTransportState = mcTransportState;
}
bool isInit = false;
private void DeferredTransportPositionChanged(object obj)
{