Android: воспроизведение звука бесконечно в SoundPool не воспроизводится второй раз после остановки

Я пытаюсь играть 2 звука через SoundPool,

Следующий тестовый код воспроизводит вторую игру без звука. Это происходит только тогда, когда я воспроизводю звук как бесконечный, как на устройстве HTC Hero, так и на эмуляторе. Я использую Android 1.6.

...
SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
int soundId1 = soundPool.load(getApplicationContext(), R.raw.sound1, 1);
int soundId2 = soundPool.load(getApplicationContext(), R.raw.sound2, 1);

// the first one plays
int streamId = soundPool.play(soundId1, 1.0f, 1.0f, 1, -1, 1.0f);
try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
soundPool.stop(streamId);

// the second one doesn't play
streamId = soundPool.play(soundId2, 1.0f, 1.0f, 1, -1, 1.0f);
try {
    Thread.sleep(3000);
} catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
soundPool.stop(streamId);
...

1 ответ

Глядя на эту строку в вашем коде для первого звука...

int streamId = soundPool.play(sound1, 1.0f, 1.0f, 1, -1, 1.0f);

Согласно этой ссылке, 5-й параметр определяет режим цикла. 0 для без цикла или -1 для цикла навсегда. Ваш код говорит -1, поэтому первый звук зацикливается навсегда, поэтому второй звук не воспроизводится. Попробуйте изменить режим петли первого звука на отсутствие петли, т.е. 0.

РЕДАКТИРОВАТЬ: Я думаю, что я знаю вашу проблему. Сэмплы не готовы, когда вы пытаетесь воспроизвести звук, поэтому вам нужно реализовать onLoadCompleteListener, чтобы сэмплы воспроизводились, когда они были готовы. Пример.

SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId,
                            int arg2) {
                streamId = soundPool.play(sampleId, 1.0f, 1.0f, 1, -1, 1.0f);
               }

        });
    int soundId1 = soundPool.load(getApplicationContext(), R.raw.tick, 1);      
    int soundId2 = soundPool.load(getApplicationContext(), R.raw.tock, 1);

Теперь после загрузки этих звуков они будут воспроизведены. Я проверил это, и оба звука воспроизводятся, потому что слушатель гарантирует, что они загружены до того, как будут воспроизведены.

Интегрируйте этот код в свой, и он должен решить проблему. Если это не так, дайте мне знать, и я постараюсь найти другое решение:)

Другие вопросы по тегам