Образец не готов звукового пула

Я разрабатываю приложение, которое переводит фразы с английского на другой язык. Я использую ExpandableListView и данные привязки через BaseExpandableListAdapter. Вкратце: когда вы щелкаете элемент списка, открывается подпункт, где вы можете увидеть перевод и в то же время говорит голос. Проблема в том, что время от времени звук не воспроизводится - особенно для более длинных фраз. И то, что я вижу в логарифме, это следующее:

1) КОГДА ЗВУК НЕ ВОСПРОИЗВОДИТСЯ ВООБЩЕ...

Образец не загружен. Ожидание 30 мс. ОБРАЗЕЦ X НЕ ГОТОВ

2) КОГДА ЗВУК ДЕЙСТВИТЕЛЬНО ВОСПРОИЗВОДИТСЯ

* Образец не был загружен. Ожидание 30 мс.


Так что ДАЖЕ, если звук воспроизводится, logcat сообщает, что «сэмпл не готов».

Хорошо, это информация, которую дает logcat. Другое дело, что вероятность отказа больше для больших звуковых файлов. Небольшие звуковые файлы воспроизводятся в течение двух секунд (около 30 КБ), а большие около 4 секунд (около 60 КБ).

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

1) используйте OnLoadCompleteListener()

и его НЕ РАБОТАЕТ

2) сделать какой-то цикл while.

Тоже не работает

Что я мог сделать не так. Я даю код ниже. Может что-то обидное? Например, я неправильно реализовал слушателя?

искренне

expList.setOnGroupExpandListener(new OnGroupExpandListener() {
    public void onGroupExpand(int groupPosition) {

        final int group_position = groupPosition; 
        loaded = false;


        int nmbr_childs = adapter.getChildrenCount(groupPosition);
        if (nmbr_childs == 1) {


            myVoice = soundPool.load(PhraseActivity.this, sound[group_position][0], 2);
            soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                  @Override
                  public void onLoadComplete(SoundPool soundPool, int sampleId,
                      int status) {
                    loaded = true;
                  } 
            });

            if (loaded) {
                soundPool.play(myVoice, 20, 20, 1, 0, 1f);
            }
            else {
                System.out.println("something wrong with soundpool!");
            }   


        }

        group = groupPosition;
            int len = adapter.getGroupCount();
            for (int i = 0; i < len; i++) {
                if (i != groupPosition) {
                    expList.collapseGroup(i);
                }
            }
        }
    }); 

person Björn Hallström    schedule 24.05.2013    source источник


Ответы (1)


Я думаю, вы должны изменить свой код следующим образом:

 myVoice = soundPool.load(PhraseActivity.this, sound[group_position][0], 2);
        soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
              @Override
              public void onLoadComplete(SoundPool soundPool, int sampleId,
                  int status) {
                    soundPool.play(myVoice, 20, 20, 1, 0, 1f);
              } 
        });

Это сработало для меня.

person Panky90    schedule 24.05.2013
comment
Кажется, это работает нормально. Сегодня попробую еще, но сейчас могу сказать, что стало намного лучше. БОЛЬШОЕ СПАСИБО ВАМ :-) :-) - person Björn Hallström; 24.05.2013