Я пытаюсь создать плейлист в Xamarin Forms, используя список аудио, которые можно добавить в ListView
через другие ListView
с. Я использую плагин SimpleAudioPlayer , чтобы достичь этого. Я хотел бы, чтобы несколько аудио воспроизводились последовательно.
Функция воспроизведения работает нормально, а Stream
не выбрасывает Exception
. Прямо сейчас код воспроизводит всегда один и тот же звук несколько раз. Чтобы достичь последовательного эффекта, я попытался создать цикл while, используя свойства CurrentPosition
и Duration
внутри цикла for для каждой дорожки в списке воспроизведения, но я не нашел никакой самообвиняемой документации об этих двух свойствах.
using G.Models;
using Plugin.SimpleAudioPlayer;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Windows.Input;
using Xamarin.Forms;
namespace G.ViewModels
{
class ABSViewModel : BaseViewModel{
public ObservableCollection<PlayListItem> Playlist { get; set; }
public ICommand PlayPlaylistCommand { get; set; }
private PlayListItem playlistSelectedItem;
public PlayListItem PlaylistSelectedItem
{
get {
return playlistSelectedItem;
}
set {
playlistSelectedItem = value;
}
}
public ABSViewModel()
{
audio = CrossSimpleAudioPlayer.CreateSimpleAudioPlayer();
PlayButtonText = "PLAY";
PlayButtonImage = "play_icon.png";
PlayButtonFlag = "1";
PlayPlaylistCommand = new Command(PlayPlaylist);
Playlist = new ObservableCollection<PlayListItem>();
}
private async void PlayPlaylist()
{
if (PlayButtonFlag == "1")
{
PlayButtonText = "PAUSE";
PlayButtonImage = "pause_icon.png";
PlayButtonFlag = "0";
int startPosition;
if(PlaylistSelectedItem != null)
{
startPosition = 0;
}
else
{
startPosition = Playlist.IndexOf(playlistSelectedItem);
}
for(int i = 0; i < Playlist.Count; i++)
{
if (audio.IsPlaying) audio.Stop();
PlaylistSelectedItem = Playlist[i];
OnPropertyChanged(nameof(Playlist));
audio.Load(GetStreamFromFile(Playlist[i].Name + ".wav"));
audio.Play();
while (audio.CurrentPosition != audio.Duration) {
Debug.WriteLine("Test");
}
}
}
else
{
PlayButtonText = "PLAY";
PlayButtonImage = "play_icon.png";
PlayButtonFlag = "1";
if (audio.IsPlaying) audio.Pause();
}
NotifyButtonChange();
}
Stream GetStreamFromFile(string filename)
{
var assembly = typeof(App).GetTypeInfo().Assembly;
var stream = assembly.GetManifestResourceStream("G2019." + "RSNZBile.wav");
return stream;
}
private void NotifyButtonChange()
{
OnPropertyChanged(nameof(PlayButtonText));
OnPropertyChanged(nameof(PlayButtonImage));
OnPropertyChanged(nameof(PlayButtonFlag));
}
}
}
Я опускаю Command
s, чтобы добавить элементы в список воспроизведения или остановить воспроизведение списка воспроизведения, потому что я думаю, что они находятся вне контекста. Теперь, когда я нажимаю кнопку «Воспроизвести», я вижу в отладчике, что мой цикл while
вообще не запустился. Таким образом, проигрыватель воспроизводит все элементы списка воспроизведения за несколько миллисекунд, и единственный, который человек может услышать, является последним. Это потому, что мои свойства CurrentPosition
и Duration
установлены на 0. Почему? Кто-нибудь пытался сделать что-то подобное?