Android游戏之音频类设计
来源:互联网 发布:linux的tar xvf 编辑:程序博客网 时间:2024/05/23 02:02
Android游戏之音频类设计
1、基础知识:
A. setVolumeControlStream(AudioManager.STREAM_MUSIC);
http://developer.android.com/training/managing-audio/volume-playback.html
http://developer.android.com/reference/android/app/Activity.html#setVolumeControlStream(int)
public final void setVolumeControlStream (int streamType)
Added in API level 1
Suggests an audio stream whose volume should be changed by the hardware volume controls.
The suggested audio stream will be tied to the window of this Activity. Volume requests which are received while the Activity is in the
foreground will affect this stream.
It is not guaranteed that the hardware volume controls will always change this stream's volume (for example, if a call is in progress, its
stream's volume may be changed instead). To reset back to the default, use USE_DEFAULT_STREAM_TYPE.
Parameters
streamType
The type of the audio stream whose volume should be changed by the hardware volume controls.
AudioManager的值:http://developer.android.com/reference/android/media/AudioManager.html
int STREAM_MUSIC The audio stream for music playback
B.getAssets ()
http://developer.android.com/reference/android/content/res/Resources.html#getAssets()
public final AssetManager getAssets ()
Added in API level 1
Retrieve underlying AssetManager storage for these resources.
C.AssetManager
http://developer.android.com/reference/android/content/res/AssetManager.html
D.AssetFileDescriptor
http://developer.android.com/reference/android/content/res/AssetFileDescriptor.html
E.SoundPool
http://developer.android.com/reference/android/media/SoundPool.html
The SoundPool class manages and plays audio resources for applications.
A SoundPool is a collection of samples that can be loaded into memory from a resource inside the APK or from a file in the file system. The
SoundPool library uses the MediaPlayer service to decode the audio into a raw 16-bit PCM mono or stereo stream. This allows applications to
ship with compressed streams without having to suffer the CPU load and latency of decompressing during playback.
http://developer.android.com/reference/android/media/SoundPool.html#SoundPool(int, int, int)
Parameters
maxStreams
the maximum number of simultaneous streams for this SoundPool object
streamType
the audio stream type as described in AudioManager For example, game applications will normally use STREAM_MUSIC.
srcQuality
the sample-rate converter quality. Currently has no effect. Use 0 for the default.
Returns
a SoundPool object, or null if creation failed
F.MediaPlayer
http://developer.android.com/reference/android/media/MediaPlayer.html
G.MediaPlayer.OnCompletionListener
http://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener.html
2、设计3个接口Sound,Music,Audio,音频Audio由声音Sound和音乐Music构成
package com.badlogic.androidgames.framework;public interface Sound { public void play(float volume); public void dispose();}
package com.badlogic.androidgames.framework;public interface Music { public void play(); public void stop(); public void pause(); public void setLooping(boolean looping); public void setVolume(float volume); public boolean isPlaying(); public boolean isStopped(); public boolean isLooping(); public void dispose();}
package com.badlogic.androidgames.framework;public interface Audio { public Music newMusic(String filename); public Sound newSound(String filename);}
3、针对3个接口实现每一个对应的类
package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.content.res.AssetFileDescriptor;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import com.badlogic.androidgames.framework.Music;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() { if (mediaPlayer.isPlaying()) mediaPlayer.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 isLooping) { mediaPlayer.setLooping(isLooping); } @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; } }}
package com.badlogic.androidgames.framework.impl;import android.media.SoundPool;import com.badlogic.androidgames.framework.Sound;public class AndroidSound implements Sound { int soundId; SoundPool soundPool; public AndroidSound(SoundPool soundPool,int soundId) { this.soundId = soundId; this.soundPool = soundPool; } @Override public void play(float volume) { soundPool.play(soundId, volume, volume, 0, 0, 1); } @Override public void dispose() { soundPool.unload(soundId); }}
package com.badlogic.androidgames.framework.impl;import java.io.IOException;import android.app.Activity;import android.content.res.AssetFileDescriptor;import android.content.res.AssetManager;import android.media.AudioManager;import android.media.SoundPool;import com.badlogic.androidgames.framework.Audio;import com.badlogic.androidgames.framework.Music;import com.badlogic.androidgames.framework.Sound;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 + "'"); } } }
本文浅述了“beginning-android-games”书本的相关基础知识和相关类的设计分析,
书本和源码:http://download.csdn.net/detail/yangzhenping/8420261
本篇中的类实现来自“beginning-android-games\ch07-gl-basics”
- Android游戏之音频类设计
- Android游戏编程之音频编程
- Android游戏编程之音频编程
- Android:游戏中添加音频
- Android游戏之文件读写类和绘图类设计
- 【多媒体之音频】音频频谱设计 Visualizer
- Android游戏引擎之地图设计-TWL
- Android游戏之屏幕类TestScreen和游戏类AndroidGame设计
- Android之音频录音
- Android游戏设计之-------游戏音效的播放 SoundPool
- Android音频开发之尝试音频混合
- Uinty3D游戏开发技术之音频控制
- android游戏开发如何进行音频控制
- Unity3D 游戏引擎之详解游戏开发音频的播放
- Android游戏开发系列教程第四讲(游戏音频)
- 初识Android之音频播放
- Android音频系统之音频基础
- Android音频系统之音频框架
- iOS通过http post上传图片
- LeetCode Minimum Window Substring
- javascript迭代器
- 解决ubuntu 中man手册不全的问题!!!
- ls报错: arguments too long
- Android游戏之音频类设计
- HDU 3555 Bomb 数位dp
- activity界面劫持--qq钓鱼应用分析
- TouchSlider开发笔记
- servlet3.0下监听器的使用
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- Android经典布局之top title
- UVa #1610 Party Games (习题8-2)
- oschina安卓源代码解析(三)xml方式传递数据