From 004b82095cb372d5f846f8a9f85fa56befbd26b5 Mon Sep 17 00:00:00 2001 From: nam <36914158+aferin@users.noreply.github.com> Date: Wed, 31 Jul 2019 16:02:56 +0900 Subject: [PATCH] [MediaPlayer] Add API to be able to cancel preparing it (#944) --- .../Interop/Interop.Player.cs | 4 ++ .../Player/Player.Events.cs | 2 + src/Tizen.Multimedia.MediaPlayer/Player/Player.cs | 69 ++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs b/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs index 8c0cf7a..fc70274 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs @@ -75,6 +75,10 @@ internal static partial class Interop [DllImport(Libraries.Player, EntryPoint = "player_prepare")] internal static extern PlayerErrorCode Prepare(IntPtr player); + [DllImport(Libraries.Player, EntryPoint = "player_prepare_async")] + internal static extern PlayerErrorCode PrepareAsync(IntPtr player, PrepareCallback callback, + IntPtr userData = default(IntPtr)); + [DllImport(Libraries.Player, EntryPoint = "player_unprepare")] internal static extern PlayerErrorCode Unprepare(IntPtr player); diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs index ed9f3dc..e7ba765 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs @@ -74,6 +74,8 @@ namespace Tizen.Multimedia public event EventHandler BufferingProgressChanged; private NativePlayer.BufferingProgressCallback _bufferingProgressCallback; + private NativePlayer.PrepareCallback _prepareCallback; + internal event EventHandler MediaStreamAudioBufferStatusChanged; private NativePlayer.MediaStreamBufferStatusCallback _mediaStreamAudioBufferStatusChangedCallback; diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs index 27e77d4..8d35953 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs @@ -346,6 +346,75 @@ namespace Tizen.Multimedia } /// + /// Prepares the cancellable media player for playback, asynchronously. + /// + /// The cancellation token to cancel preparing. + /// + /// A task that represents the asynchronous prepare operation. + /// To prepare the player, the player must be in the state, + /// and a source must be set. + /// The state must be to cancel preparing. + /// When preparing is cancelled, a state will be changed to from . + /// The player has already been disposed of. + /// + /// Operation failed; internal error. + /// -or-
+ /// The player is not in the valid state. + ///
+ /// + /// + /// 6 + public virtual async Task PrepareAsync(CancellationToken cancellationToken) + { + ValidateNotDisposed(); + + var taskCompletionSource = new TaskCompletionSource(); + + if (_source == null) + { + throw new InvalidOperationException("No source is set."); + } + + ValidatePlayerState(PlayerState.Idle); + + OnPreparing(); + + SetPreparing(); + + // register a callback to handle cancellation token anytime it occurs + cancellationToken.Register(() => + { + ValidatePlayerState(PlayerState.Preparing); + + // a user can get the state before finally block is called. + ClearPreparing(); + + Log.Warn(PlayerLog.Tag, $"preparing will be cancelled."); + NativePlayer.Unprepare(Handle).ThrowIfFailed(this, "Failed to unprepare the player"); + + taskCompletionSource.TrySetCanceled(); + }); + + _prepareCallback = _ => + { + Log.Warn(PlayerLog.Tag, $"prepared callback is called."); + taskCompletionSource.TrySetResult(true); + }; + + try + { + NativePlayer.PrepareAsync(Handle, _prepareCallback, IntPtr.Zero). + ThrowIfFailed(this, "Failed to prepare the player"); + + await taskCompletionSource.Task.ConfigureAwait(false); + } + finally + { + ClearPreparing(); + } + } + + /// /// Unprepares the player. /// /// -- 2.7.4