[英]Problems with BackgroundPlayer in WP7
我在wp7项目中播放流音频时遇到问题。
在解决方案中,我要添加新的BackgroundPlayer项目并添加对常规项目的引用。 我的AudioPlayer.cs如下:
public class AudioPlayer : AudioPlayerAgent
{
public static List<AudioTrack> Playlist = new List<AudioTrack>();
public static int CurrentTrackPlayed;
private void PlayTrack(BackgroundAudioPlayer player)
{
player.Track = Playlist[CurrentTrackPlayed];
player.Play();
}
private void PlayNext(BackgroundAudioPlayer player)
{
if (++CurrentTrackPlayed >= Playlist.Count)
CurrentTrackPlayed = 0;
PlayTrack(player);
}
private void PlayBack(BackgroundAudioPlayer player)
{
if (--CurrentTrackPlayed < 0)
CurrentTrackPlayed = Playlist.Count - 1;
PlayTrack(player);
}
private static volatile bool _classInitialized;
public AudioPlayer()
{
if (_classInitialized) return;
_classInitialized = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += AudioPlayerUnhandledException;
});
}
private static void AudioPlayerUnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
if (System.Diagnostics.Debugger.IsAttached)
{
System.Diagnostics.Debugger.Break();
}
}
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.TrackEnded:
PlayNext(player);
break;
case PlayState.TrackReady:
player.Play();
break;
case PlayState.Shutdown:
// TODO: обработайте здесь состояние отключения (например, сохраните состояние)
break;
}
NotifyComplete();
}
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
MessageBox.Show(action.ToString());
switch (action)
{
case UserAction.Play:
PlayTrack(player);
break;
case UserAction.Stop:
player.Stop();
break;
case UserAction.Pause:
player.Pause();
break;
case UserAction.FastForward:
player.FastForward();
break;
case UserAction.Rewind:
player.Rewind();
break;
case UserAction.Seek:
player.Position = (TimeSpan) param;
break;
case UserAction.SkipNext:
PlayNext(player);
break;
case UserAction.SkipPrevious:
PlayBack(player);
break;
}
NotifyComplete();
}
protected override void OnError(BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal)
{
if (isFatal)
{
Abort();
}
else
{
NotifyComplete();
}
}
}
在我的一般项目中,首先,我向播放列表对象添加新的音轨:
AudioPlayer.Playlist = audios.Select(a => new AudioTrack(new Uri(a.Url, UriKind.Absolute), a.Title, a.Artist, null, null)).ToList();
AudioPlayer.CurrentTrackPlayed = 0;
接下来,我尝试使用此代码播放歌曲:
private void PlaySound(Audio a, Shape r)
{
try
{
if (_lastSelector != null)
_lastSelector.Fill = Application.Current.Resources["PhoneInverseBackgroundBrush"] as SolidColorBrush;
if (searchBox.Visibility == Visibility.Visible)
Store.CurrentAudioIndex = _searched.IndexOf(a);
else if (_isAudios)
Store.CurrentAudioIndex = _audios.IndexOf(a);
else if (_isRecommendations)
Store.CurrentAudioIndex = _recommendations.IndexOf(a);
BackgroundAudioPlayer.Instance.Play();
if (r != null)
{
r.Fill = VKMobile.Resources.AccentBrush;
_lastSelector = r;
}
}catch(Exception e)
{
MessageBox.Show(e.Message);
}
}
但这不起作用,无法开始播放
怎么了?
我没有测试它,但经过一些分析,我建议至少进行以下两个更改:
第一个是使用;
AudioPlayer.Playlist.AddRange( .... ); //no ToList() copy needed.
第二个是您认为错误的根源,在您将新的AudioTrack添加到播放列表后,未设置Singleton Backgroundplayer Track。
尝试添加如下内容:
player.Track = Playlist[CurrentTrackPlayed];
我会建议其他一些更改,例如在您的控制方法中删除BackgroundPlayer播放器参数。
它是一个单例,因此只有一个实例。 因此,静态属性名称为Instance。
您可以在整个AudioPlayer类中使用它相当简单,并在示例中添加所需的功能:
public static void AddAndPlayTrack(AudioTrack trackToPlay)
{
BackgroundAudioPlayer.Instance.Track = trackToPlay;
Playlist.Add(trackToPlay);
CurrentTrackPlayed = Playlist.LastIndexOf(trackToPlay);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.