《Beginning Android Games》給出基本框架的實現(4)

最後的部分是剩下的關於音樂實現的部分,與最先給出的抽象接口/類對應,於音樂有關的三個類分別對應Audio,Music,Sound的具體實現,Audio是兩者的統一管理,程序通過Audio來取得Music或Sound,下面是3者的具體實現

public class AndroidAudio implements Audio {
	AssetManager assets;
	SoundPool soundPool;
	
	public AndroidAudio(Activity activity){
		activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
		this.assets=activity.getAssets();
		this.soundPool=new SoundPool(20,AudioManager.STREAM_MUSIC,0);
	}
	
	@Override
	public Music newMusic(String filename) {
		try {
			AssetFileDescriptor assetDescriptor=assets.openFd(filename);
			return new AndroidMusic(assetDescriptor);
		} catch (IOException e) {
			throw new RuntimeException("Couldn't load music '"+filename+"'");
		}
	}

	@Override
	public Sound newSound(String filename) {
		try{
			AssetFileDescriptor assetDescriptor=assets.openFd(filename);
			int soundId=soundPool.load(assetDescriptor, 0);
			return new AndroidSound(soundPool,soundId);
		} catch (IOException e) {
			throw new RuntimeException("Couldn't load sound '"+filename+"'");
		}
	}

}

 

public class AndroidSound implements Sound {
	int soundId;
	SoundPool soundPool;
	
	public AndroidSound(SoundPool soundPool, int soundId){
		this.soundId=soundId;
		this.soundPool=soundPool;
	}
	
	@Override
	public void dispose() {
		soundPool.unload(soundId);
	}

	@Override
	public void play(float volume) {
		soundPool.play(soundId, volume, volume, 0, 0, 1);
	}

}

 

public class AndroidMusic implements Music, OnCompletionListener {
	MediaPlayer mediaPlayer;
	boolean isPrepared =false;
	
	public AndroidMusic(AssetFileDescriptor assetDescriptor){
		mediaPlayer=new MediaPlayer();
		try {
			mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(),assetDescriptor.getStartOffset(),assetDescriptor.getLength());
			mediaPlayer.prepare();
			isPrepared=true;
			mediaPlayer.setOnCompletionListener(this);
		} catch (Exception e) {
			throw new RuntimeException("Couldn't load music");
		}
	}
	
	@Override
	public void dispose() {
		if(mediaPlayer.isPlaying()){
			mediaPlayer.stop();
		}
		mediaPlayer.release();
	}

	@Override
	public boolean isLooping() {
		return mediaPlayer.isLooping();
	}

	@Override
	public boolean isPlaying() {
		return mediaPlayer.isPlaying();
	}

	@Override
	public boolean isStopped() {
		return !isPrepared;
	}

	@Override
	public void pause() {
	}

	@Override
	public void play() {
		if(mediaPlayer.isPlaying()){
			return;
		}
		try{
			synchronized (this) {
				if(!isPrepared){
					mediaPlayer.prepare();
				}
				mediaPlayer.start();
			}
		} catch (IllegalStateException e){
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		}
	}

	@Override
	public void setLooping(boolean looping) {
		mediaPlayer.setLooping(looping);
	}

	@Override
	public void setVolume(float volume) {
		mediaPlayer.setVolume(volume, volume);
	}

	@Override
	public void stop() {
		mediaPlayer.stop();
		synchronized (this) {
			isPrepared=false;
		}
	}

	@Override
	public void onCompletion(MediaPlayer arg0) {
		synchronized (this) {
			isPrepared=false;
		}
	}

}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章