Friday, February 10, 2012

How to create singleton SoundManager in android?

Create the class soundManager as below shown.....

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.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 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
* @author Shailesh Shukla
* @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.starwars, 1));
mSoundPoolMap.put(2, mSoundPool.load(mContext, R.raw.terminator, 1));
}
/**
* Plays a Sound
* @author Shailesh Shukla
* @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
* @author Shailesh Shukla
*/
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;
   
}
}


After this is done call the below line of code in onCreate() of activity........
//Create, Initialise and then load the Sound manager
        SoundManager.getInstance();
        SoundManager.initSounds(this);
        SoundManager.loadSounds();

And to play the sound loaded above......you can call
SoundManager.playSound(1, 1);         OR     SoundManager.playSound(2, 1);  

After the job is done call the cleanUp() in each Activity

public void onDestroy()
    {
    super.onDestroy();
    SoundManager.cleanup();
    }





No comments:

Post a Comment