详细介绍声音处理
/**
* 作者 colico Email:colico@163.com
* http://blog.csdn.net/colico
* http://colico.ys168.com
* 注:此为 我是小o 原创,需要转载请附上以上信息。
*
*/
本文是在同一个游戏中移植在不同机型时所做的对声音的处理,考虑到性能的要求,对每种类型的手机做了一定的要求
s40 中的声音处理:
1) import com.nokia.mid.sound.*;
2)
Sound soundPlayer;
void initSound(){
soundPlayer = new Sound(b_main,1);
if(m_playSound == 1){
soundPlayer.play(0);
}
}
3)
byte[] b_main = {
(byte)0x02,(byte)0x4a,(byte)0x3a,(byte)0x40,
(byte)0x04,(byte)0x01,(byte)0x1f,(byte)0x1e,
(byte)0x54,(byte)0x88,(byte)0x38,(byte)0x84,
(byte)0x44,(byte)0xbc,(byte)0x4a,(byte)0xc4,
(byte)0xa0,(byte)0xa9,(byte)0x0b,(byte)0x91,
(byte)0x27,(byte)0x22,(byte)0xa2,(byte)0xb1,
(byte)0x31,(byte)0x13,(byte)0x88,(byte)0x00,
};
4)
static int m_playSound = 1;
5) 在程序中对声音的控制
m_playSound = (byte)(1 - m_playSound);
if(m_playSound == 1){
try{
soundPlayer.play(0);
} catch(Exception e){}
}
if(m_playSound == 0){
try{
soundPlayer.stop();
} catch(Exception e){}
}
//----------------------------------------------------
使用 ott 文件 在nokia 40或 60中
1) 定义数据结构
public class EMSound
{
public int type;
public byte[] data;
public EMSound(byte[] data, int type)
{
this.type = type;
this.data = data;
}
}
2)
import com.nokia.mid.ui.*;
import com.nokia.mid.sound.*;
3)
Sound soundPlayer;
SoundListener soundListener = new EMSoundListener();
EMSound currentSound = null;
boolean soundPlaying = false;
boolean soundEnable = true;
class EMSoundListener
implements SoundListener {
public void soundStateChanged(Sound sound, int event) {
switch (event) {
case Sound.SOUND_STOPPED:
soundPlaying = false;
break;
case Sound.SOUND_PLAYING:
soundPlaying = true;
}
}
}
public EMSound loadSound(String resfile, int resID) {
EMSound sound;
try {
InputStream is = getClass().getResourceAsStream(resfile + "/" + resID +
".ott");
int len = (int) is.skip(10000);
is.close();
is = getClass().getResourceAsStream(resfile + "/" + resID + ".ott");
byte[] barr = new byte[len];
is.read(barr);
is.close();
sound = new EMSound(barr, Sound.FORMAT_TONE);
}
catch (Exception ex) {
sound = null;
}
return sound;
}
public void playSound(EMSound sound, int count) {
if (!soundEnable) {
return;
}
try { //colico
if (soundPlaying) {
stopSound();
}
if (soundPlayer == null) {
soundPlayer = new Sound(sound.data, sound.type);
soundPlayer.setSoundListener(soundListener);
currentSound = null;
}
if (sound != currentSound) {
soundPlayer.release();
soundPlayer.init(sound.data, sound.type);
currentSound = sound;
}
soundPlayer.play(count);
}
catch (Exception ex) {
soundPlaying = false;
}
}
Sound[] soundPlayers;
public void playSound( EMSound sound[], int loc)
{
if (!soundEnable) { return; }
try {
if (soundPlaying) stopSound();
if (soundPlayers == null) {
soundPlayers = new Sound[sound.length];
System.out.println("Sounds == null");
for (int i=0; i<sound.length ; i++ ){
soundPlayers[i] = new Sound( sound[i].data, sound[i].type );
soundPlayers[i].setSoundListener( soundListener );
soundPlayers[i].init(sound[i].data, sound[i].type);
}
}
long now = System.currentTimeMillis();
soundPlayers[loc].play(1);
System.out.println("playing Sounds");
System.out.println("playing Sounds time"+(System.currentTimeMillis()-now) );
} catch(Exception ex) {
soundPlaying = false;
}
}
public void stopSound() {
if (!soundEnable) {
return;
}
if (soundPlayer != null) { //colico
soundPlayer.stop();
}
}
public boolean isSoundPlaying() {
return soundPlaying;
}
public boolean isSoundEnable() {
return soundEnable;
}
public void setSoundEnable(boolean e) {
if (!e) {
stopSound();
}
soundEnable = e;
}
在V300中
1).
public class EMSound
{
public String type;
public byte[] data;
public EMSound(byte[] data, String type)
{
this.type = type;
this.data = data;
}
}
2).
import Javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import javax.microedition.media.Manager;
import javax.microedition.media.Control.*;
3). //Sound soundPlayer;
PlayerListener soundListener = new EMSoundListener();
Player soundPlayer;
EMSound currentSound = null;
boolean soundPlaying = false;
boolean soundEnable = true;
class EMSoundListener
implements PlayerListener {
public void playerUpdate(Player player, String event, Object eventData) { //soundStateChanged(int event)
if (event == PlayerListener.STOPPED) {
soundPlaying = false;
}
if (event == PlayerListener.STARTED) {
soundPlaying = true;
}
}
}
public EMSound loadSound(String resfile, int resID) {
EMSound sound;
try {
InputStream is = getClass().getResourceAsStream(resfile + "/" + resID +
".mid");
int len = (int) is.skip(10000);
is.close();
is = getClass().getResourceAsStream(resfile + "/" + resID + ".mid");
byte[] barr = new byte[len];
is.read(barr);
is.close();
sound = new EMSound(barr, "audio/midi");
}
catch (Exception ex) {
sound = null;
}
return sound;
}
public void playSound(EMSound sound, int count) {
if (!soundEnable) {
return;
}
try {
if (soundPlaying) {
stopSound();
}
if (soundPlayer == null) {
soundPlayer = Manager.createPlayer(new ByteArrayInputStream(sound.data),
sound.type);
soundPlayer.addPlayerListener(soundListener);
currentSound = null;
}
if (sound != currentSound) {
soundPlayer.close();
soundPlayer = Manager.createPlayer(new ByteArrayInputStream(sound.data),
sound.type);
currentSound = sound;
}
soundPlayer.start();
}
catch (Exception ex) {
soundPlaying = false;
System.out.println(ex.toString());
}
}
public void stopSound() {
if (!soundEnable) {
return;
}
if (soundPlayer != null) {
try {
soundPlayer.stop();
}
catch (Exception e) {
System.out.print(e.toString());
}
}
}
public boolean isSoundPlaying() {
return soundPlaying;
}
public boolean isSoundEnable() {
return soundEnable;
}
3.读取mid文件
1)
import javax.microedition.media.*;
2)
Player player;
void initSound() {
try {
player = Manager.createPlayer(getStream("/sound/b_main.mid"),
"audio/midi");
player.realize();
player.setLoopCount(100000);
}
catch (Exception e) {
e.printStackTrace();
}
}
3) //在程序中对声音的控制
m_playSound = (byte) (1 - m_playSound);
if (m_playSound == 1) {
try {
player.start();
}
catch (Exception e) {}
}
if (m_playSound == 0) {
try {
player.stop();
}
catch (Exception e) {}
}
///---------------end
(出处:http://www.knowsky.com)