2013-07-07 10 views
0

我與,我想同時播放聲音文件的特定時間段的安卓媒體應用工作的特定時間,以播放聲音。所以,我創建了一個類和我使用這個類裏面SoundPoolThread概念來播放聲音,但是當我運行我的應用程序它要的ANR狀態,並顯示登錄貓如何同時使用的Soundpool的時間

樣本警告2130968576沒有準備好

請人幫我解決這個問題...

package com.kodspider.funk; 
import android.content.Context; 
import android.media.AudioManager; 
import android.media.SoundPool; 

public class CustomPlayer implements Runnable{ 

int song_id; 
long time; 
int button_id; 
Context ctx; 
SoundPool soundpool; 

public CustomPlayer(int s_id, long Time, Context ct){ 

song_id = load(ctx, s_id, 0); 
time = Time; 
ctx = ct; 

} 
public void run(){ 
long start = System.currentTimeMillis(); 
System.out.println("set_time:"+time+"Song_id:"+song_id+"current_time:"+start); 
long end = start + time; 
while (System.currentTimeMillis() < end){ 

    //Initialization 
    soundpool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0); 
    soundpool.play(song_id, 1.0f, 1.0f, 1, -1, 1.0f); 

        } 
        } 
public int load (Context context, int resId, int priority){ 
    return resId; 

} 

        } 

logcat的

07-07 10:57:51.828: I/ApplicationPackageManager(13625): cscCountry is not German : INS 
07-07 10:57:57.656: I/ApplicationPackageManager(13625): cscCountry is not German : INS 
07-07 10:57:59.343: W/KeyCharacterMap(13625): Can't open keycharmap file 
07-07 10:57:59.343: W/KeyCharacterMap(13625): Error loading keycharmap file 
07-07 10:57:59.343: W/KeyCharacterMap(13625): Using default keymap 
07-07 10:58:44.820: I/ApplicationPackageManager(13625): cscCountry is not German : INS 
07-07 10:58:49.718: I/System.out(13625): TAG------->60000---->2130968576 
07-07 10:58:49.726: W/SoundPool(13625): sample 2130968576 not READY 

回答

3

我在做類似的東西與我的應用程序Beat Shaker和我有同樣的問題。我解決它使用onLoadCompleteListener:

// Sound pool new instance 
SoundPool spool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0); 
// Sound pool on load complete listener 
spool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
    @Override 
    public void onLoadComplete(SoundPool soundPool, int sampleId, 
         int status) { 
     Log.i("OnLoadCompleteListener","Sound "+sampleId+" loaded."); 
     boolean loaded = true; 
    } 
});  
// Load the sample IDs 
int soundId = new int[3]; 
soundId[0] = spool.load(this, R.raw.sound1, 1); 
soundId[1] = spool.load(this, R.raw.sound2, 1); 
soundId[2] = spool.load(this, R.raw.sound3, 1); 

後來玩,你可以檢查它是否使用布爾「裝」正確加載的聲音了。

1

您需要首先load()你的聲音。這將它們加載到內存中以準備好play()。這將返回一個id,你將需要存儲和傳遞給play()

SoundPool文檔:

讓我們來看看一個典型的使用情況:一種遊戲是由玩幾個層次。對於每個級別,都有一組僅用於該級別的獨特聲音。在這種情況下,遊戲邏輯應該在第一級加載時創建一個新的SoundPool對象。關卡數據本身可能包含此關卡使用的聲音列表。加載邏輯遍歷調用相應SoundPool.load()函數的聲音列表。這通常應該在流程的早期完成,以便在需要播放之前有時間將音頻解壓爲原始PCM格式。

http://developer.android.com/reference/android/media/SoundPool.html#load(android.content.res.AssetFileDescriptor, int)

看一看在這個例子中的Soundpool部分:http://www.vogella.com/articles/AndroidMedia/

+0

我編輯的類文件,你在你的答案中提到我仍然在相同的情況意味着它是不是在玩任何聲音,但沒有出現在logcat的任何警告。 –

+0

對不起,我忘了從活動中調用構造函數。現在它在logcat中返回相同的警告,直到while循環結束。 –

+0

確保你將'load()'返回的id傳遞給'play()'。在上面的代碼中,你只是返回'resId'。另外我也沒有看到你在哪裏調用'load()'。 –

0

你可以看到代碼

public class SoundManager { 

    public static int SOUNDPOOLSND_MENU_BTN = 0; 
    public static int SOUNDPOOLSND_WIN = 1; 
    public static int SOUNDPOOLSND_LOOSE = 2; 
    public static int SOUNDPOOLSND_DRAW = 3; 
    public static int SOUNDPOOLSND_TICK1 = 4; 
    public static int SOUNDPOOLSND_TICK2 = 5; 
    public static int SOUNDPOOLSND_OUT_OF_TIME = 6; 
    public static int SOUNDPOOLSND_HISCORE = 7; 
    public static int SOUNDPOOLSND_CORRECT_LETTER = 8; 

    public static boolean isSoundTurnedOff; 

    private static SoundManager mSoundManager; 

    private SoundPool mSoundPool; 
    private SparseArray<Integer> mSoundPoolMap; 
    private AudioManager mAudioManager; 

    public static final int maxSounds = 4; 

    public static SoundManager getInstance(Context context) { 
     if (mSoundManager == null) { 
      mSoundManager = new SoundManager(context); 
     } 

     return mSoundManager; 
    } 

    public SoundManager(Context mContext) { 
     mAudioManager = (AudioManager) mContext 
       .getSystemService(Context.AUDIO_SERVICE); 
     mSoundPool = new SoundPool(maxSounds, AudioManager.STREAM_MUSIC, 0); 

     mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      public void onLoadComplete(SoundPool soundPool, int sampleId, 
        int status) { 
       boolean loaded = true; 
      } 
     }); 

     mSoundPoolMap = new SparseArray<Integer>(); 
     mSoundPoolMap.put(SOUNDPOOLSND_MENU_BTN, 
       mSoundPool.load(mContext, R.raw.rain, 0)); 
     mSoundPoolMap.put(SOUNDPOOLSND_WIN, 
       mSoundPool.load(mContext, R.raw.nature, 1)); 
     mSoundPoolMap.put(SOUNDPOOLSND_LOOSE, 
       mSoundPool.load(mContext, R.raw.piano, 2)); 
     mSoundPoolMap.put(SOUNDPOOLSND_TICK1, 
       mSoundPool.load(mContext, R.raw.relax, 3)); 
     mSoundPoolMap.put(SOUNDPOOLSND_TICK2, 
       mSoundPool.load(mContext, R.raw.storm, 4)); 


     // testing simultaneous playing 
     int streamVolume = mAudioManager 
       .getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(0), streamVolume, streamVolume, 1, 
       0, 1f); 
     mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1, 0, 
       1f); 
     mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1, 0, 
       1f); 

    } 

    public void playSound(int index) { 
     if (isSoundTurnedOff) 
      return; 

     int streamVolume = mAudioManager 
       .getStreamVolume(AudioManager.STREAM_MUSIC); 
     mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 
       1, 0, 1f); 
    } 

    public static void clear() { 
     if (mSoundManager != null) { 
      mSoundManager.mSoundPool = null; 
      mSoundManager.mAudioManager = null; 
      mSoundManager.mSoundPoolMap = null; 
     } 
     mSoundManager = null; 
    } 
}