Android Soundpool - зацикленная аномалия воспроизведения - PullRequest
0 голосов
/ 02 февраля 2012

У меня проблемы с воспроизведением зацикленных звуков с использованием файлов 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 изацикленные звуки?

1 Ответ

3 голосов
/ 09 апреля 2012

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

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

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

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

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

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

...