Логика цикла звукового пула Android

У меня есть две кнопки, которые воспроизводят файлы звукового пула с одинаковым приоритетом в цикле. Таким образом, если одна кнопка играет в цикле, а другая нажата, это останавливается, а другая начинает играть. До этого все нормально. Теперь предположим, что у меня есть каждый звуковой файл продолжительностью 2 секунды, и после нажатия btn 2, btn 1 должен завершить звук файла 1, то есть в течение 2 секунд он должен воспроизводиться, если он только что начался, и останавливаться. Как этого добиться?

В настоящее время, если я играю btn2, btn 1 прекращает воспроизведение в тот момент, когда воспроизведение файла не завершено, и запускает файл 2. Я хочу, чтобы файл 1 воспроизводился полностью перед остановкой.

Пожалуйста помоги!


person Kshitij Deshmukh    schedule 21.10.2015    source источник


Ответы (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);
    }
}
person HendraWD    schedule 21.10.2015
comment
ну, это не помогает, так как я не зря использую свойство цикла звукового пула. У меня много звуков продолжительностью в 2 секунды, и я хочу, чтобы следующий звук имел приоритет только после того, как текущий звук завершил воспроизведение (завершил свои 2 секунды) в цикле. Спасибо, в любом случае! - person Kshitij Deshmukh; 21.10.2015
comment
при использовании медиаплеера вы также можете установить цикл, вызвав MediaPlayer.setLooping (true); - person HendraWD; 22.10.2015
comment
тогда вы можете написать свою логику для воспроизведения следующего звука на OnCompletionListener, надеюсь, это поможет - person HendraWD; 22.10.2015