所以我在 WP 7.5 中遇到了后台音频播放代理的问题,我认为它在播放期间被操作系统随机终止。
我有一个应用程序,它实现了一个 BAP 代理,它根据 UI 中的选定章节播放许多 mp3 文件。每章都有多节经文,这些经文在独立存储中都有一个关联的 mp3 文件。
一旦在 UI 中选择了一个章节并且用户按下播放按钮BackgroundAudio.Instance.Play()
,就会调用该章节的第一节经文(mp3 文件)作为AudioTrack
. 当曲目结束时,在状态OnPlayStateChanged
下的事件方法中加载下一曲目TrackEnded
。
我还有一些逻辑TrackEnded
检查是否已到达章节结尾(即当前章节的最后一个 mp3 文件已播放),如果是,则将检索下一章的第一个 mp3 文件。
现在,当使用 Windows Phone 7 模拟器(512Mb 和 256Mb 模拟器)时,上述所有操作都可以正常工作,正确播放 mp3 文件,并且当到达一章结尾时,下一章的下一个 mp3 文件被正确加载和播放.
我遇到的问题是,当我将此应用程序部署到 Win 8 设备 (Lumia 920) 时,音频开始正常播放,并且突然且看似随机地停止了音频!没有错误消息,应用程序不会崩溃,只是音频停止播放。此外,当我单击设备上的 UVC 按钮时,AudioTrack
不会显示任何信息,就像音频播放期间的情况一样或音频已暂停(仅显示音量信息)。
我不知道发生了什么,我认为操作系统可能正在终止后台音频播放代理,但我不知道为什么(我认为我没有达到任何内存限制,但我无法确认这一点,因为我没有不知道如何检查我是否在)。
任何建议/帮助将不胜感激。
谢谢
2014 年 14 月 1 日更新
为了确认我的 BAP 没有达到 15Mb(WP7) 和 20Mb(WP8) 的内存限制,我实现了一些代码,记录了 BAP 在执行过程中各个阶段的当前内存使用情况。
内存使用量没有达到操作系统对 BAP 施加的限制,我达到的峰值是 7Mb 我上面描述的问题仍然存在,我可以从日志中看到已经设置了下一个轨道但是状态Trackready
永远不会被击中,也不会抛出异常/错误。这真的把我难住了!
2014 年 1 月 1日更新 以下是我如何实施 BAP 的示例:
public AudioPlayer()
{
if (!_classInitialized)
{
_classInitialized = true;
// Subscribe to the managed exception handler
Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += AudioPlayer_UnhandledException;
});
lastPlayedVerse = currentVerseNumber;
}
}
/// Code to execute on Unhandled Exceptions
private void AudioPlayer_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
//Helper class to help log any exceptions
IsolatedStore.WriteToIS("unhandeled Ex: " + e.ExceptionObject.Message, IsolatedStore.MemLogFileName);
if (System.Diagnostics.Debugger.IsAttached)
{
// An unhandled exception has occurred; break into the debugger
System.Diagnostics.Debugger.Break();
}
}
protected override void OnError(BackgroundAudioPlayer player, AudioTrack track, Exception error, bool isFatal)
{
//Helper class to help log any exceptions
IsolatedStore.WriteToIS("OnError Called: " + error.Message, IsolatedStore.MemLogFileName);
if (isFatal)
{
Abort();
}
else
{
NotifyComplete();
}
}
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.TrackEnded:
track = null;
IsolatedStore.AppendToFileIS(string.Format("Track Ended::Time: {0}",DateTime.Now.ToLongTimeString()), IsolatedStore.MemLogFileName);
#region Track Ended logic
//IN here I have some logic to determine what the next track should be and then I call a function that returns an AudioTrack
player.Track = GetNextTrack(); //this method returns an AudioTrack
#endregion
break;
case PlayState.TrackReady:
IsolatedStore.AppendToFileIS(string.Format("Track Ready::Time: {0}, Track: {1}", DateTime.Now.ToLongTimeString(),track.Title), IsolatedStore.MemLogFileName);
//Put this try catch in here becoz i thought that this is where the issue was (not sure if its needed as any exception should be caught by the AudioPlayer_UnhandledException function.
try
{
player.Play();
}
catch (Exception ex)
{
IsolatedStore.AppendToFileIS(string.Format("Track Ready play exception: {0}", ex.Message), IsolatedStore.MemLogFileName);
}
break;
}
NotifyComplete();
}
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
IsolatedStore.AppendToFileIS(string.Format("UA-PLAY::Time: {0}, Track: {1}", DateTime.Now.ToLongTimeString(),track.Title), IsolatedStore.MemLogFileName);
player.Play();
}
break;
}
NotifyComplete();
}
private AudioTrack GetNextTrack(int audioType2Get, string filePath, int verserNum, bool incrementTrackCount)
{
#region Memusage
//Code to log the memory usage
long currMemUsage = (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage");
currMemUsage = (currMemUsage / 1024) / 1024;
long peakMemUsage = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage");
peakMemUsage = (peakMemUsage / 1024) / 1024;
IsolatedStore.AppendToFileIS(string.Format("Getting Track-Time: {0}, Curr:{1}, Track: {2}", DateTime.Now.ToLongTimeString(), currMemUsage, verserNum), IsolatedStore.MemLogFileName);
#endregion
AudioTrack track = null;
#region AudioTrack Set region
//Some logic to return the AudioTrack
#endregion
}
更新 24/01/2014 问题已解决
我终于有时间尝试@Soonts 在我标记为答案的答案中推荐的内容,首先我使用的是 WP8 设备,所以我跳过了他提到的第一个 setp,接下来我按照步骤2,最大内存使用量仅为 8Mb。
几天前,我的 WP8 设备(WP8 Update 3)有一个更新,在我安装了这个更新后,我试图重现这个问题并猜猜是什么!该问题不再发生!,我的音频连续播放了一个多小时,没有任何问题!内存使用量也稳定在 8Mb 左右。所以看起来 BG Audio 可能已经进行了无声更新。
我将@snoots 答案标记为答案的原因是因为他在该答案中提到该问题可以通过静默更新来解决。