Логика Android Soundpool
У меня есть две кнопки, которые воспроизводят файлы звукового пула с одинаковым приоритетом в цикле. Таким образом, если 1 кнопка играет в цикле, а другая нажата, это останавливается, а другая начинает играть. До этого все хорошо. Теперь предположим, что у меня есть каждый звуковой файл по 2 секунды, и после нажатия btn 2, btn 1 должен завершить звук файла 1, то есть в течение 2 секунд он должен воспроизводиться, если он только что начался и остановился. Как это может быть достигнуто?
В настоящее время, если я играю btn2, btn 1 прекращает воспроизведение в тот момент, когда файл не завершил воспроизведение, и запускает файл 2. Я хочу, чтобы файл 1 полностью воспроизводился перед остановкой.
Пожалуйста помоги!
1 ответ
Я не думаю, что вы можете достичь этого с помощью пула звуков, поскольку у пула звуков нет метода OnComletionListener или isPlaying.
Единственный способ добиться этого - создать новый поток, который прослушивает размер очереди и запускает медиаплеер с новым идентификатором, когда медиаплеер не воспроизводится. См. Код ниже
private Queue<Integer> qSoundID;
private MediaPlayer mp;
private void init(){
yourButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
qSoundID.add(R.raw.yoursoundid);
}
});
qSoundID = new LinkedList<Integer>();
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (qSoundID.size() > 0) {
if(mp==null||!mp.isPlaying()){
mp = MediaPlayer.create(MainActivity.this, qSoundID.poll());
mp.start();
}
}
}
}
}).start();
}
Или установите OnCompletionListener на MediaPlayer, который будет воспроизводить следующий идентификатор звука. См. Код ниже
private Queue<Integer> qSoundID;
private MediaPlayer mp;
private void init() {
yourButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int soundID = R.raw.yoursoundid;
playSound(soundID);
}
});
qSoundID = new LinkedList<Integer>();
}
private void playSound(int soundID) {
if (mp == null || !mp.isPlaying()) {
mp = MediaPlayer.create(MainActivity.this, soundID);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
playSound(qSoundID.poll());
}
});
mp.start();
}
else{
qSoundID.add(soundID);
}
}