package org.andengine.audio.sound;
import org.andengine.audio.BaseAudioEntity;
import org.andengine.audio.sound.exception.SoundReleasedException;
import android.media.SoundPool;
/**
* (c) 2010 Nicolas Gramlich
* (c) 2011 Zynga Inc.
*
* @author Nicolas Gramlich
* @since 13:22:15 - 11.03.2010
*/
public class Sound extends BaseAudioEntity {
// ===========================================================
// Constants
// ===========================================================
// ===========================================================
// Fields
// ===========================================================
private int mSoundID;
private int mStreamID;
private boolean mLoaded;
private int mLoopCount;
private float mRate = 1.0f;
// ===========================================================
// Constructors
// ===========================================================
Sound(final SoundManager pSoundManager, final int pSoundID) {
super(pSoundManager);
this.mSoundID = pSoundID;
}
// ===========================================================
// Getter & Setter
// ===========================================================
public int getSoundID() {
return this.mSoundID;
}
public int getStreamID() {
return this.mStreamID;
}
public boolean isLoaded() {
return this.mLoaded;
}
public void setLoaded(final boolean pLoaded) {
this.mLoaded = pLoaded;
}
public void setLoopCount(final int pLoopCount) throws SoundReleasedException {
this.assertNotReleased();
this.mLoopCount = pLoopCount;
if(this.mStreamID != 0) {
this.getSoundPool().setLoop(this.mStreamID, pLoopCount);
}
}
public float getRate() {
return this.mRate;
}
public void setRate(final float pRate) throws SoundReleasedException {
this.assertNotReleased();
this.mRate = pRate;
if(this.mStreamID != 0) {
this.getSoundPool().setRate(this.mStreamID, pRate);
}
}
private SoundPool getSoundPool() throws SoundReleasedException {
return this.getAudioManager().getSoundPool();
}
// ===========================================================
// Methods for/from SuperClass/Interfaces
// ===========================================================
@Override
protected SoundManager getAudioManager() throws SoundReleasedException {
return (SoundManager)super.getAudioManager();
}
@Override
protected void throwOnReleased() throws SoundReleasedException {
throw new SoundReleasedException();
}
@Override
public void play() throws SoundReleasedException {
super.play();
final float masterVolume = this.getMasterVolume();
final float leftVolume = this.mLeftVolume * masterVolume;
final float rightVolume = this.mRightVolume * masterVolume;
this.mStreamID = this.getSoundPool().play(this.mSoundID, leftVolume, rightVolume, 1, this.mLoopCount, this.mRate);
}
@Override
public void stop() throws SoundReleasedException {
super.stop();
if(this.mStreamID != 0) {
this.getSoundPool().stop(this.mStreamID);
}
}
@Override
public void resume() throws SoundReleasedException {
super.resume();
if(this.mStreamID != 0) {
this.getSoundPool().resume(this.mStreamID);
}
}
@Override
public void pause() throws SoundReleasedException {
super.pause();
if(this.mStreamID != 0) {
this.getSoundPool().pause(this.mStreamID);
}
}
@Override
public void release() throws SoundReleasedException {
this.assertNotReleased();
this.getSoundPool().unload(this.mSoundID);
this.mSoundID = 0;
this.mLoaded = false;
this.getAudioManager().remove(this);
super.release();
}
@Override
public void setLooping(final boolean pLooping) throws SoundReleasedException {
super.setLooping(pLooping);
this.setLoopCount((pLooping) ? -1 : 0);
}
@Override
public void setVolume(final float pLeftVolume, final float pRightVolume) throws SoundReleasedException {
super.setVolume(pLeftVolume, pRightVolume);
if(this.mStreamID != 0){
final float masterVolume = this.getMasterVolume();
final float leftVolume = this.mLeftVolume * masterVolume;
final float rightVolume = this.mRightVolume * masterVolume;
this.getSoundPool().setVolume(this.mStreamID, leftVolume, rightVolume);
}
}
@Override
public void onMasterVolumeChanged(final float pMasterVolume) throws SoundReleasedException {
this.setVolume(this.mLeftVolume, this.mRightVolume);
}
// ===========================================================
// Methods
// ===========================================================
// ===========================================================
// Inner and Anonymous Classes
// ===========================================================
}