Загрузка и воспроизведение звукового пула из активов

У меня есть куча звуков, назначенных группе кнопок, которые мне нужно воспроизвести. Все мои звуки находятся в папке с активами. Однако это не работает. Цель: загрузить из assetsFodler и воспроизвести звук. Я приведу примеры кода из моего проекта:

//set up  audio player
    mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
    streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

 //getting files lists from asset folder
    aMan = this.getAssets();
    try {
        filelist = aMan.list("");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Чтобы не было много строк кода, я создал базовую процедуру для загрузки и воспроизведения звуков:

public void loadSound (String strSound, int stream) {

    try {
        stream= mSoundPool.load(aMan.openFd(strSound), 1);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);
}

Как видите, я передаю файл (stringName) и streamID.

Наконец, вот как я его использую:

     case R.id.button1:
        //if button was clicked two or more times, when play is still on im doing stop
    mSoundPool.stop(mStream1);
    loadSound(filelist[0],mStream1);
        break;

Когда я запускаю проект, ничего не происходит, и logcat говорит:

12-09 10:38:34.851: W/SoundPool(17331):   sample 2 not READY

Любая помощь будет оценена по достоинству.

UPD1: Когда я делаю это таким образом, без процедуры loadSound он отлично работает, следующий код onCreate:

//load fx
    try {
        mSoundPoolMap.put(RAW_1_1, mSoundPool.load(aMan.openFd(filelist[0]), 1));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

и кнопка Onclick:

  //resourcePlayer.stop();
        mSoundPool.stop(mStream1);
        mStream1= mSoundPool.play(mSoundPoolMap.get(RAW_1_1), streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);

Я просто не хочу иметь так много строк кода, я хотел, чтобы это выглядело красиво.


person Daler    schedule 09.12.2012    source источник


Ответы (1)


Вам нужно будет убедиться, что файл успешно загружен, прежде чем воспроизводить его, используя SoundPool.setOnLoadCompleteListener< /а>

Измените код метода loadSound следующим образом:

public void loadSound (String strSound, int stream) {
     boolean loaded = false;
     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId,
                    int status) {
                loaded = true;
            }
        });
    try {
          stream= mSoundPool.load(aMan.openFd(strSound), 1);
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
   // Is the sound loaded already?
   if (loaded) {
     mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f);
    }
}
person ρяσѕρєя K    schedule 09.12.2012
comment
ну ничего не происходит. кажется, он не загружается... почему? - person Daler; 09.12.2012
comment
к сожалению, у меня не должно быть задержек, когда пользователь нажимает кнопку. Он должен играть немедленно. Любые идеи о том, как этого достичь? На самом деле я могу заставить его играть сразу, используя R.raw, но я хочу сделать это из ресурсов. - person Daler; 09.12.2012
comment
затем попробуйте после перемещения mSoundPool.load(aMan.openFd(strSound), 1); внутри метода onCreate активности и if (loaded) { mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f); } строк внутри onResume of Activity - person ρяσѕρєя K; 09.12.2012
comment
@Daler: или вы также можете реализовать Thread для воспроизведения музыки, когда mSoundPool.load готов. - person ρяσѕρєя K; 09.12.2012
comment
у меня есть около 20+ звуков, которые нужно воспроизвести, и все они в одном действии, поэтому не вижу смысла создавать еще один поток. Их загрузка из папки активов значительно облегчит мою работу, когда я создам список этих звуков... спасибо) - person Daler; 09.12.2012
comment
Я предлагаю вам также проверить, что находится в вашей переменной списка файлов. - person CocoNess; 09.12.2012
comment
@TanjaV, и ρяσѕρєя K, я обновил свой код .. есть идеи? - person Daler; 09.12.2012