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);
Теперь после загрузки этих звуков они будут воспроизведены. Я проверил это, и оба звука воспроизводятся, потому что слушатель гарантирует, что они загружены до того, как будут воспроизведены.
Интегрируйте этот код в свой, и он должен решить проблему. Если это не так, дайте мне знать, и я постараюсь найти другое решение:)