それで、私はトラックのリストからトラックを選択して再生したいこのアプリケーションを持っています。問題は、再生にメディア ストリーム ソース (ogg ファイルなど) が必要なトラックがあることです。
バックグラウンド オーディオ エージェントでは、オーディオ トラックのソース プロパティを null のままにしておくように指示されます。MSS にデコードを行わせ、組み込みチップを使用しないようにしたい場合は、基本的に、私は何をしますか?フォアグラウンドアプリではこれです:
ソースを null に設定して、オーディオ トラック インスタンスを作成します。バックグラウンド エージェントで使用できるように、ファイルの識別に必要なすべてを保持するようにタグを設定します。
バックグラウンド オーディオ エージェントで実行を追跡すると、フォアグラウンド アプリが何を再生したいかを把握するためにタグを解凍しようとするところまで、すべて問題ないように見えます。この時点で、Source プロパティを null にすることはできないという Argument Out of Range 例外が発生します。
どこかでひどく間違ったことをしていると思いますが、タグプロパティを操作したいときに、CLR がソースに関する例外をスローする理由がわかりません。
さらに調査した結果、メディア ストリーム ソースを必要としないトラックは正しく処理されることがわかりました。ただし、source プロパティを null に設定すると、どういうわけか、オーディオ トラックのすべてのデータが消去されます。マイ トラック ファクトリ (これらのトラックを作成するメソッド) は、ソースを 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 のトラックは、他のすべてを無視し、他のすべてのメンバーも 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();
}