如何停止 SoundPool 中的所有声音?

Posted

技术标签:

【中文标题】如何停止 SoundPool 中的所有声音?【英文标题】:How to stop all sounds in SoundPool? 【发布时间】:2013-09-13 19:41:19 【问题描述】:

我正在使用SoundPoolandroid 上的游戏中播放音效。在大多数情况下,它工作得很好,除了有时我需要一次停止所有声音 不暂停(不管它们是否设置为循环)。 在不知道该声音的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 中的所有声音?的主要内容,如果未能解决你的问题,请参考以下文章

在android soundpool中播放新声音时如何停止所有其他以前的声音?

如何停止通过 Soundpool 播放声音?

Soundpool 停止问题?

SoundPool 停止功能未停止

Seekbar 控制 Soundpool,停止工作

如何在 SoundPool 类中使用 stop() 方法?