【问题标题】:OpenAL source continues playing after stopped and deletedOpenAL源停止并删除后继续播放
【发布时间】:2011-11-06 09:58:26
【问题描述】:

我们的 ipad 应用程序会并行播放一堆 OpenAL 源,每个正在进行的触摸都有一个。源在 touchesMoved 时创建和启动,在 touchesEnded 或 touchesCancelled 时停止。

似乎一切正常,除了一个错误,有时一个源似乎在触摸结束后继续播放。这似乎只在生成大量触摸事件时才会发生。

我已经验证,当这种情况发生时,我的所有 AL 源都已使用 alSourceStop 停止,并已使用 alDeleteSources 销毁。 OpenAL 没有报告任何错误。然而声音并没有停止。

我开始认为这可能是 OpenAL 的 iOS 实现中的一个错误。有人见过这样的吗?

【问题讨论】:

  • 您如何将每个触摸事件与其对应的 OpenAL 声音相关联?你会错过关闭其中一个吗?
  • 您可以在您的 toucheEnded 方法中发布代码吗?
  • 至少可以在停止声音之前将增益设置为 0。如果它继续播放,那么你肯定会错过它。

标签: ios openal


【解决方案1】:

当一个或多个手指移动或结束触摸时触发触摸[Moved|Ended]。 iOS 有吗?硬限制是 5 个手指,而且事件似乎有点不稳定。如果您遇到此限制,您可能需要重新考虑您的实施。

由于您没有提供任何实现细节,因此很难假设您的代码可能存在什么错误。我不知道您是如何验证所有 AL 来源已停止的。也许您应该在启动源时增加一个全局变量,并在停止源时减少它,然后检查变量并确保它为 0(恕我直言,您可能会看到它 > 0)。 iOS 的最大源限制是 32,但您说您没有收到 openAL 错误...所以您可能没有达到。

【讨论】:

    【解决方案2】:

    我自己在 iPad 2 和 iOS 5 上启用了新的混响功能时遇到了同样的 OpenAL 问题。我可以绝对确认相同声音的播放/停止命令是配对的,即使你会出现问题不要重复使用资源。延迟停止无济于事,使用 GCD 监视生成的线程上的状态转换也无济于事。不知道如何继续,但我想我会在调试此问题时传递我的观察结果。

    【讨论】:

    • 嗨迈克尔,同样的问题发生在这里。你找到任何解决方案了吗?到目前为止,我的解决方案是提前 0.03 秒设置一个计时器,在计时器的回调中,我检查源是否没有播放并且排队的缓冲区计数 > 0,然后我将缓冲区设置为 nil,这会停止声音。但这也会导致“咔哒”声很脏,因为声音是“硬”停止的,并且没有像应有的那样随着混响淡出。
    【解决方案3】:

    您可能会发现以下解决方案很有帮助。我的应用程序遇到了同样的问题,到目前为止,我发现的最佳解决方案是简单地创建一个“静音”开放源(具有静音缓冲区的源,即 - 充满零),然后播放它总是在我停止声音之后。

    这似乎解决了即使在停止命令后仍继续播放声音的问题,尽管它偶尔会引入一个小的“点击”。无论如何,我发现一个小小的“咔哒”声比让声音在应该停止时继续播放更能忍受......

    希望这对那里的人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多