Почему AudioFlinger дает сбой без программной индикации? - PullRequest
2 голосов
/ 09 марта 2011

У меня проблема с тем, что происходит сбой SoundPool, но не дает программного указания о том, что произошел сбой.После сбоя он больше не будет воспроизводить звуки, пока приложение не будет перезагружено (выход через кнопку «Назад», а затем перезапуск недостаточен).LogCat выдает мне следующие сообщения об ошибках:

AudioFlinger: no more track names availlable [sic]
AudioTrack: AudioFlinger could not create track, status: -12
SoundPool: Error creating AudioTrack

Тем не менее, несмотря на эти ошибки, SoundPool.play () по-прежнему возвращает положительное целое число, которое увеличивается для каждого нового запроса на воспроизведение, что, согласно документации, указывает на наличиене ошибкаКто-то еще начал проблему для этой проблемы: http://code.google.com/p/android/issues/detail?id=13453

... однако, не было никаких ответов.Приведенный ниже код является минималистским занятием, чтобы последовательно воссоздать эту проблему.Просто создайте новый проект Android, установите идентификатор LinearLayout на main_bg, установите идентификатор TextView на main_tv и добавьте звуковой файл с именем ding в res / raw.Звуковой файл должен быть достаточно длинным, чтобы щелкнуть по экрану четыре раза, прежде чем закончится первый звук;У меня 1,7-секундный моно MP3 с частотой 22050 Гц и частотой 96 кбит / с.После короткой паузы, пятый щелчок сгенерирует сообщения об ошибках выше через LogCat.Или вы можете просто щелкнуть несколько раз, пока не прекратятся звуки.

Я проверил сообщения об ошибках, которые появляются на T-Mobile G1 под управлением Android 1.6, но они не появляются на эмуляторе 1.6,Эмулятор 2.1, или эмулятор 2.2.

Кто-нибудь знает, как решить эту проблему, или SoundPool просто бесполезен для совпадающих звуковых эффектов на G1?

Код:

public class SoundTestActivity extends Activity implements OnClickListener {
   private  SoundPool mSoundPool; 
   private  HashMap<Integer, Integer> mSoundPoolMap; 
   private  int index = 0;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);

      initSounds();
      mSoundPoolMap.put(index, mSoundPool.load(getApplicationContext(), R.raw.ding, 1));
   }

   public void initSounds() { 
      mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
      mSoundPoolMap = new HashMap<Integer, Integer>();           
   }

   @Override
   public void onClick(View v) {
      int result = mSoundPool.play(mSoundPoolMap.get(index), 0.99f, 0.99f, 1, 0, 1f);
      ((TextView)findViewById(R.id.main_tv)).setText(Integer.toString(result));
   } 
}

1 Ответ

0 голосов
/ 09 марта 2011

Просто предположение, но мне не нравится, как это выглядит ...

findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);

Когда вы делаете это, представление будет найдено и раздутым, что позволит вам использовать setOnClickListener(), но оно ни к чему не будет назначено. Я предполагаю, что в какой-то момент это сборка мусора, которая может стать причиной вашей проблемы.

Ваше описание говорит, что это LinearLayout? Если это так, попробуйте это ...

public class SoundTestActivity extends Activity implements OnClickListener {
    private SoundPool mSoundPool; 
    private HashMap<Integer, Integer> mSoundPoolMap; 
    private int index = 0;
    private LinearLayout ll = null; // ADD THIS!!!

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ll = findViewById(R.id.main_bg); // ASSIGN TO ll
        ll.setOnClickListener((OnClickListener)this); // SET LISTENER
...