Образец Soundpool не готов - PullRequest
       4

Образец Soundpool не готов

21 голосов
/ 05 марта 2011

У меня есть файл .wav, который я хотел бы использовать в моей игре, в настоящее время я загружаю звук в onCreate() каждого действия в игре.

 soundCount = soundpool.load(this,R.raw.count, 1);

Звук будетиграется, как только начинается действие.

  soundpool.play(soundCount, 0.9f, 0.9f, 1, -1, 1f);

Проблема в том, что иногда я получаю сообщение об ошибке "sample x not ready".Можно ли загрузить WAV-файл один раз при запуске игры и сохранить его в памяти, а затем использовать его во всей игре?Или можно подождать 1-2 секунды, пока закончится загрузка звука?

Ответы [ 8 ]

33 голосов
/ 05 марта 2011

Вам нужно будет дождаться окончания, добавив слушателя через SoundPool.setOnLoadCompleteListener.

5 голосов
/ 05 июня 2011

Поскольку мой проект совместим с Android 1.5, и я не мог использовать setOnLoadCompleteListener, я решил сделать задержку воспроизведения звука. Мой исходный код выглядит следующим образом:

    playSound_Delayed(soundId, 100);

// (..)

private void playSound_Delayed (final int soundId, final long millisec) {
    // TIMER
    final Handler mHandler = new Handler();
    final Runnable mDelayedTimeTask = new Runnable() {
    int counter = 0;
    public void run() {
        counter++;

        if (counter == 1) {
            boolean ret = mHandler.postDelayed(this, millisec); 
            if (ret==false) Log.w("playSound_Delayed", "mHandler.postAtTime FAILED!");
       } else {
           playSound(soundId);
       }
    }
    };
    mDelayedTimeTask.run();
}
4 голосов
/ 13 сентября 2011

вы должны использовать setOnLoadCompleteListener, если это возможно ... если нет, оберните цикл while вокруг вашего вызова 'play'.что-то вроде:

int waitLimit = 1000;
int waitCounter = 0;
int throttle = 10;
while(soundPool.play(soundId, 1.f, 1.f, 1, 0, 1.f) == 0 && waitCounter < waitLimit)
 {waitCounter++; SystemClock.sleep(throttle);}

это будет повторять «воспроизведение» 1000 раз с интервалом 10 мс.это, конечно, должно выполняться в потоке, не являющемся пользовательским интерфейсом, и все еще не является идеальным.но, может быть, немного сильнее, чем ждать произвольное время и ожидать готовности бассейна.

2 голосов
/ 31 октября 2013

Это определенно подойдет вам!

public void playWavFile() {

    Thread streamThread = new Thread(new Runnable() {           

        @Override
        public void run() {                 
            SoundPool soundPool;
            final int wav;
            String path = "/mnt/sdcard/AudioRecorder/record.wav";
            soundPool = new SoundPool(5,AudioManager.STREAM_MUSIC, 0);
            wav = soundPool.load(path, 1);
            soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                @Override
                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    // TODO Auto-generated method stub
                    soundPool.play(wav,100, 100, 0, 0, 1f);
                }
            });

        }        
    });

    streamThread.start();
}   
2 голосов
/ 23 сентября 2012

Я решил проблему с простым делом. Метод play () возвращает ненулевой streamID в случае успеха, ноль в случае неудачи. Итак, достаточно проверить возвращаемое значение.

int streamID = -1;
do {
    streamID = soundPool.play(soundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
} while(streamID==0);
2 голосов
/ 13 августа 2012
private SoundPool soundPool;
private int my_sound;
boolean loaded = false;

// В конструкторе

soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
my_sound = soundPool.load(this, R.raw.blast_sound, 1);

soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
       loaded = true;
    }
});

// затем, где бы вы ни захотели воспроизвести звук, введите

if (loaded) {
soundPool.play(my_sound,  0.9f, 0.9f, 1, 0, 1f);
}
2 голосов
/ 05 августа 2011

Библиотека SoundPool использует сервис MediaPlayer для декодирования аудио в необработанный 16-битный монофонический или стереопоток PCM, который мы можем просто назвать подготовкой Stream, который занимает несколько раз в зависимости от размера звукового файла.И если мы попытаемся воспроизвести звук до завершения этого процесса, мы получим ошибку «sample x not ready».

Есть два решения для этого

  1. внедрить setOnLoadCompleteListener или
  2. подождать произвольное количество времени, чтобы подготовка была закончена

, а затем воспроизвести его. Обратите внимание, что для этого условия нет исключений, или приложение не аварийно завершает работу без попытки перехвата

1 голос
/ 24 марта 2012

Звучит безумно, но не играйте сразу.Дайте приложению пару секунд для инициализации SoundPool.В моем приложении это была именно проблема;Я добавил фальшивый экран «загрузки» ~ 3 секунды, и тогда все заработало.(Мне даже не нужно было предварительно загружать звуки.)

...