背景音频代理和音频流媒体Windows手机C#的麻烦

时间:2013-04-29 17:16:48

标签: c# audio windows-phone

所以,我有这个应用程序,我想从轨道列表中选择一个轨道并播放它。问题是,某些曲目需要媒体流源进行播放(例如,ogg文件)。

在背景音频代理中,我被指示将音频轨道的源属性保留为空,如果我希望让MSS为我做解码而不使用内置芯片那么。基本上,我在前台应用程序中做的是:

创建音轨实例,其源设置为null。我将标记设置为携带识别文件所需的所有内容,以便我可以在后台代理中使用它。

在背景音频代理中,我遵循执行,一切似乎都很好,直到我尝试解压缩标签以确定前景应用程序想要播放的内容。此时,我得到一个Argument Out of Range异常,说Source属性不能为null。

我想我在某个地方做了一些可怕的错误,但我不明白为什么当我想要使用tag属性时,CLR会抛出关于源的异常。

经过一些研究后,我发现正确处理了不需要媒体流源的曲目。但是,如果我将source属性设置为null,不知何故,来自Audio Track的所有数据都将被删除。我的Track工厂(创建这些轨道的方法),如果我将源设置为null,则返回没有标记的轨道,否则工作正常。

AudioTrack GetTrack(LowMemorySongDisplay t)
    {
        AudioTrack track;
        for (int i = 0; i < SystemSupportedFormats.Length; i++)
        {
            if (t.SkydriveSong.Name.ToLower().Contains(SystemSupportedFormats[i]))
            {
                track = new AudioTrack(new Uri("MUSIC/" + t.SkydriveSong.Name, UriKind.Relative), t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress() + "?", EnabledPlayerControls.All);
                return track;
            }
        }
       return track = new AudioTrack(null, t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress() + "?", EnabledPlayerControls.All);
    }

如您所见,此方法返回2个不同的轨道,具体取决于文件支持的格式条件。 mp3文件将获取源作为URI,而OGG将获得null(如音频代理中所指示)。这基本上是他们建构的唯一区别。

但是,具有null源的轨道似乎忽略了其他所有内容,并使其所有其他成员也为空...

这是调用它的方法

void SongsList_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
        try
        {
            if (App.IsmediaLib)
            {
                MediaPlayer.Play(((LowMemorySongDisplay)(SongsList.SelectedItem)).associatedSong);
            }
            else
            {
                AudioTrack track;
                var t= ((LowMemorySongDisplay)(SongsList.SelectedItem));




                //BackgroundAudioPlayer.Instance.Track = new AudioTrack(new Uri("MUSIC/" + t.SkydriveSong.Name, UriKind.Relative), t.SkydriveSong.Name, t.SkydriveSong.Artist, t.SkydriveSong.Album, null, t.SkydriveSong.Compress()+"?", EnabledPlayerControls.All);
                                  Collection.Clear();
                Collection.Add(new LowMemorySongDisplay(t.SkydriveSong));
                //PlayListCOntainer.ItemsSource = Collection;
                command = "fromtag";
                SaveState();
                ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).IconUri = new Uri("Assets/transport.pause.png", UriKind.Relative);
                ((ApplicationBarIconButton)ApplicationBar.Buttons[1]).Text = "pause";
                BackgroundAudioPlayer.Instance.Track = GetTrack(t);
                BackgroundAudioPlayer.Instance.Play();
            }
        }
        catch (Exception te) { te.ToString(); }

    }

此处抛出异常

protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
    {
        try
        {

            if (PlaylistName == null && track.Tag != null && track.Tag.Contains('>') == false)
            {
                PlaylistName = track.Tag;
                DeserializeSongData();
            }
            else if (PlaylistName == null && track.Tag == null)
            {
                PlaylistName = "allsongs";
                DeserializeSongData();
            }
            else if (PlaylistName != track.Tag && track.Tag != null && track.Tag.Contains('>') == false)
            {
                PlaylistName = track.Tag;
                DeserializeSongData();
            }

            else if(track.Tag.Contains('?') && Command=="fromtag")
            {   **//above line throws exception**
                string[] t = track.Tag.Split('?');
                NowPlaying.Add(new MusicDataStorage(t[0].Split('>')));
                Command = "donothing";
                if (NowPlaying.Count > 1)
                {
                    NowPlaying.RemoveAt(0);
                }


            }
        }
        catch (Exception e) { e.ToString(); }
            switch (playState)
            {
                case PlayState.TrackEnded:
                    player.Track = GetPreviousTrack();
                    break;
                case PlayState.TrackReady:
                    player.Play();
                    break;
                case PlayState.Shutdown:
                    SaveState();
                    break;
                case PlayState.Unknown:
                    break;
                case PlayState.Stopped:
                    break;
                case PlayState.Paused:
                    break;
                case PlayState.Playing:
                    break;
                case PlayState.BufferingStarted:
                    break;
                case PlayState.BufferingStopped:
                    break;
                case PlayState.Rewinding:
                    break;
                case PlayState.FastForwarding:
                    break;
            }

        NotifyComplete();
    }

0 个答案:

没有答案