如何在BackgroundAudioPlayer中重新加载播放列表?

时间:2012-12-14 22:18:09

标签: c# .net windows-phone-7 background-audio

我有一个解决方案,其中包括2个项目:main progect和PlayListFilePlayBackAgent。 enter image description here

在主项目中,在MainPage中有一个listBox,它显示不同的内容。有些内容有audioformat,当我在列表框的项目中看到标题和表演者时 - 我点击此列表框项目中的“播放”按钮。此按钮进行一些操作(从某些服务器获取跟踪的URL),然后转到页面AudioPage。在AudioPage中,某些方法从这些网址创建播放列表,而不是以xml格式(序列化)保存在isolatedStorage中。 这是PlayList.cs

 public class Playlist
{
    public Playlist()
    {
        Tracks = new List<PlaylistTrack>();
    }

    [XmlElement(ElementName = "Track")]
    public List<PlaylistTrack> Tracks { set; get; }
    [XmlElement(ElementName = "TrackCount")]
    public int TrackCount { set; get; }

    public static Playlist Load(string filename)
    {
        Playlist playlist = null;

        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = storage.OpenFile(filename, FileMode.Open))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
                playlist = xmlSerializer.Deserialize(stream) as Playlist;
            }
        }
        return playlist;
    }

    public void Save(string filename)
    {
        using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
        {
            using (IsolatedStorageFileStream stream = storage.CreateFile(filename))
            {
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
                xmlSerializer.Serialize(stream, this);
            }
        }
    }
}

PlayBackAgent比将此xml反序列化为播放列表并播放它。

这一切都很好,但是当我想听那些不在列表框项目中的曲目我有问题。 我回到我的列表框,而不是选择一些轨道和按钮“播放”。在按钮处理程序中,我.Clear();我的收藏,获取新曲目的新网址,转到AudioPage并制作新的播放列表。但在模拟器中,我看到之前听过的音乐相同。我认为问题在于PlayListFilePlayBackAgent不会从isolatedStorade更新播放列表。但是,当我点击不同的按钮“播放” - 字段TrackCount更改(不介意它的名称,它只是说播放列表中必须播放播放器的轨道数),我可以在写入Debug.WriteLine(Convert.ToString(playlist.TrackCount));时在输出中看到它AudioPlayer.cs。所以我拥有:一个音频播放器,它只播放我给他的第一个播放列表中的音乐。当我想要收听另一个播放列表时 - 在AudioPage中,我看到旧的播放列表并且只能从那些旧的播放列表中收听音乐。我想要的是:当我按下“播放”按钮时,每次都可以更改播放列表的音频播放器,并且可以播放此音乐。

PS:我使用PlayListFilePlayBackAgent,因为它可以播放音乐,即使我关闭此应用程序。如果您需要更多代码 - 请告诉我。感谢。

更新: 按钮处理程序

        private void Audio_Button_Click(object sender, RoutedEventArgs e)
    {
        string uri = null;
        TextBox tb = null;
        var grid = (Grid)((Button)sender).Parent;
        foreach (var child in grid.Children)
        {
            if (child is TextBox && (string)((TextBox)child).Tag == "URL")
            {
                tb = (TextBox)child;
            }
        }
        uri = tb.Text;
        BackgroundAudioPlayer.Instance.SkipNext();

        //MessageBox.Show(uri);

        string url = string.Format("https://api.vk.com/method/audio.getById.xml?audios={0}&access_token={1}", uri, App.AccessToken);

        var c = new WebClient();
        c.OpenReadCompleted += (sender1, e1) =>
        {
            XDocument xml = XDocument.Load(e1.Result);
            MessageBox.Show(xml.ToString());
            var inf = from u in xml.Descendants("audio")
                      select u;
            AudioPage.audios.Clear();
            foreach (var item in inf)
            {
                AudioPage.audios.Add(new AudioAttachment((string)item.Element("url"), (string)item.Element("title"), (string)item.Element("artist")));
            }
            string destination = string.Format("/AudioPage.xaml");
            NavigationService.Navigate(new Uri(destination, UriKind.Relative));
            AudioPage.count = 0;

        };
        c.OpenReadAsync(new Uri(url));
    }

