gpt4 book ai didi

android - 为什么我的 SoundPool 声音不能在 Android 上第一次播放?

转载 作者:太空狗 更新时间:2023-10-29 14:29:12 25 4
gpt4 key购买 nike

我在 Android 上播放 Ogg Vorbis 声音时遇到了一个奇怪的问题,我很难纠正。我正在使用 SoundPool 类来播放声音。除了我在暂停后播放的第一个声音外,它的效果很好。

这是我遇到的问题:我有一个带有多个按钮的菜单。如果我按下一个按钮,我会播放滴答声。但是,我第一次尝试播放时,它没有发出声音。然后,如果我再次点击相同的菜单按钮,它就会起作用。如果我随后将下一次按键延迟几秒钟,问题就会再次出现。具体来说,我看到了以下行为:

  • 等几秒钟
  • 触摸应该发出声音的 UI 按钮......它没有
  • log cat 报告“AudioFlinger:写入阻塞 165 毫秒,66 次延迟写入,线程 0xec40”(当我触摸 UI 按钮时立即发生)
  • 等几秒钟
  • log cat 报告“AudioHardwareQSD:AudioHardware pcm 播放即将待机”
  • 触摸应该发出声音的 UI 按钮……但没有。
  • logcat 报告“AudioFlinger:写入阻塞 166 毫秒,67 次延迟写入,线程 0xec40”(当我触摸 UI 按钮时立即发生)
  • 再次触摸 UI 按钮,但之前出现 AudioHardwareQSD 待机消息...声音正常!

我在几个不同的设备上看到过这种行为:HTC Incredible、rooted Nook Color 和 HTC Thunderbolt,所以我不认为它是特定于设备的。

我猜这是 AudioHardwareQSD 进入待机状态的功能。一旦它处于待机状态,滑槽发出的第一个声音将被忽略,而随后的声音会一直工作,直到它再次进入待机状态。我的 HTC Incredible 上的“写入受阻”消息和 AudioHardwareQSD 消息之间大约有 3 秒的延迟。

此处 StackOverflow 上有一个答案讨论了使用 WakeLock 来防止这种情况发生。我尝试了该解决方案,但没有解决我的问题。

为什么会这样?有没有办法阻止 AudioHardwareQSD 进入待机状态?有人有解决此问题的任何提示吗?

谢谢!

更新:我已经能够实现一个相当粗略的解决方法来纠正这个问题。在我的应用程序(游戏)中,我有一个更完善的渲染类。我添加了一个由游戏逻辑定期执行的新方法 present()。该方法使用 1.5s 超时定时器。当计时器到达底部时,声音渲染器播放一个包含 50 毫秒静音的音频文件,然后重置计时器。

这已经纠正了我的问题......远非最佳,但它有效。

最佳答案

Android SoundPool 真的很糟糕。我必须

  int streamid = soundPool.play(sid, soundVolume, soundVolume, 0, loopVal, 1.0f);
if (streamid == 0) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} while(streamid == 0 && retry++<3);

但这并不理想,它确实会降低帧速率。

关于android - 为什么我的 SoundPool 声音不能在 Android 上第一次播放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8458498/

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