2012-12-09 79 views
1

我有一堆聲音,分配給一組按鈕,我需要播放它。我所有的聲音都在資產文件夾中。但是,它不起作用。 目的是:從assetFodler加載和播放,聽起來。我會出來與我的項目的代碼示例:從資產中加載並使用soundpool

//set up audio player 
    mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0); 
    mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
    streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    streamVolume = streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 

//getting files lists from asset folder 
    aMan = this.getAssets(); 
    try { 
     filelist = aMan.list(""); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

對於不有很多的代碼行的目的,我創建了一個基本的程序裝載聲音:

public void loadSound (String strSound, int stream) { 

    try { 
     stream= mSoundPool.load(aMan.openFd(strSound), 1); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f); 
} 

正如你所看到的,我傳遞文件(stringName)和streamID。

最後,這裏是我如何使用它:

 case R.id.button1: 
     //if button was clicked two or more times, when play is still on im doing stop 
    mSoundPool.stop(mStream1); 
    loadSound(filelist[0],mStream1); 
     break; 

當我跑項目,沒有任何反應和logcat的說:

12-09 10:38:34.851: W/SoundPool(17331): sample 2 not READY 

任何幫助,將不勝感激。

UPD1: 當我做這種方式,而不必LoadSound讀取程序,它工作正常 下面的代碼是的onCreate:

//load fx 
    try { 
     mSoundPoolMap.put(RAW_1_1, mSoundPool.load(aMan.openFd(filelist[0]), 1)); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

和ONCLICK按鈕:

//resourcePlayer.stop(); 
     mSoundPool.stop(mStream1); 
     mStream1= mSoundPool.play(mSoundPoolMap.get(RAW_1_1), streamVolume, streamVolume, 1, LOOP_1_TIME, 1f); 

我只是不想有這麼多的代碼行,我想讓它看起來不錯

回答

2

你將需要檢查文件加載成功之前播放它使用SoundPool.setOnLoadCompleteListener

作爲

更改loadSound方法代碼:

public void loadSound (String strSound, int stream) { 
    boolean loaded = false; 
    mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
      @Override 
      public void onLoadComplete(SoundPool soundPool, int sampleId, 
        int status) { 
       loaded = true; 
      } 
     }); 
    try { 
      stream= mSoundPool.load(aMan.openFd(strSound), 1); 
     } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // Is the sound loaded already? 
    if (loaded) { 
    mSoundPool.play(stream, streamVolume, streamVolume, 1, LOOP_1_TIME, 1f); 
    } 
} 
+0

很好,沒有任何反應。似乎沒有加載...爲什麼? – Daler

+0

@Daler:因爲在當前代碼中執行順序的所有內容都會在mSoundPool.load(aMan.openFd(strSound),1)之後進行一些等待。 '叫。你可以看到http://www.vogella.com/blog/2011/06/27/android-soundpool-how-to-check-if-sound-file-is-loaded/例子 –

+0

不幸的是,我當用戶點擊按鈕時不得有任何延遲。它必須立即播放。任何想法如何實現它?其實我可以通過使用R.raw立即播放它,但是我想從資產來做。 – Daler