7

我一直在尝试同时播放一些声音;目前我正在使用 SoundPool 的共享实例。我希望同时播放 1、2 或 3 种声音,没有延迟。

当连续调用 SoundPool.play(...) X 次时,声音会按照人们想象的顺序播放。什么是正确的实现这一目标的方法是什么,我可以准备同时播放的所有声音,然后将它们作为一个播放?

须藤代码:

SoundPool _soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

_soundPool.load(_context, soundId1, 1);
_soundPool.load(_context, soundId2, 1);
_soundPool.load(_context, soundId3, 1);

_soundPool.play(soundId1, vol, vol, 1, 0, 1f);
_soundPool.play(soundId2, vol, vol, 1, 0, 1f);
_soundPool.play(soundId3, vol, vol, 1, 0, 1f);
4

2 回答 2

0

我一次完成了一个声音的声音池,它可能会对你有所帮助。 Android:声音池和服务

谢谢

于 2011-06-13T04:37:43.543 回答
0

您需要了解该SoundPool.load方法是异步的,因此当您连续调用它 3 次,然后调用 play 时,无法保证这听起来确实已加载。所以你需要等到所有声音都加载完毕。对于那个用途OnLoadCompleteListener

fun loadAndPlay(soundPool: SoundPool, context: Context, resIds: IntArray) {
    val soundIds = IntArray(resIds.size) {
        soundPool.load(context, resIds[it], 1)
    }

    var numLoaded: Int = 0

    soundPool.setOnLoadCompleteListener { sPool, sampleId, status ->
        numLoaded++

        if (numLoaded == resIds.size) {
            soundPool.setOnLoadCompleteListener(null)

            for (id in soundIds) {
                soundPool.play(id, 1f, 1f, 1, 0, 1f)
            }
        }
    }
}

要使用:

loadAndPlay(soundPool, context, intArrayOf(R.raw.sound_1, R.raw.sound_2, R.raw.sound_3))
于 2020-04-06T09:42:56.300 回答