diff --git a/UWP/UWPVideoViewer.cs b/UWP/UWPVideoViewer.cs new file mode 100644 index 0000000..f8beb8d --- /dev/null +++ b/UWP/UWPVideoViewer.cs @@ -0,0 +1,86 @@ +namespace Zebble +{ + using System; + using System.IO; + using System.Runtime.InteropServices.WindowsRuntime; + using Olive; + using controls = Windows.UI.Xaml.Controls; + + class UWPVideoViewer + { + internal controls.MediaElement Result; + VideoPlayer View; + + public UWPVideoViewer(VideoPlayer view) + { + View = view; + View.PathChanged.HandleOn(Thread.UI, Load); + View.PathNullified.HandleOn(Thread.UI, OnPathNullified); + View.Started.HandleOn(Thread.UI, () => Result?.Play()); + View.Paused.HandleOn(Thread.UI, () => Result?.Pause()); + View.Resumed.HandleOn(Thread.UI, () => Result?.Play()); + View.Stopped.HandleOn(Thread.UI, () => Result?.Stop()); + View.Seeked.HandleOn(Thread.UI, (position) => Result.Position = position); + View.SoughtBeginning.HandleOn(Thread.UI, () => Result.Position = 0.Milliseconds()); + view.Muted.HandleOn(Thread.UI, () => Result.IsMuted = view.IsMuted); + View.GetCurrentTime = () => Result.Position; + View.InitializeTimer(); + + Result = new controls.MediaElement { Stretch = view.BackgroundImageStretch.Render(), AutoPlay = View.AutoPlay, IsLooping = View.Loop }; + Result.MediaEnded += MediaEnded; + Result.MediaOpened += MediaOpened; + + Load(); + } + + void MediaEnded(object sender, Windows.UI.Xaml.RoutedEventArgs e) => View.FinishedPlaying.RaiseOn(Thread.Pool); + + void OnPathNullified() => Result.Source = null; + + void Load() + { + var url = View.Path; + if (url.IsEmpty()) return; + + if (url.IsUrl()) + { + Result.Source = url.AsUri(); + View.LoadedPath = url; + } + else + { + try + { + var file = Device.IO.File(url); + var data = file.ReadAllBytes(); + var source = data.AsBuffer().AsStream().AsRandomAccessStream(); + Result.SetSource(source, string.Empty); + } + catch (Exception ex) + { + Dialogs.Current.Toast("Failed to show video: " + ex.Message); + } + View.LoadedPath = url; + } + } + + void MediaOpened(object sender, Windows.UI.Xaml.RoutedEventArgs e) + { + View.IsReady = true; + View.Duration = Result.NaturalDuration.TimeSpan; + View.VideoSize = new Size(Result.NaturalVideoWidth, Result.NaturalVideoHeight); + View.LoadCompleted.Raise(); + View.OnLoaded(); + } + + internal void Dispose() + { + if (Result is null) return; + Result.MediaEnded -= MediaEnded; + Result.MediaOpened -= MediaOpened; + Result = null; + + GC.SuppressFinalize(this); + } + } +} \ No newline at end of file diff --git a/WinUI/VideoPlayerRenderer.cs b/UWP/VideoPlayerRenderer.cs similarity index 76% rename from WinUI/VideoPlayerRenderer.cs rename to UWP/VideoPlayerRenderer.cs index f1607c7..ada38d5 100644 --- a/WinUI/VideoPlayerRenderer.cs +++ b/UWP/VideoPlayerRenderer.cs @@ -2,15 +2,15 @@ namespace Zebble { using System; using System.Threading.Tasks; - using Microsoft.UI.Xaml; + using Windows.UI.Xaml; class VideoPlayerRenderer : INativeRenderer { - WinUIVideoViewer Result; + UWPVideoViewer Result; public Task Render(Renderer renderer) { - Result = new WinUIVideoViewer((VideoPlayer)renderer.View); + Result = new UWPVideoViewer((VideoPlayer)renderer.View); return Task.FromResult((FrameworkElement)Result.Result); } diff --git a/VideoPlayer.csproj b/VideoPlayer.csproj index ce4ef27..868fbb7 100644 --- a/VideoPlayer.csproj +++ b/VideoPlayer.csproj @@ -1,12 +1,12 @@  - net8.0-android;net8.0-ios - $(TargetFrameworks);net8.0-windows10.0.19041 + net9.0-android;net9.0-ios + $(TargetFrameworks);net9.0-windows10.0.26100 Zebble.VideoPlayer Zebble Zebble.VideoPlayer $(AssemblyName) ($(TargetFramework)) - 5.1.0.0 + 5.1.1.0 true en $(DefineConstants) @@ -37,9 +37,10 @@ true true - + win-x86;win-x64;win-arm64 - $(DefineConstants);WINUI + $(DefineConstants);UWP + true $(DefineConstants);ANDROID @@ -51,8 +52,10 @@ - - + + + + @@ -67,9 +70,9 @@ - - - + + + diff --git a/WinUI/WinUIVideoViewer.cs b/WinUI/WinUIVideoViewer.cs deleted file mode 100644 index b723a7d..0000000 --- a/WinUI/WinUIVideoViewer.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace Zebble -{ - using System; - using System.IO; - using System.Runtime.InteropServices.WindowsRuntime; - using Olive; - using controls = Microsoft.UI.Xaml.Controls; - - class WinUIVideoViewer - { - internal controls.MediaPlayerElement Result; - VideoPlayer View; - - public WinUIVideoViewer(VideoPlayer view) - { - View = view; - View.PathChanged.HandleOn(Thread.UI, Load); - View.PathNullified.HandleOn(Thread.UI, OnPathNullified); - View.Started.HandleOn(Thread.UI, () => Result?.MediaPlayer?.Play()); - View.Paused.HandleOn(Thread.UI, () => Result?.MediaPlayer?.Pause()); - View.Resumed.HandleOn(Thread.UI, () => Result?.MediaPlayer?.Play()); - View.Stopped.HandleOn(Thread.UI, () => Result?.MediaPlayer?.Pause()); - View.Seeked.HandleOn(Thread.UI, (position) => Result.MediaPlayer.Position = position); - View.SoughtBeginning.HandleOn(Thread.UI, () => Result.MediaPlayer.Position = TimeSpan.Zero); - view.Muted.HandleOn(Thread.UI, () => Result.MediaPlayer.IsMuted = view.IsMuted); - View.GetCurrentTime = () => Result.MediaPlayer.Position; - View.InitializeTimer(); - - var mediaPlayer = new Windows.Media.Playback.MediaPlayer(); - mediaPlayer.IsLoopingEnabled = View.Loop; - - Result = new controls.MediaPlayerElement - { - Stretch = view.BackgroundImageStretch.Render(), - AutoPlay = View.AutoPlay - }; - Result.MediaPlayer.IsLoopingEnabled = View.Loop; - Result.MediaPlayer.MediaEnded += MediaEnded; - Result.MediaPlayer.MediaOpened += MediaOpened; - - Load(); - } - - void MediaEnded(Windows.Media.Playback.MediaPlayer sender, object args) => View.FinishedPlaying.RaiseOn(Thread.Pool); - - void OnPathNullified() => Result.MediaPlayer.Source = null; - - void Load() - { - var url = View.Path; - if (url.IsEmpty()) return; - - if (url.IsUrl()) - { - Result.MediaPlayer.Source = Windows.Media.Core.MediaSource.CreateFromUri(new Uri(url)); - View.LoadedPath = url; - } - else - { - try - { - var file = Device.IO.File(url); - var data = file.ReadAllBytes(); - var source = data.AsBuffer().AsStream().AsRandomAccessStream(); - Result.MediaPlayer.SetStreamSource(source); - } - catch (Exception ex) - { - Dialogs.Current.Toast("Failed to show video: " + ex.Message); - } - View.LoadedPath = url; - } - } - - void MediaOpened(Windows.Media.Playback.MediaPlayer sender, object args) - { - View.IsReady = true; - View.Duration = TimeSpan.FromTicks(Result.MediaPlayer.NaturalDuration.Ticks); - View.VideoSize = new Size(Result.MediaPlayer.PlaybackSession.NaturalVideoWidth, Result.MediaPlayer.PlaybackSession.NaturalVideoHeight); - View.LoadCompleted.Raise(); - View.OnLoaded(); - } - - internal void Dispose() - { - if (Result is null) return; - Result.MediaPlayer.MediaEnded -= MediaEnded; - Result.MediaPlayer.MediaOpened -= MediaOpened; - Result = null; - - GC.SuppressFinalize(this); - } - } -}