我发现了一个奇怪的问题,我会尽量解释它。
ASSUMTIONS:
根据我的知识,当您将AudioTrack设置为AudioPlayerAgent时,两个任务排队:Stop()和TrackReady();.似乎逻辑并且在大多数情况下工作完美。但是当我使用我的程序时,我发现有时它不太好:
问题:
所以我决定写一个非常简单的例子 - 你可以得到它here。只有一个按钮调用BackgroundAudioPlayer.Instance.Play();. (您必须在该示例中仅添加music.mp3文件 - 例如5-6 Mb mp3文件)。在Audio Agent中我有:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
player.Track = myMusic.ReturnTrack();
break;
我在Device(WP8)上以调试模式运行程序并按下我的播放按钮。然后我在大多数情况下看到Audio Agent中的OnPlayStateChanged没有被触发,看着进程,我看到我有无头'僵尸'。似乎是一个僵局。 (顺便说一下:在这个简单的例子中,我没有使用任何互斥锁或其他并发技术)Strange(或者可能不是)也是Stop()和TrackReady在队列中等待 - 如果你触发任何其他调用NotifyComplete()的方法;您将看到该队列被解锁。
我已经尝试了Realese版本而没有进行重新布局,它的效果更好但是有时会发生相同的情况。
如果我只添加:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Track = myMusic.ReturnTrack();
Thread.Sleep(100);
}
break;
一切都运作得更好。答案 0 :(得分:0)
你错误地连接了它 - 值得尝试检查后台音频代理的默认实现并与之进行比较。主要问题似乎是您尝试更改OnUserAction.Play
中的跟踪,这是API不期望的......
您需要在以下位置指定曲目:
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.TrackEnded:
player.Track = myMusic.ReturnTrack();
break;
将OnUserAction保留为:
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Play();
}
break;