今天的任务为创建SoundPool,加载音频文件以及播放音频,代码如下:
BeatBox.java:
package com.bignerdranch.android.beatbox; import android.content.Context; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioManager; import android.media.SoundPool; import android.util.Log; import java.io.IOException; import java.util.ArrayList;
import java.util.List; public class BeatBox { private static final String TAG="BeatBox"; private static final String SOUNDS_FOLDER="sample_sounds"; private static final int MAX_SOUNDS=5; private AssetManager mAssets; private List<Sound> mSounds=new ArrayList<>(); private SoundPool mSoundPool; public BeatBox(Context context){ mAssets=context.getAssets(); mSoundPool=new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC,0); loadSounds(); } public void play(Sound sound){ Integer soundId=sound.getSoundId(); if (soundId==null){ return; } mSoundPool.play(soundId,1.0f,1.0f,1,0,1.0f); } private void loadSounds() { String[] soundNames; try { soundNames=mAssets.list(SOUNDS_FOLDER); Log.i(TAG,"Found"+ soundNames.length+"sounds"); }catch (IOException ioe){ Log.e(TAG,"Could not list assets",ioe); return; } for (String filename : soundNames){ try { String assetPath = SOUNDS_FOLDER + "/" + filename; Sound sound = new Sound(assetPath); load(sound); mSounds.add(sound); }catch (IOException ioe){ Log.e(TAG,"Could not load sound"+filename,ioe); } } } private void load(Sound sound) throws IOException{ AssetFileDescriptor afd=mAssets.openFd(sound.getAssetPath()); int soundId=mSoundPool.load(afd,1); sound.setSoundId(soundId); } public List<Sound> getSounds() { return mSounds; } }
Sound.java:
package com.bignerdranch.android.beatbox; public class Sound { private String mAssetPath; private String mName; private Integer mSoundId; public Sound(String assetPath){ mAssetPath=assetPath; String[] components=assetPath.split("/"); String filename=components[components.length-1]; mName=filename.replace(".wav",""); } public String getAssetPath() { return mAssetPath; } public String getName() { return mName; } public Integer getSoundId(){ return mSoundId; } public void setSoundId(Integer soundId){ mSoundId=soundId; } }