2014-10-26 14 views
14

Trên Android L - bản xem trước nhà phát triển mới nhất (Nexus 5), có vẻ là hồi quy trong phương thức SoundPool.load() mất> 5 giây để tải mẫu (< 100kb)), nơi mà các mẫu được nạp vào hệ thống trước L ngay lập tức với cùng một mã.Android L SoundPool.load() hồi quy

Tôi đã thử OGG hoặc MP3, cả hai đều có cùng kết quả. Đã thử các kích thước khác nhau nhưng tất cả đều dưới 100kb. Có vẻ như 40kb hoặc 80kb không tạo ra bất kỳ sự khác biệt nào, do đó, OGG hoặc MP3. Đang tải luôn xảy ra khoảng 5 giây.

Điều này có vẻ như là một hồi quy khác trong SoundPool sau khi vòng lặp đã bị hỏng trong 4.3.

Vấn đề này có thể dễ dàng tái sản xuất với:

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

Cùng đang xảy ra cho xây dựng bằng cách sử dụng Soundpool Builders giới thiệu API 21 như sau:

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

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

là bất cứ ai khác trải qua điều này? Có ai tìm cách giải quyết không?

Rất cám ơn!

+0

Cùng một vấn đề ở đây trên Nexus 7 năm 2012 với thức kẹo xây dựng (LRX21P) – Hartok

+0

Cùng một vấn đề với Nexus 4, thiết bị có cập nhật qua mạng không dây cho Android L. Mặc dù Nexus10 có Android L không có vấn đề như vậy. – Taras

+0

cùng một vấn đề nexus 5 ..... wtf ... ¿?? ¿? ¿? ¿Với android 5.0.1 chính thức – NullPointerException

Trả lời

2

Chỉ cần để các bạn biết, đây là một lỗi được biết:

Tôi đã thử multi-threading ... Nó hoạt động ok trong một cảm giác rằng nó không chặn ứng dụng! Nhưng bạn cần biết rằng bạn không thể gọi phương thức Soundpool.load trước khi tất cả âm thanh của bạn được tải. Ngay cả khi bạn gọi tải trên một âm thanh đã được tải, nó làm cho ứng dụng đóng băng. Tôi đoán lớp SoundPool có một số loại đồng bộ hóa nội bộ của một số loại. Dù sao, bạn có thể làm cho ứng dụng của bạn sắp xếp công việc bằng cách sử dụng phương pháp này. Đây là loại một đoạn có thể giúp:

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

và trong mã của bạn:

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