diff --git a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayer.cs b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayer.cs index 6c2285a77101297ee4d785181bf559c49cd3647b..fc81e15b77c5f902077a6f0db90531969a90ff55 100644 --- a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayer.cs +++ b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayer.cs @@ -20,7 +20,6 @@ internal partial class HtmlMediaPlayer : Border { private HtmlVideo _htmlVideo = new HtmlVideo(); private HtmlAudio _htmlAudio = new HtmlAudio(); - private bool _isPlaying; private readonly ImmutableArray audioTagAllowedFormats = ImmutableArray.Create(new string[] { ".MP3", ".WAV" }); @@ -28,7 +27,7 @@ internal partial class HtmlMediaPlayer : Border ImmutableArray.Create(new string[] { ".MP4", ".WEBM", ".OGG" }); private UIElement _activeElement; private string _activeElementName; - public bool IsPause; + public HtmlMediaPlayerState PlayerState; public event EventHandler OnSourceLoaded; public event EventHandler OnStatusChanged; @@ -45,6 +44,7 @@ internal partial class HtmlMediaPlayer : Border } _htmlVideo.SetCssStyle("visibility", "hidden"); _htmlAudio.SetCssStyle("visibility", "hidden"); + PlayerState = HtmlMediaPlayerState.None; AddChild(_htmlVideo); AddChild(_htmlAudio); @@ -326,7 +326,7 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Debug($"Media ended [{Source}]"); } - _isPlaying = false; + PlayerState = HtmlMediaPlayerState.None; OnSourceEnded?.Invoke(this, EventArgs.Empty); } @@ -336,6 +336,7 @@ internal partial class HtmlMediaPlayer : Border { Duration = NativeMethods.GetDuration(_activeElement.HtmlId); } + PlayerState = HtmlMediaPlayerState.Opening; OnMetadataLoaded?.Invoke(this, Duration); } @@ -350,10 +351,10 @@ internal partial class HtmlMediaPlayer : Border _activeElementName = IsVideo ? "Video" : IsAudio ? "Audio" : ""; if (_activeElement != null) { + PlayerState = NativeMethods.GetPaused(_activeElement.HtmlId) ? HtmlMediaPlayerState.Paused : HtmlMediaPlayerState.Playing; _activeElement.SetCssStyle("visibility", "visible"); - IsPause = NativeMethods.GetPaused(_activeElement.HtmlId); } - _isPlaying = !IsPause; + OnStatusChanged?.Invoke(this, EventArgs.Empty); } @@ -384,9 +385,8 @@ internal partial class HtmlMediaPlayer : Border if (_activeElement != null) { - IsPause = NativeMethods.GetPaused(_activeElement.HtmlId); + PlayerState = NativeMethods.GetPaused(_activeElement.HtmlId) ? HtmlMediaPlayerState.Paused : HtmlMediaPlayerState.Playing; } - _isPlaying = !IsPause; OnStatusChanged?.Invoke(this, EventArgs.Empty); } @@ -396,7 +396,7 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Debug($"Media Changed Status Play [{Source}]"); } - IsPause = false; + PlayerState = HtmlMediaPlayerState.Playing; OnStatusChanged?.Invoke(this, EventArgs.Empty); } @@ -406,8 +406,7 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Debug($"Media Changed Status Pause [{Source}]"); } - - IsPause = true; + PlayerState = HtmlMediaPlayerState.Paused; OnStatusChanged?.Invoke(this, EventArgs.Empty); } @@ -422,7 +421,7 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Error($"{_activeElementName} source failed: [{Source}]"); } - IsPause = true; + PlayerState = HtmlMediaPlayerState.None; OnSourceFailed?.Invoke(this, e.Detail); } @@ -457,6 +456,7 @@ internal partial class HtmlMediaPlayer : Border player._activeElement.SetHtmlAttribute("src", encodedSource); player._activeElement.SetCssStyle("visibility", "visible"); + player.PlayerState = HtmlMediaPlayerState.Opening; if (player.Log().IsEnabled(LogLevel.Debug)) { player.Log().Debug($"{player._activeElementName} source changed: [{player.Source}]"); @@ -616,10 +616,9 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Debug($"Play()"); } - if (_activeElement != null && !_isPlaying) + if (_activeElement != null && PlayerState != HtmlMediaPlayerState.Playing) { - IsPause = false; - _isPlaying = true; + PlayerState = HtmlMediaPlayerState.Playing; NativeMethods.Play(_activeElement.HtmlId); } } @@ -631,10 +630,9 @@ internal partial class HtmlMediaPlayer : Border { this.Log().Debug($"Pause()"); } - if (_activeElement != null && _isPlaying) + if (_activeElement != null && PlayerState == HtmlMediaPlayerState.Playing) { - _isPlaying = false; - IsPause = true; + PlayerState = HtmlMediaPlayerState.Paused; NativeMethods.Pause(_activeElement.HtmlId); } } @@ -649,8 +647,7 @@ internal partial class HtmlMediaPlayer : Border if (_activeElement != null) { NativeMethods.Stop(_activeElement.HtmlId); - _isPlaying = false; - IsPause = true; + PlayerState = HtmlMediaPlayerState.None; } } diff --git a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayerState.cs b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayerState.cs new file mode 100644 index 0000000000000000000000000000000000000000..b308a3953d8d958bae39945c89f3eee769bc2a27 --- /dev/null +++ b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/HtmlMediaPlayerState.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Uno.UI.Media; + +public enum HtmlMediaPlayerState +{ + None = 0, + Opening = 1, + Playing = 3, + Paused = 4, +} diff --git a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerExtension.cs b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerExtension.cs index a885d6e12557dcb71a830ddfed7f4cd6ea227dfe..c022baa1658d277e2f996248b05ed4aa76fd6289 100644 --- a/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerExtension.cs +++ b/src/AddIns/Uno.UI.MediaPlayer.WebAssembly/MediaPlayerExtension.cs @@ -235,14 +235,14 @@ public partial class MediaPlayerExtension : IMediaPlayerExtension { if (this.Log().IsEnabled(LogLevel.Debug)) { - this.Log().Debug($"MediaPlayerExtension.OnStatusMediaChanged Paused ({_player?.IsPause.ToString()})"); + this.Log().Debug($"MediaPlayerExtension.OnStatusMediaChanged to state {_player?.PlayerState.ToString()}"); } - if (_player?.IsPause == true && _owner.PlaybackSession.PlaybackState == MediaPlaybackState.Playing) + if (_player?.PlayerState == HtmlMediaPlayerState.Paused && _owner.PlaybackSession.PlaybackState == MediaPlaybackState.Playing) { _owner.PlaybackSession.PlaybackState = MediaPlaybackState.Paused; } - else if (_player?.IsPause == false && _owner.PlaybackSession.PlaybackState == MediaPlaybackState.Paused) + else if (_player?.PlayerState == HtmlMediaPlayerState.Playing && _owner.PlaybackSession.PlaybackState == MediaPlaybackState.Paused) { _owner.PlaybackSession.PlaybackState = MediaPlaybackState.Playing; }