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)); } }
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(); } }