protected override void OnResetItems(IEnumerable <PlaylistItem> sourceItems, PlaylistItem item) { var copied = sourceItems.ToList(); // 再生済みアイテムを同期 var existPlayedItems = PlayedItem.Where(x => copied.Any(y => y.ContentId == x.ContentId)); PlayedItem = new Stack <PlaylistItem>(existPlayedItems); // ランダム化したアイテムの同期 RandamizedItems.Clear(); var shuffledUnplayItems = copied .Where(x => !PlayedItem.Any(y => x.ContentId == y.ContentId)) .Shuffle(); foreach (var shuffled in shuffledUnplayItems) { RandamizedItems.Enqueue(shuffled); } // Currentを同期 // 現在再生中のアイテムが削除されていた場合、Currentをnullにするだけ if (Current != null && !copied.Any(x => x.ContentId == Current.ContentId)) { Current = null; } }
private void ResetRandmizedItems(IEnumerable <PlaylistItem> items) { RandamizedItems.Clear(); if (items != null) { var firstItem = items.Take(1).SingleOrDefault(); if (firstItem != null) { RandamizedItems.Add(firstItem); RandamizedItems.AddRange(items.Skip(1).Shuffle()); } } }
private void ResetRandmizedItems() { RandamizedItems.Clear(); if (SourceItems != null) { var firstItem = SourceItems.Take(1).SingleOrDefault(); if (firstItem != null) { RandamizedItems.Add(firstItem); RandamizedItems.AddRange(SourceItems.Skip(1).Shuffle()); } } }
internal async void PlayStarted(PlaylistItem item) { if (item == null) { throw new Exception(); } using (var releaser = await _PlaylistUpdateLock.LockAsync()) { // 新たにプレイリストが指定された場合に // 連続再生をセットアップする if (item.Owner != null) { if (item.Owner != Playlist) { Playlist = item.Owner; } } // GoNext/GoBack内でCurrentが既に変更済みの場合はスキップ // Playlist外から直接PlaylistItemが変更された場合にのみ // 現在再生位置の更新を行う if (Current != item) { Current = item; if (SourceItems != null) { CurrentIndex = PlaylistSettings.IsShuffleEnable ? 0 : SourceItems.IndexOf(Current); } else { CurrentIndex = 0; } // ランダム再生かつ先頭の再生を行う場合は // ランダムアイテムの先頭が現在再生中アイテムになるように // ランダムアイテムリストを修正する // この修正によって、シャッフル再生が先頭しか再生されない問題を回避できる if (CurrentIndex == 0 && PlaylistSettings.IsShuffleEnable) { if (RandamizedItems.FirstOrDefault() != Current) { RandamizedItems.Remove(Current); RandamizedItems.Insert(0, Current); } } } } }
protected override PlaylistItem GetPreviousItem_Inner() { // Playedから1つ取り出して // Randomizedに載せる var prevItem = PlayedItem.Pop(); if (Current != null && prevItem != null) { RandamizedItems.Enqueue(Current); return(prevItem); } else { throw new Exception(); } }
protected override PlaylistItem GetNextItem_Inner() { if (RandamizedItems.Count == 0) { if (IsRepeat) { // RandamizedItemsを再構成 PlayedItem.Clear(); OnResetItems(SourceItems, Current); } else { throw new Exception(); } } var nextItem = RandamizedItems.Dequeue(); PlayedItem.Push(Current); return(nextItem); }
internal async void PlayStarted(PlaylistItem item) { if (item == null) { throw new Exception(); } using (var releaser = await _PlaylistUpdateLock.LockAsync()) { // 新たにプレイリストが指定された場合に // 連続再生をセットアップする if (item.Owner != null) { if (item.Owner != Playlist) { Playlist = item.Owner; } } SourceItems.Clear(); foreach (var newItem in Playlist.Select(x => new PlaylistItem() { ContentId = x, Owner = Playlist, Type = PlaylistItemType.Video, })) { SourceItems.Add(newItem); } RaisePropertyChanged(nameof(CanGoBack)); RaisePropertyChanged(nameof(CanGoNext)); // Current = SourceItems.First(x => item.ContentId == x.ContentId); // GoNext/GoBack内でCurrentが既に変更済みの場合はスキップ // Playlist外から直接PlaylistItemが変更された場合にのみ // 現在再生位置の更新を行う if (Current != item) { Current = item; if (SourceItems != null) { CurrentIndex = PlaylistSettings.IsShuffleEnable ? 0 : SourceItems.IndexOf(Current); } else { CurrentIndex = 0; } // ランダム再生かつ先頭の再生を行う場合は // ランダムアイテムの先頭が現在再生中アイテムになるように // ランダムアイテムリストを修正する // この修正によって、シャッフル再生が先頭しか再生されない問題を回避できる if (CurrentIndex == 0 && PlaylistSettings.IsShuffleEnable) { if (RandamizedItems.FirstOrDefault() != Current) { RandamizedItems.Remove(Current); RandamizedItems.Insert(0, Current); } } } } }