private async void ResetItems()
        {
            var newOwner = Playlist;

            using (var releaser = await _PlaylistUpdateLock.LockAsync())
            {
                PlayedItems.Clear();
                _ItemsObservaeDisposer?.Dispose();
                _ItemsObservaeDisposer = null;

                ResetRandmizedItems(SourceItems);
                if (newOwner is INotifyCollectionChanged playlistNotifyCollectionChanged)
                {
                    _ItemsObservaeDisposer = playlistNotifyCollectionChanged.CollectionChangedAsObservable()
                                             .Subscribe(async _ =>
                    {
                        using (var releaser2 = await _PlaylistUpdateLock.LockAsync())
                        {
                            // 再生中アイテムが削除された時のプレイリストの動作

                            // 動画プレイヤーには影響を与えないこととする
                            // 連続再生動作の継続性が確保できればOK

                            SourceItems.Clear();
                            foreach (var newItem in newOwner.Select(x => new PlaylistItem()
                            {
                                ContentId = x,
                                Owner = newOwner,
                                Type = PlaylistItemType.Video,
                            }))
                            {
                                SourceItems.Add(newItem);
                            }

                            ResetRandmizedItems(SourceItems);

                            if (PlaylistSettings.IsShuffleEnable)
                            {
                                CurrentIndex = 0;
                            }
                            else
                            {
                                CurrentIndex = Current == null ? 0 : SourceItems.IndexOf(Current);
                            }

                            RaisePropertyChanged(nameof(CanGoBack));
                            RaisePropertyChanged(nameof(CanGoNext));
                        }
                    });
                }

                RaisePropertyChanged(nameof(CanGoBack));
                RaisePropertyChanged(nameof(CanGoNext));
            }
        }
Exemple #2
0
        internal async void ResetItems(IPlayableList newOwner)
        {
            using (var releaser = await _PlaylistUpdateLock.LockAsync())
            {
                PlayedItems.Clear();
                ResetRandmizedItems();
                _ItemsObservaeDisposer?.Dispose();
                _ItemsObservaeDisposer = null;

                Playlist = newOwner;

                if (Playlist != null)
                {
                    _ItemsObservaeDisposer = Playlist.PlaylistItems.CollectionChangedAsObservable()
                                             .Subscribe(async x =>
                    {
                        using (var releaser2 = await _PlaylistUpdateLock.LockAsync())
                        {
                            // 再生中アイテムが削除された時のプレイリストの動作

                            // 動画プレイヤーには影響を与えないこととする
                            // 連続再生動作の継続性が確保できればOK

                            ResetRandmizedItems();

                            if (PlaylistSettings.IsShuffleEnable)
                            {
                                CurrentIndex = 0;
                            }
                            else
                            {
                                CurrentIndex = Current == null ? 0 : SourceItems.IndexOf(Current);
                            }

                            RaisePropertyChanged(nameof(CanGoBack));
                            RaisePropertyChanged(nameof(CanGoNext));
                        }
                    });
                }

                RaisePropertyChanged(nameof(CanGoBack));
                RaisePropertyChanged(nameof(CanGoNext));
            }
        }
        private async void __GoNext()
        {
            // Note: CanGoNext で呼び分けが行われている前提の元で例外送出を行っている
            if (SourceItems == null)
            {
                throw new Exception();
            }

            using (var releaser = await _PlaylistUpdateLock.LockAsync())
            {
                var prevPlayed = Current;
                var nextIndex  = CurrentIndex + 1;

                if (nextIndex >= SourceItems.Count)
                {
                    ResetRandmizedItems(SourceItems);
                    nextIndex = 0;
                }

                var nextItem = (PlaylistSettings.IsShuffleEnable ? RandamizedItems : SourceItems)
                               .ElementAt(nextIndex);


                if (nextItem != null)
                {
                    if (prevPlayed != null)
                    {
                        PlayedItems.Enqueue(prevPlayed);
                    }

                    Current      = nextItem;
                    CurrentIndex = nextIndex;

                    PlayRequested?.Invoke(this, nextItem);
                }
                else
                {
                    throw new Exception();
                }
            }
        }
        private void __GoBack()
        {
            // Note: CanGoBack で呼び分けが行われている前提の元で例外送出を行っている

            var prevItem  = default(PlaylistItem);
            int prevIndex = CurrentIndex - 1;

            if (PlaylistSettings.IsShuffleEnable)
            {
                prevItem = PlayedItems.Dequeue();
            }
            else
            {
                if (prevIndex < 0)
                {
                    if (RepeatMode != MediaPlaybackAutoRepeatMode.List)
                    {
                        throw new Exception();
                    }
                    else
                    {
                        prevIndex = SourceItems.Count - 1;
                    }
                }

                prevItem = SourceItems.ElementAt(prevIndex);
            }

            if (prevItem != null)
            {
                Current      = prevItem;
                CurrentIndex = prevIndex;

                PlayRequested?.Invoke(this, prevItem);
            }
            else
            {
                throw new Exception();
            }
        }