背景音频轨道准备工作不正常Windows Phone 8

时间:2013-12-06 10:54:18

标签: c# windows-phone-8 thread-safety background-audio

我发现了一个奇怪的问题,我会尽量解释它。

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;
一切都运作得更好。

结论:

在我看来,加载新轨道是异步工作的,并且在加载轨道之前调用NotifyComplete() - 这就是创建这个'无头僵尸'过程的原因。最糟糕的是你在排队等待的时间有限,在你的用完之后,你的特工被杀了 在我看来,它不应该那样,因为设定新轨道是主要功能之一。

有人知道这个问题吗?这是操作系统的错误或不当行为还是我缺乏知识?

1 个答案:

答案 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;