From: hsgwon Date: Tue, 13 Feb 2018 03:20:53 +0000 (+0900) Subject: [Multimedia] Modify MediaPlayer for product reuse (#124) X-Git-Tag: 4.0.1.14100~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=6881cf84d0d2f9cfdfb005b353bc0528f0d91a3e;p=platform%2Fcore%2Fcsapi%2Ftizenfx.git [Multimedia] Modify MediaPlayer for product reuse (#124) --- diff --git a/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs b/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs index b9378c8..373ee5d 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Interop/Interop.Player.cs @@ -269,6 +269,11 @@ internal static partial class Interop { } + internal PlayerHandle(IntPtr rawHandle) : this() + { + handle = rawHandle; + } + public override bool IsInvalid => handle == IntPtr.Zero; protected override bool ReleaseHandle() diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.ErrorHandler.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.ErrorHandler.cs index 07ce450..30154ee 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.ErrorHandler.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.ErrorHandler.cs @@ -15,38 +15,17 @@ */ using System; -using System.Collections.Generic; using System.ComponentModel; namespace Tizen.Multimedia { public partial class Player { - private static List> _errorHandlers; + private Action _errorHandler; - private static object _errorHandlerLock = new object(); - - /// - /// This method supports the product infrastructure and is not intended to be used directly from application code. - /// - /// 4 - [EditorBrowsable(EditorBrowsableState.Never)] - protected static void AddErrorHandler(Action errorHandler) + internal void NotifyError(int errorCode, string message) { - if (errorHandler == null) - { - throw new ArgumentNullException(nameof(errorHandler)); - } - - lock (_errorHandlerLock) - { - if (_errorHandlers == null) - { - _errorHandlers = new List>(); - } - - _errorHandlers.Add(errorHandler); - } + _errorHandler?.Invoke(errorCode, message); } /// @@ -54,34 +33,6 @@ namespace Tizen.Multimedia /// /// 4 [EditorBrowsable(EditorBrowsableState.Never)] - protected static void RemoveErrorHandler(Action errorHandler) - { - lock (_errorHandlerLock) - { - _errorHandlers?.Remove(errorHandler); - } - } - - internal static void NotifyError(Player player, int errorCode, string message) - { - if (_errorHandlers == null) - { - return; - } - - lock (_errorHandlerLock) - { - foreach (var handler in _errorHandlers) - { - handler(player, errorCode, message); - } - } - } - - /// - /// This method supports the product infrastructure and is not intended to be used directly from application code. - /// - [EditorBrowsable(EditorBrowsableState.Never)] protected static Exception GetException(int errorCode, string message) => ((PlayerErrorCode)errorCode).GetException(message); } diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs index 8d4a824..574a00f 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Events.cs @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +using static Interop; using System; -using System.Threading.Tasks; -using System.Runtime.InteropServices; +using System.ComponentModel; using System.Diagnostics; -using System.IO; -using System.Threading; -using static Interop; namespace Tizen.Multimedia { @@ -82,14 +80,8 @@ namespace Tizen.Multimedia internal event EventHandler MediaStreamVideoSeekingOccurred; private NativePlayer.MediaStreamSeekCallback _mediaStreamVideoSeekCallback; - private bool _callbackRegistered; - private void RegisterEvents() { - if (_callbackRegistered) - { - return; - } RegisterSubtitleUpdatedCallback(); RegisterErrorOccurredCallback(); RegisterPlaybackInterruptedCallback(); @@ -98,8 +90,6 @@ namespace Tizen.Multimedia RegisterMediaStreamBufferStatusCallback(); RegisterMediaStreamSeekCallback(); RegisterPlaybackCompletedCallback(); - - _callbackRegistered = true; } private void RegisterSubtitleUpdatedCallback() @@ -160,6 +150,18 @@ namespace Tizen.Multimedia ThrowIfFailed(this, "Failed to set PlaybackError"); } + /// + /// Raises the event. + /// + /// + /// An that contains the event data. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected void OnErrorOccurred(PlayerErrorOccurredEventArgs e) + { + ErrorOccurred?.Invoke(this, e); + } + #region VideoFrameDecoded event private EventHandler _videoFrameDecoded; diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Properties.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Properties.cs index e2a4742..396c66a 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.Properties.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.Properties.cs @@ -191,12 +191,14 @@ namespace Tizen.Multimedia #region Display methods + private PlayerDisplaySettings _displaySettings; + /// /// Gets the display settings. /// /// A that specifies the display settings. /// 3 - public PlayerDisplaySettings DisplaySettings { get; } + public PlayerDisplaySettings DisplaySettings => _displaySettings; private Display _display; @@ -256,6 +258,8 @@ namespace Tizen.Multimedia throw new ArgumentException("The display has already been assigned to another."); } + SetDisplay(value).ThrowIfFailed(this, "Failed to configure display of the player"); + ReplaceDisplay(value); } } @@ -336,7 +340,7 @@ namespace Tizen.Multimedia } } - private readonly AudioEffect _audioEffect; + private AudioEffect _audioEffect; /// /// Gets the audio effect. diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs index 82b62f8..247e5d7 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/Player.cs @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +using static Interop; using System; -using System.Threading.Tasks; -using System.Runtime.InteropServices; +using System.ComponentModel; using System.Diagnostics; using System.IO; +using System.Runtime.InteropServices; using System.Threading; -using static Interop; -using System.ComponentModel; +using System.Threading.Tasks; namespace Tizen.Multimedia { @@ -39,7 +40,7 @@ namespace Tizen.Multimedia /// public partial class Player : IDisposable, IDisplayable { - private PlayerHandle _handle; + private readonly PlayerHandle _handle; /// /// Initializes a new instance of the class. @@ -51,6 +52,41 @@ namespace Tizen.Multimedia Debug.Assert(_handle != null); + Initialize(); + } + + /// + /// Initializes a new instance of the class with a native handle. + /// The class takes care of the life cycle of the handle. + /// Thus, it should not be closed/destroyed in another location. + /// + /// + /// This supports the product infrastructure and is not intended to be used directly from application code. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected Player(IntPtr handle, Action errorHandler) + { + // This constructor is to support TV product player. + // Be careful with 'handle'. It must be wrapped in safe handle, first. + _handle = handle != IntPtr.Zero ? new PlayerHandle(handle) : + throw new ArgumentException("Handle is invalid.", nameof(handle)); + + _errorHandler = errorHandler; + } + + private bool _initialized; + + /// + /// This supports the product infrastructure and is not intended to be used directly from application code. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected void Initialize() + { + if (_initialized) + { + throw new InvalidOperationException("It has already been initialized."); + } + if (Features.IsSupported(PlayerFeatures.AudioEffect)) { _audioEffect = new AudioEffect(this); @@ -61,7 +97,11 @@ namespace Tizen.Multimedia RegisterVideoFrameDecodedCallback(); } - DisplaySettings = PlayerDisplaySettings.Create(this); + RegisterEvents(); + + _displaySettings = PlayerDisplaySettings.Create(this); + + _initialized = true; } internal void ValidatePlayerState(params PlayerState[] desiredStates) @@ -92,7 +132,14 @@ namespace Tizen.Multimedia Dispose(true); } - private void Dispose(bool disposing) + /// + /// Releases the unmanaged resources used by the . + /// + /// + /// true to release both managed and unmanaged resources; false to release only unmanaged resources. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected virtual void Dispose(bool disposing) { if (!_disposed) { @@ -247,7 +294,6 @@ namespace Tizen.Multimedia /// 3 protected virtual void OnPreparing() { - RegisterEvents(); } /// @@ -269,8 +315,6 @@ namespace Tizen.Multimedia ValidatePlayerState(PlayerState.Idle); - SetDisplay(_display).ThrowIfFailed(this, "Failed to configure display of the player"); - OnPreparing(); var completionSource = new TaskCompletionSource(); @@ -414,6 +458,13 @@ namespace Tizen.Multimedia private MediaSource _source; /// + /// Determines whether MediaSource has set. + /// This supports the product infrastructure and is not intended to be used directly from application code. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected bool HasSource => _source != null; + + /// /// Sets a media source for the player. /// /// A that specifies the source for playback. @@ -653,12 +704,20 @@ namespace Tizen.Multimedia return Interlocked.CompareExchange(ref _isPreparing, 1, 1) == 1; } - private void SetPreparing() + /// + /// This supports the product infrastructure and is not intended to be used directly from application code. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected void SetPreparing() { Interlocked.Exchange(ref _isPreparing, 1); } - private void ClearPreparing() + /// + /// This supports the product infrastructure and is not intended to be used directly from application code. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + protected void ClearPreparing() { Interlocked.Exchange(ref _isPreparing, 0); } diff --git a/src/Tizen.Multimedia.MediaPlayer/Player/PlayerError.cs b/src/Tizen.Multimedia.MediaPlayer/Player/PlayerError.cs index dfc989c..316933b 100644 --- a/src/Tizen.Multimedia.MediaPlayer/Player/PlayerError.cs +++ b/src/Tizen.Multimedia.MediaPlayer/Player/PlayerError.cs @@ -65,7 +65,7 @@ namespace Tizen.Multimedia if (ex == null) { // Notify only when it can't be handled. - Player.NotifyError(player, (int)err, message); + player?.NotifyError((int)err, message); throw new InvalidOperationException($"Unknown error : {err.ToString()}"); }