1

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

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

创建一个音轨实例,其源设置为 null。我将标签设置为携带识别文件所需的一切,因此我可以在后台代理中使用它。

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

我想我在某处做错了什么,但是当我想使用 tag 属性时,我不明白为什么 CLR 会抛出关于源的异常。

经过更多研究,我发现不需要媒体流源的轨道可以正确处理。但是,如果我将源属性设置为 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(按照音频代理中的说明)。这基本上是它们构造的唯一区别。

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

这是调用它的方法

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();
    }
4

0 回答 0