如何在第一个结束时播放声音文件?

时间:2017-04-04 08:43:54

标签: c# uwp

我有这段代码:

    MediaElement player = new MediaElement();
    Windows.Storage.StorageFolder folder;
    Windows.Storage.StorageFile file;
    string FileName = "";

    private async void Play(string Tno, string Cno)
    {
        folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");

        for (int i = 1; i <= 4; i++)
        {
            switch (i)
            {
                case 1:
                    FileName = "Sound\\mysound1.wav";
                    break;
                case 2:
                    FileName = "Sound\\mysound2.wav";
                    break;
                case 3:
                    FileName = "Sound\\mysound3.wav";
                    break;
                case 4:
                    FileName = "Sound\\mysound4.wav";
                    break;
            }

            file = await folder.GetFileAsync(FileName);
            player.SetSource(await file.OpenAsync(Windows.Storage.FileAccessMode.Read), file.ContentType);
            player.Play();
    }
}

播放声音&#34; mysound4.wav&#34;。 当我跟踪代码时,它会快速播放4个文件,没有任何延迟。 那么如何在第一个文件完成后才能播放第二个文件?

1 个答案:

答案 0 :(得分:2)

在WPF应用程序中,解决方案可以是使用像这样的队列......

public partial class MainWindow : Window
{
    private readonly Queue<string> _audioFilesQueue = new Queue<string>();
    private readonly MediaElement _player;

    public MainWindow()
    {
        InitializeComponent();

        _player = new MediaElement();
        _player.LoadedBehavior = MediaState.Manual;
        _player.UnloadedBehavior = MediaState.Manual;
        _player.MediaEnded += Player_MediaEnded;
    }

    private void Player_MediaEnded(object sender, RoutedEventArgs e)
    {
        OnProcessQueue();
    }

    private void Btn_OnClick(object sender, RoutedEventArgs e)
    {
        PlayCascade(new[]
        {
            "X:\\Library\\Sounds\\Other\\sound1.wav",
            "X:\\Library\\Sounds\\Other\\sound2.wav",
            "X:\\Library\\Sounds\\Other\\sound3.wav"
        });
    }

    private void PlayCascade(string[] sequence)
    {
        foreach (var file in sequence)
        {
            _audioFilesQueue.Enqueue(file);
        }
        OnProcessQueue();
    }

    private void OnProcessQueue()
    {
        Dispatcher.Invoke(() =>
        {
            if (_audioFilesQueue.Any())
            {
                var toPlay = _audioFilesQueue.Dequeue();
                _player.Source = new Uri(toPlay);
                _player.Play();
            }
        });
    }