如何停止 SoundPool 中的所有声音?
Posted
技术标签:
【中文标题】如何停止 SoundPool 中的所有声音?【英文标题】:How to stop all sounds in SoundPool? 【发布时间】:2013-09-13 19:41:19 【问题描述】:我正在使用SoundPool
在 android 上的游戏中播放音效。在大多数情况下,它工作得很好,除了有时我需要一次停止所有声音 不暂停(不管它们是否设置为循环)。
在不知道该声音的StreamID
的情况下,我无法弄清楚如何阻止声音播放。我所知道的:
soundpool.load(
...一些声音...)
返回一个soundID
soundpool.play(
soundID)
播放声音并返回 streamID
soundpool.stop(
streamID)
停止声音
我的问题是,如何在不知道 streamID 的情况下停止声音?我尝试跟踪列表中的所有streamID,但有时一次播放的短流太多,无法正常工作。而且我在SoundPool
中找不到任何方法来获取活动的流ID。有谁知道如何停止所有声音?
任何提示表示赞赏!谢谢
【问题讨论】:
难道没有停止所有类型的呼叫吗? SoundPool.autoPause() 是该类中唯一用于一次停止所有流的方法。你是说这不符合你的需求? 当我暂停声音时,它们仍会被标记为已暂停,因此会在 autoResume() 上恢复。但是我不能恢复停止的声音(我在不同的场合使用 autoResume() 方法)@HowardPautz 不幸的是没有。 autoPause() 似乎是处理所有活动声音的唯一方法 好的,我不清楚为什么您在 id 列表中运行不会阻止它们。你在循环其中一些吗? 请记住,当您设置声音池的大小时,您定义了您拥有的数量,因此您知道如何调整数组或列表的大小(在性能上几乎没有差异),只需标记声音开或关。或者你可以像我一样使用数组或列表元素,比如保存 ID 的“槽”——槽只保存活动的 ID,所以你可以循环遍历它们。也许您应该发布您的列表代码?您是在控制来自不同线程的声音吗? 【参考方案1】:我建议使用 autoPause() 和 autoResume() 来暂停和重新启动您的声音。此函数是 soundpool 的一部分:
http://developer.android.com/reference/android/media/SoundPool.html#autoPause()
【讨论】:
【参考方案2】:使用.release()
怎么样?根据文档:
释放 SoundPool 资源。释放 SoundPool 对象使用的所有内存和本机资源。 SoundPool 无法再使用,应将引用设置为 null。
我认为它也会停止一切。 (实际上它导致我的一个应用程序出现错误,这就是我这么说的原因)
但是,我相信如果您以后想播放任何声音,您可能需要再次加载它们。
【讨论】:
感谢您的回答。在某种程度上,这就是我现在所做的。我将声音保存在不同的 SoundPool 中,因此如果声音需要停止,我可以释放 SoundPool。这样其他池中的声音仍然可以播放。它实际上可以工作,并且与活动 soundID 列表(可以单独停止)一起解决我的问题就足够了。尽管如此,我还是不明白为什么没有更直接的方法可以检查声音 ID 并根据需要停止或恢复它们。 (就像我坐在我的 CD 播放器前,每次我想停止一首曲目时都会弹出整张 CD ;)以上是关于如何停止 SoundPool 中的所有声音?的主要内容,如果未能解决你的问题,请参考以下文章