async Task CloseSessionAsync(Guid backgroundId)
        {
            Debug.WriteLine("MediaPlayerHandle.CloseSession() " + backgroundId);

            var mediaPlayerSession = _mediaPlayerSession;

            if (null == mediaPlayerSession)
            {
                return;
            }

            using (await _asyncLock.LockAsync(CancellationToken.None))
            {
                if (!mediaPlayerSession.BackgroundId.HasValue || backgroundId != mediaPlayerSession.BackgroundId)
                {
                    return;
                }

                if (ReferenceEquals(_mediaPlayerSession, mediaPlayerSession))
                {
                    _mediaPlayerSession = null;
                }

                mediaPlayerSession.Dispose();

                _subscriptionHandle.Unsubscribe();
            }
        }
Esempio n. 2
0
        async Task CloseSessionAsync(Guid backgroundId)
        {
            Debug.WriteLine("MediaPlayerHandle.CloseSession() " + backgroundId);

            var mediaPlayerSession = _mediaPlayerSession;

            if (null == mediaPlayerSession)
                return;

            using (await _asyncLock.LockAsync(CancellationToken.None))
            {
                if (!mediaPlayerSession.BackgroundId.HasValue || backgroundId != mediaPlayerSession.BackgroundId)
                    return;

                if (ReferenceEquals(_mediaPlayerSession, mediaPlayerSession))
                    _mediaPlayerSession = null;

                mediaPlayerSession.Dispose();

                _subscriptionHandle.Unsubscribe();
            }
        }
        public async Task <MediaPlayerSession> OpenAsync()
        {
            Debug.WriteLine("MediaPlayerHandle.OpenAsync()");

            for (var shutdownRetry = 0; shutdownRetry < 2; ++shutdownRetry)
            {
                MediaPlayerSession mediaPlayerSession = null;

                for (var retry = 0; retry < 3; ++retry)
                {
                    using (await _asyncLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
                    {
                        mediaPlayerSession = _mediaPlayerSession;

                        if (null != mediaPlayerSession)
                        {
                            return(mediaPlayerSession);
                        }

                        try
                        {
                            _subscriptionHandle.Subscribe();

                            var player = BackgroundMediaPlayer.Current;

                            Guid?backgroundId = null;

                            for (var loadRetry = 0; loadRetry < 4; ++loadRetry)
                            {
                                await Task.Delay(100 *(1 + loadRetry)).ConfigureAwait(false);

                                backgroundId = BackgroundSettings.BackgroundId;

                                if (backgroundId.HasValue)
                                {
                                    break;
                                }
                            }

                            if (backgroundId.HasValue)
                            {
                                for (var sessionRetry = 0; sessionRetry < 4; ++sessionRetry)
                                {
                                    mediaPlayerSession = new MediaPlayerSession(player, backgroundId.Value, _notifier, OnCurrentStateChanged);

                                    _mediaPlayerSession = mediaPlayerSession;

                                    if (await mediaPlayerSession.OpenAsync().ConfigureAwait(false))
                                    {
                                        return(mediaPlayerSession);
                                    }

                                    await Task.Delay(150 + 250 *sessionRetry).ConfigureAwait(false);
                                }
                            }
                            else
                            {
                                Debug.WriteLine("MediaPlayerHandle.OpenAsync() no BackgroundId");
                            }
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("MediaPlayerHandle.OpenAsync() failed: " + ex.ExtendedMessage());
                        }

                        _mediaPlayerSession = null;

                        _subscriptionHandle.Unsubscribe();
                    }

                    await Task.Delay(150 + 250 *retry).ConfigureAwait(false);
                }

                if (null != mediaPlayerSession)
                {
                    mediaPlayerSession.Dispose();
                }

                Shutdown();

                await Task.Delay(450 *(1 + shutdownRetry)).ConfigureAwait(false);
            }

            return(null);
        }
Esempio n. 4
0
        public async Task<MediaPlayerSession> OpenAsync()
        {
            Debug.WriteLine("MediaPlayerHandle.OpenAsync()");

            for (var shutdownRetry = 0; shutdownRetry < 2; ++shutdownRetry)
            {
                MediaPlayerSession mediaPlayerSession = null;

                for (var retry = 0; retry < 3; ++retry)
                {
                    using (await _asyncLock.LockAsync(CancellationToken.None).ConfigureAwait(false))
                    {
                        mediaPlayerSession = _mediaPlayerSession;

                        if (null != mediaPlayerSession)
                            return mediaPlayerSession;

                        try
                        {
                            _subscriptionHandle.Subscribe();

                            var player = BackgroundMediaPlayer.Current;

                            Guid? backgroundId = null;

                            for (var loadRetry = 0; loadRetry < 4; ++loadRetry)
                            {
                                await Task.Delay(100 * (1 + loadRetry)).ConfigureAwait(false);

                                backgroundId = BackgroundSettings.BackgroundId;

                                if (backgroundId.HasValue)
                                    break;
                            }

                            if (backgroundId.HasValue)
                            {
                                for (var sessionRetry = 0; sessionRetry < 4; ++sessionRetry)
                                {
                                    mediaPlayerSession = new MediaPlayerSession(player, backgroundId.Value, _notifier, OnCurrentStateChanged);

                                    _mediaPlayerSession = mediaPlayerSession;

                                    if (await mediaPlayerSession.OpenAsync().ConfigureAwait(false))
                                        return mediaPlayerSession;

                                    await Task.Delay(150 + 250 * sessionRetry).ConfigureAwait(false);
                                }
                            }
                            else
                                Debug.WriteLine("MediaPlayerHandle.OpenAsync() no BackgroundId");
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("MediaPlayerHandle.OpenAsync() failed: " + ex.ExtendedMessage());
                        }

                        _mediaPlayerSession = null;

                        _subscriptionHandle.Unsubscribe();
                    }

                    await Task.Delay(150 + 250 * retry).ConfigureAwait(false);
                }

                if (null != mediaPlayerSession)
                    mediaPlayerSession.Dispose();

                Shutdown();

                await Task.Delay(450 * (1 + shutdownRetry)).ConfigureAwait(false);
            }

            return null;
        }