OnUseraction.cs

        protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
    {
        switch (action)
        {
            case UserAction.Play:
                if (player.Track == null)
                {
                    // Load playlist from isolated storage
                    if (playlist == null)
                        playlist = Playlist.Load("playlist.xml");
                 //   Debug.WriteLine(playlist.Tracks[0].Title);
                    Debug.WriteLine(Convert.ToString(playlist.TrackCount));
                    currentTrack = playlist.TrackCount;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Play();
                }
                break;

            case UserAction.Pause:
                player.Pause();
                break;

            case UserAction.SkipNext:
                if (currentTrack < playlist.Tracks.Count - 1)
                {
                    currentTrack += 1;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Track = null;
                }
                break;

            case UserAction.SkipPrevious:
                if (currentTrack > 0)
                {
                    currentTrack -= 1;
                    player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
                }
                else
                {
                    player.Track = null;
                }
                break;

            case UserAction.Seek:
                player.Position = (TimeSpan)param;
                break;
        }
        NotifyComplete();
    }

3 个答案:

答案 0 :(得分:0)

如果您在UI中更改了播放列表,则需要某种方式向代理发送信号,告知它需要更改播放内容,否则它将继续播放当前曲目。

当用户点击播放按钮时,请从您的应用中调用BackgroundAudioPlayer.Instance.SkipNext,当您在代理商代码中获得OnUserAction事件时,您将能够重新检查播放列表XML文件。

答案 1 :(得分:0)

if (playlist == null)
    playlist = Playlist.Load("playlist.xml");

您在哪里将播放列表设置为Null?

男人,我感受到你的痛苦。我有完全相同的情况,并使用完全相同的方法(除了我使用IsolatedStorageSettings.ApplicationSettings集合而不是写入文件)。

它适用于第一轮。

行为真的很奇怪..我在前台应用程序上看到了数据更新,但是从播放器中读取相同的设置不会给我新的数据。我也尝试使用新的设置键(如果BAP缓存结果或其他东西),但我得到一些不稳定的结果,它将工作2-5更新,然后只是停止在集合中看到新的设置键。让我疯狂......

我还注意到音轨的Tag属性似乎被正确复制了,所以我尝试序列化我的播放列表并通过标签作为字符串值传递,但是得到了一些内存不足或其他的错误。看起来他们有自己的限制。

如果您对这个问题感到满意,请告诉我。

答案 2 :(得分:0)

也许是有关在Windows Phone上播放音频的最详细信息之一。在此处查看项目http://developer.nokia.com/community/wiki/Streaming_MP3_player_in_WP7

但是我必须说,在我的情况下,我必须加载数据库并通过循环遍历列表而不使用JSON来提取信息。以下是代码;

private void LoadPlayListFromIsolatedStorage(BackgroundAudioPlayer player)
    {
        // clear previous playlist
        _playList.Clear();
        // access to isolated storage
        IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("AlbumsData.dat", FileMode.OpenOrCreate, isoStore))
        {
            if (stream.Length > 0)
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(List<Album>));
                List<Album> strm = serializer.ReadObject(stream) as List<Album>;
                List<Song> _songs = strm[0].Songs;
                for (int i = 0; i < _songs.Count; i++)
                {
                    AudioTrack audioTrack = new AudioTrack(
                            new Uri(_songs[i].Directory, UriKind.Absolute), // URL
                            _songs[i].Title,         // MP3 Music Title
                            "Artist",        // MP3 Music Artist
                            "Album",         // MP3 Music Album name
                            new Uri(_songs[i].AlbumArt, UriKind.Absolute)    // MP3 Music Artwork URL
                            );

                    _playList.Add(audioTrack);
                }
            }
            else
            {
                // no AudioTracks from Isolated Storage
            }
            // start playing
            PlayTrack(player);

        }