gpt4 book ai didi

c# - 背景音轨就绪无法正常工作 Windows Phone 8

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:26 25 4
gpt4 key购买 nike

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

假设:

据我所知,当您将新的 AudioTrack 设置为 AudioPlayerAgent 时,有两个任务排队:Stop() 和 TrackReady();。看起来合乎逻辑,在大多数情况下效果很好。但是当我使用我的程序时,我发现有时它不是很好:

问题:

所以我决定写一个非常简单的例子——你可以得到它here .只有一个按钮调用 BackgroundAudioPlayer.Instance.Play();。 (您必须在该示例中仅添加 music.mp3 文件 - 例如 5-6 Mb mp3 文件)。在音频代理中,我有:

case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
player.Track = myMusic.ReturnTrack();
break;

我在设备 (WP8) 上以 Debug模式运行程序并按下播放按钮。然后我看到在大多数情况下音频代理中的 OnPlayStateChanged 没有被触发,并且查看进程,我看到我有 Headless 'Zombie'。似乎陷入了僵局。 (顺便说一句:在这个简单的例子中,我没有使用任何 Mutexes 或其他并发技术)奇怪的(或可能不)还有 Stop() 和 TrackReady 在队列中等待 - 如果你触发任何其他调用 NotifyComplete() 的方法;你会看到队列被解除阻塞。
我在没有调试的情况下尝试了 Realese 版本,它工作得更好,但有时会发生同样的情况。

如果我只添加:

case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Track = myMusic.ReturnTrack();
Thread.Sleep(100);
}
break;

一切都变得更好了。

结论:

在我看来,加载新轨道是异步工作的,并且在加载轨道之前调用 NotifyComplete() - 是什么创建了这个“ headless 僵尸”进程。最糟糕的是,你在队列中等待操作的时间有限,用完后,你的 Agent 将被杀死。
我认为它不应该那样工作,因为设置新轨道是主要功能之一。

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

最佳答案

您连接错误 - 值得尝试检查后台音频代理的默认实现并与之进行比较。主要问题似乎是您正在尝试更改 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;

关于c# - 背景音轨就绪无法正常工作 Windows Phone 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20422102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com