Логика 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);
    }
}
Другие вопросы по тегам