2014-10-26 10 views
14

Auf Android L - der neuesten Entwicklervorschau (Nexus 5), scheint es eine Regression in der SoundPool.load() Methode zu geben, die> 5 Sekunden dauert, um eine Probe zu laden (< 100kb), wo Samples auf Pre-L-Systemen sofort mit dem gleichen Code geladen wurden.Android L SoundPool.load() Regression

Ich versuchte OGG oder MP3, beide mit den gleichen Ergebnissen. Versucht verschiedene Größen, aber alle unter 100kb. Scheint als 40kb oder 80kb keinen Unterschied machen, so OGG oder MP3. Laden ist immer um 5s Verzögerung.

Dies scheint eine weitere Regression in SoundPool nach dem Schleifen in 4.3 gebrochen wurde.

Die Frage ist leicht reproduzierbar mit:

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() 

Das gleiche gilt für geschieht die Soundpool Konstruktion des Builders mit API 21 eingeführt, wie folgt:

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

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

Ist jemand dies erlebt? Hat jemand einen Workaround gefunden?

Vielen Dank!

+0

gleiches Problem hier auf dem Nexus 7 für 2012 mit einem endgültigen Lutscher build (LRX21P) – Hartok

+0

gleiches Problem mit Nexus 4, Gerät Habe ein Over-the-Air-Update auf Android L. Obwohl Nexus10 mit Android L kein Problem hat. – Taras

+0

gleiche Ausgabe nexus 5 ..... wtf ... ¿¿¿? ¿? ¿Mit Android 5.0.1 offiziell – NullPointerException

Antwort

2

Nur damit Sie Jungs wissen, ist dies ein bekannter Fehler:

I Multi-Threading versucht haben ... Es funktioniert in gewisser Hinsicht in Ordnung, dass es Blockiert die App nicht! Aber Sie müssen wissen, dass Sie die Soundpool.load-Methode nicht aufrufen können, bevor alle Ihre Sounds geladen sind. Selbst wenn Sie einen bereits geladenen Sound laden, wird die App eingefroren. Ich denke, die SoundPool-Klasse hat irgendeine Art von interner Synchronisation. Wie auch immer, Sie können Ihre App mit dieser Methode arbeiten lassen. Dies ist eine Art von einem Schnipsel, die helfen können:

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

und in Ihrem Code:

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