Как воспроизвести ранее проигранные песни в списке? - PullRequest
1 голос
/ 19 января 2020

Я использую Shuffle Fisher-Yates для моего c -проигрывателя, однако при воспроизведении предыдущей песни это также случайная песня из списка. Итак, я добавил список, который сохраняет проигрываемые песни PlayedSongs. Он помнит все песни, которые были сыграны. Как мне играть эти песни вперед и назад? Если бы я go вернул 3 песни, а затем go снова перешел бы, это все равно была бы песня, которая находилась на втором месте. Но мысль об этом алгоритме вызывает у меня головную боль, и я не могу понять ее правильно. Вот что у меня есть.

Опять же, чтобы быть ясным: я хочу, чтобы шаффл мог играть вперед и назад. При воспроизведении назад все песни должны были быть воспроизведены в последнее время по порядку. (Это временно, поэтому этот список очищается при выходе).

Это if-выражение взято из другого метода, который обычно воспроизводит песни и проверяет, включен ли Shuffle:

//after song was played
    if (ShuffleIsOn)
    {
        ShuffledSongIndexes.Remove(ShuffledSongIndexes.FirstOrDefault());
        PlayedSongs.Add(song);
     }

Затем:

 public List<Song> PlayedSongs = new List<Song>();
 public int CurrentShuffleIndex = 0;

 public void PlayPreviousSongs()
    {
        PlayedSongs.Reverse();
        CurrentShuffleIndex++;
        try
        {
            MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex].FullFileName);
        }
        catch (ArgumentOutOfRangeException)
        {
            MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex - 1].FullFileName);
        }
        MediaElement.Play();

        PlayedSongs.Reverse();
    }

    public void PlayNextSongs()
        {
            CurrentShuffleIndex++;
            MediaElement.Source = new Uri(PlayedSongs[CurrentShuffleIndex].FullFileName);
            MediaElement.Play();
        }

Я ничего не нашел в inte rnet по этому поводу, кто-нибудь знает, как это сделать? Спасибо

1 Ответ

1 голос
/ 19 января 2020

Нет необходимости переворачивать список. Добавьте bool, например: PlayForward, и, если оно истинно, индекс будет увеличиваться на 1, в противном случае - на 1, например:

CurrentIndex += (PlayForward ? 1 : -1)

Кроме того, существует способ облегчить жизнь. Не меняйте песню всякий раз, когда вы меняете индекс. Вместо этого объедините процесс как:

int _CurrentIndex; 
public int CurrentIndex
{
    get => _CurrentIndex;
    set
    {
         if (value != _CurrentIndex)
         {         
             _CurrentIndex = value;
             MediaElement.Source = new Uri(PlayedSongs[CurrentIndex].FullFileName);
             MediaElement.Play();
         }
    }
}

Не забудьте также проверить границы!

...