Android Soundpool - аномалия зацикленного воспроизведения

У меня возникают проблемы с воспроизведением зацикленных звуков с использованием файлов SoundPool и .OGG. У меня есть этот HashMap, настроенный для поиска звука, связанного с именем, и его воспроизведения/остановки.

    public void playLoopSound(String soundName){

        currentSound = (Integer) soundMap.get(soundName);

        if(currentSound != -1){
            try{
                Logger.log("Playing Loop Sound: " + currentSound);
                loopingSound = soundPool.play(currentSound, 1, 1, 0, -1, 1);
            } catch (Exception e) {
                Logger.log("Sound Playing Error: " + e.getMessage());
            }
        } else {
            Logger.log("Sound Not Found");
        }
    }

    public void stopLoopSound(){
        soundPool.stop(loopingSound);
        loopingSound = 0;
    }

Эта настройка работает нормально, я запускаю цикл, когда персонаж начинает ходить, и останавливаю его, когда он останавливается.

Однако звук переставал воспроизводиться случайным образом, обычно через минуту или около того после использования (включение и выключение) ...

Кто-нибудь еще сталкивался с подобными проблемами с SoundPool и зацикленными звуками?


person Alex    schedule 02.02.2012    source источник
comment
У меня точно такая же проблема. Я тоже использую звуковой пул, и он перестает воспроизводиться случайным образом.   -  person Evren Ozturk    schedule 03.03.2012
comment
@PsyCoder Я решил эту проблему, сохранив целое число зацикленного звука, а затем используя «SoundPool.pause» вместо «stop», когда я хотел, чтобы он прекратил воспроизведение. Проблема больше не возникала   -  person Alex    schedule 04.03.2012


Ответы (1)


Чтение документации по Soundpool многое проясняет:

-проигрывая звук, вы передаете int, ссылаясь на загруженный звук. Этот метод (и другие, запускающие воспроизведение звука) soundpool.play(int) возвращает int, относящийся к threadID, в котором теперь воспроизводится звук.

-когда вы хотите остановить звук (или зацикленный звук), вы должны использовать int threadID, который вы только что получили, когда начали воспроизводить звук, а НЕ int самого звука!

Затем в классе звукового пула вы устанавливаете private int threadIDInt = mSoundPool.play/setloop/whatever(int soundtobeplayed, int/float volumeleft, int/float volumeright, float speed, int loopornot); [примечание: аргументы немного выдуманы; посмотрите их]

Чтобы затем остановить звук (или приостановить, или установить его в цикл или нет), вы передаете mSoundPool.stop(threadIDINT);

TLDR: есть разница между int, который обозначает ваш звук, и внутренним int, который звуковой пул использует для обозначения потока, в котором воспроизводится ваш текущий звук.

person MacD    schedule 09.04.2012