所以,我有这个应用程序,我想从轨道列表中选择一个轨道并播放它。问题是,某些曲目需要媒体流源进行播放(例如,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();
}