Dizzy
Dizzy

Reputation: 33

Want to Open multiple audio files and play them in UWP

I want to open multiple audio files in UWP using the FileOpenPicker but I am getting an error that I cant Cannot Convert. How can I fix this? And if this is fixed, will all the audio files play in order or all at the same time?

public MainPage()
{
    this.InitializeComponent();
}
MediaSource media_source;
MediaPlayer media_player;


public async System.Threading.Tasks.Task OpenfileAsync()
{
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();

    filePicker.FileTypeFilter.Add(".mp3");
    filePicker.FileTypeFilter.Add(".mp4");
    filePicker.FileTypeFilter.Add(".ogg");
    filePicker.FileTypeFilter.Add(".wav");
    filePicker.FileTypeFilter.Add(".wma");

    filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

    StorageFile file = await filePicker.PickSingleFileAsync();

    if (file != null)
    {
        media_source = MediaSource.CreateFromStorageFile(file);
        media_player = new MediaPlayer();
        media_player.Source = media_source;
        mediaPlayerElement.SetMediaPlayer(media_player);
        media_player.Play();
    }
}

private async void Select_track_Click(object sender, RoutedEventArgs e)
{
    await OpenfileAsync();
}
public async System.Threading.Tasks.Task OpenMultipleAsync()
{
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();
    filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

    filePicker.FileTypeFilter.Add(".mp3");
    filePicker.FileTypeFilter.Add(".mp4");
    filePicker.FileTypeFilter.Add(".ogg");
    filePicker.FileTypeFilter.Add(".wav");
    filePicker.FileTypeFilter.Add(".wma");
    filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

    StorageFile file = await filePicker.PickMultipleFilesAsync();

    if (file != null)
    {

        media_source = MediaSource.CreateFromStorageFile(file);
        media_player = new MediaPlayer();
        media_player.Source = media_source;
        mediaPlayerElement.SetMediaPlayer(media_player);
        media_player.Play();

    }

}
private async void playlist_Click(object sender, RoutedEventArgs e)
{
    await OpenMultipleAsync();
}

I am getting the error at StorageFile file = await filepicker.PickmultiplefilesAsync();

Upvotes: 2

Views: 485

Answers (2)

Martin Zikmund
Martin Zikmund

Reputation: 39072

The FileOpenPicker.PickMultipleFilesAsync method has the following signature:

IAsyncOperation<IReadOnlyList<StorageFile>> PickMultipleFilesAsync()

In contrast to PickFileAsync it returns a IReadOnlyList<StorageFile>, so you will actually get a list of multiple files the user selected. You should update the code like this:

var files = await filePicker.PickMultipleFilesAsync();

foreach (var file in files)
{
    if (file != null)
    {
        media_source = MediaSource.CreateFromStorageFile(file);
        media_player = new MediaPlayer();
        media_player.Source = media_source;
        mediaPlayerElement.SetMediaPlayer(media_player);
        media_player.Play();
    }
}

This solution will play all the sounds at once. For one by one playback you can use @touseefbsb solution :-) .

Upvotes: 1

Muhammad Touseef
Muhammad Touseef

Reputation: 4455

for playing a list of files its best that you use MediaPlaybackList

Also you only need to set the SuggestedStartLocation once, and when you use PickMultipleFilesAsync() you get a List of files returned so you need that iterate through that list to get all files and add them to your MediaPlaybackList

Modify your OpenMultipleAsync method like this :

public async System.Threading.Tasks.Task OpenMultipleAsync()
{
    var filePicker = new Windows.Storage.Pickers.FileOpenPicker();

    filePicker.FileTypeFilter.Add(".mp3");
    filePicker.FileTypeFilter.Add(".mp4");
    filePicker.FileTypeFilter.Add(".ogg");
    filePicker.FileTypeFilter.Add(".wav");
    filePicker.FileTypeFilter.Add(".wma");
    filePicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.MusicLibrary;

    _mediaPlaybackList = new MediaPlaybackList();

    var files = await filePicker.PickMultipleFilesAsync();

    foreach (var file in files)
    {
        var mediaPlaybackItem = new MediaPlaybackItem(MediaSource.CreateFromStorageFile(file));
        _mediaPlaybackList.Items.Add(mediaPlaybackItem);
    }

    _mediaPlayer = new MediaPlayer();
    _mediaPlayer.Source = _mediaPlaybackList;
    mediaPlayerElement.SetMediaPlayer(_mediaPlayer);
}

More details about MediaPlaybackItem can be seen here

and to answer 'will these media files play together at the same time or one after the other' : they will play one after the other in a row, that is the purpose if MediaPlaybackList, it supports gapless playback for playlists.

Upvotes: 1

Related Questions