From: nam <36914158+aferin@users.noreply.github.com> Date: Wed, 31 Jul 2019 07:02:56 +0000 (+0900) Subject: [MediaPlayer] Add API to be able to cancel preparing it (#944) X-Git-Tag: submit/tizen/20190801.005244~1^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=004b82095cb372d5f846f8a9f85fa56befbd26b5;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [MediaPlayer] Add API to be able to cancel preparing it (#944) --- diff --git a/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs b/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs index 8c0cf7af0..fc70274c0 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 ed9f3dc0b..e7ba765c8 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 27e77d4be..8d35953a7 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs @@ -345,6 +345,75 @@ namespace Tizen.Multimedia TaskScheduler.Default); } + /// + /// 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. ///