2012年7月18日 星期三

problem in android "Click a button to play sound."

Android Sound Pool example

in android if you want to play a sound when user click a button, the code is like following,

MediaPlayer mp;


Button btn1= (Button) findViewById(R.id.button1);

btn1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mp= MediaPlayer.create(this, R.raw.sound1);
                                mp.start();
}
});


but there are two issues--


1, when user click the button continually, it will cause an null point exception.
2, the sound delay a bit while when I click the button.

to solve this issue, we need to use another solution --> SoundPool



package com.vimeok.soundpoolexample;

import java.util.HashMap;

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;


public class SoundManager {

static private SoundManager _instance;
private static SoundPool mSoundPool;
private static HashMap<Integer, Integer> mSoundPoolMap;
private static AudioManager  mAudioManager;
private static Context mContext;

private SoundManager()
{
}

/**
* Requests the instance of the Sound Manager and creates it
* if it does not exist.
*
* @return Returns the single instance of the SoundManager
*/
static synchronized public SoundManager getInstance()
{
   if (_instance == null)
     _instance = new SoundManager();
   return _instance;
}

/**
* Initialises the storage for the sounds
*
* @param theContext The Application context
*/
public static  void initSounds(Context theContext)
{
mContext = theContext;
    mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);
    mSoundPoolMap = new HashMap<Integer, Integer>();
    mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);  
}

/**
* Add a new Sound to the SoundPool
*
* @param Index - The Sound Index for Retrieval
* @param SoundID - The Android ID for the Sound asset.
*/
public static void addSound(int Index,int SoundID)
{
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}

/**
* Loads the various sound assets
* Currently hardcoded but could easily be changed to be flexible.
*/
public static void loadSounds()
{
mSoundPoolMap.put(1, mSoundPool.load(mContext, R.raw.t0, 1));
mSoundPoolMap.put(2, mSoundPool.load(mContext, R.raw.t1, 1));
mSoundPoolMap.put(3, mSoundPool.load(mContext, R.raw.t2, 1));
mSoundPoolMap.put(4, mSoundPool.load(mContext, R.raw.t3, 1));
mSoundPoolMap.put(5, mSoundPool.load(mContext, R.raw.t4, 1));
mSoundPoolMap.put(6, mSoundPool.load(mContext, R.raw.t5, 1));
mSoundPoolMap.put(7, mSoundPool.load(mContext, R.raw.t6, 1));
mSoundPoolMap.put(8, mSoundPool.load(mContext, R.raw.t7, 1));
mSoundPoolMap.put(9, mSoundPool.load(mContext, R.raw.t8, 1));
mSoundPoolMap.put(10, mSoundPool.load(mContext, R.raw.t9, 1));
mSoundPoolMap.put(11, mSoundPool.load(mContext, R.raw.t11, 1));
mSoundPoolMap.put(12, mSoundPool.load(mContext, R.raw.t12, 1));

}

/**
* Plays a Sound
*
* @param index - The Index of the Sound to be played
* @param speed - The Speed to play not, not currently used but included for compatibility
*/
public static void playSound(int index,float speed)
{
    float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
    streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, speed);
}

/**
* Stop a Sound
* @param index - index of the sound to be stopped
*/
public static void stopSound(int index)
{
mSoundPool.stop(mSoundPoolMap.get(index));
}

public static void cleanup()
{
mSoundPool.release();
mSoundPool = null;
   mSoundPoolMap.clear();
   mAudioManager.unloadSoundEffects();
   _instance = null;
 
}
}

then in your main activity,
...
...
...

SoundManager.getInstance();
SoundManager.initSounds(this);
SoundManager.loadSounds();


btn1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
                                //playsound
SoundManager.playSound(1, 1);
}
});
...
...
...





沒有留言:

張貼留言