Android L SoundPool.load () regresión

En Android L, la última versión preliminar del desarrollador (Nexus 5), parece haber una regresión en el método SoundPool.load () que tarda más de 5 segundos en cargar una muestra (<100kb), donde se cargaron muestras en sistemas pre-L Instantáneamente con el mismo código.

He intentado OGG o MP3, ambos con los mismos resultados. Probado diferentes tamaños pero todos bajo 100kb. Parece que 40kb o 80kb no hace ninguna diferencia, también lo hace OGG o MP3. La carga es siempre alrededor de 5s retraso.

Esto parece ser otra regresión en SoundPool después de que el bucle se haya roto en 4.3.

El problema es fácilmente reproducible con:

pool = new SoundPool(6, AudioManager.STREAM_MUSIC, 0); // use a listener to start playback after load pool.setOnLoadCompleteListener(listener); // R.raw.sound1 is either an OGG or MP3 sample under 100kb od size int id = pool.load(context, R.raw.sound1, 1); // onLoadComplete() method of the listener is called several seconds after the call to laod() 

Lo mismo ocurre con la construcción del SoundPool utilizando la API 21 de Builders introducida de la siguiente manera:

  AudioAttributes attr = new AudioAttributes.Builder() .setUsage(AudioAttributes.USAGE_MEDIA) .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .build(); pool = new SoundPool.Builder().setAudioAttributes(attr).setMaxStreams(6).build(); 

¿Hay alguien más experimentando esto? ¿Alguien encontró una solución?

¡Muchas gracias!

Sólo para que ustedes sepan, este es un error conocido:

He intentado multi-threading … Funciona bien en un sentido que no bloquea la aplicación! Pero necesitas saber que no puedes llamar al método Soundpool.load antes de cargar todos tus sonidos. Incluso si llama a carga en un sonido que ya se ha cargado, hace que la aplicación se congele. Supongo que la clase SoundPool tiene algún tipo de sincronización interna de algún tipo. De todos modos, puede hacer su tipo de aplicación de trabajo utilizando este método. Esta es una especie de fragmento que puede ayudar:

  private class loadSFXasync extends AsyncTask<String, Integer, Long> { protected Long doInBackground(String... str) { int count = str.length(); long totalSize = 0; for (int i = 0; i < count; i++) { mSoundPool.load(str,1); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { mAllSoundsAreLoaded=true; } } 

Y en su código:

 playSound(String str){ if (!mAllSoundsAreLoaded) return; // otherwise: do mSoundPool.load(....) } 
  • Android 2.2 - La muestra 0 de SoundPool no está LISTA
  • Jugar dos sonidos Simutaneosly
  • ¿Cuál es la mejor manera de obtener una duración de archivo de audio en Android?
  • SoundPool no reproduce sonidos
  • Android SoundPool: se notifica cuando final de jugado
  • Soundpool reproduce sólo los primeros 5 segundos del archivo. ¿Por qué?
  • Volumen de secuencia en SoundPool vs volumen en AudioManager
  • Saber si la carga de un sonido con SoundPool ha tenido éxito en Android 1.6 / 2.0 / 2.1
  • Reproducción de sonido de una frecuencia en android
  • SoundPool "AudioFlinger no pudo crear pista, estado: -12"
  • Efecto de audio Android en el archivo wav y guárdelo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.