2014-10-26 10 views
14

Su Android L - l'ultima anteprima sviluppatore (Nexus 5), sembra esserci una regressione nel metodo SoundPool.load() che impiega> 5 secondi per caricare un campione (< 100kb), dove i campioni sono stati caricati su sistemi pre-L istantaneamente con lo stesso codice.Regressione Android L SoundPool.load()

Ho provato OGG o MP3, entrambi con gli stessi risultati. Ho provato diverse dimensioni ma tutte sotto i 100kb. Sembra che 40kb o 80kb non faccia alcuna differenza, così come OGG o MP3. Il caricamento è sempre di circa 5 secondi.

Questa sembra un'ulteriore regressione in SoundPool dopo che il ciclo è stato interrotto in 4.3.

il problema è facilmente riproducibile 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 stesso sta accadendo per la costruzione del Soundpool utilizzando i Costruttori introdotto API 21 come segue:

AudioAttributes attr = new AudioAttributes.Builder() 
      .setUsage(AudioAttributes.USAGE_MEDIA) 
      .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) 
      .build(); 

    pool = new SoundPool.Builder().setAudioAttributes(attr).setMaxStreams(6).build(); 

È qualcun altro sperimentando questo? Qualcuno ha trovato una soluzione?

Grazie mille!

+0

Stesso problema qui su Nexus 7 2012 con finale accumulo lecca-lecca (LRX21P) – Hartok

+0

stesso problema con Nexus 4, dispositivo ho ricevuto l'aggiornamento via etere su Android L. Sebbene il Nexus10 con Android L non abbia un problema simile. – Taras

+0

stesso numero nexus 5 ..... wtf ... ¿?? ¿? ¿? ¿Con Android 5.0.1 ufficiale – NullPointerException

risposta

2

Just so you guys so, questo è un bug noto:

Ho provato il multi-threading ... Funziona bene in un senso che non blocca l'app! Ma è necessario sapere che non è possibile chiamare il metodo Soundpool.load prima che tutti i suoni siano caricati. Anche se chiami il carico su un suono che è già stato caricato, l'app si blocca. Immagino che la classe SoundPool abbia una sorta di sincronizzazione interna di qualche tipo. Ad ogni modo, puoi rendere il tuo tipo di app con questo metodo. Questa è una sorta di un frammento che può aiutare:

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; 
    } 
} 

e nel codice:

playSound(String str){ 
    if (!mAllSoundsAreLoaded) 
    return; 
    // otherwise: do mSoundPool.load(....) 
}