如何使用SoundPool同步声音

时间:2010-12-03 04:32:51

标签: android audio soundpool android-audiomanager

我一直试图让几个声音在同一时间播放;目前我正在使用SoundPool的共享实例。我想在完全相同的时间播放1,2或3个声音而没有延迟。

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

Sudo代码:

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);

2 个答案:

答案 0 :(得分:0)

我完成了一个声音的声音池,它可能对你有帮助。   Android:sound pool and service

谢谢

答案 1 :(得分: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))