|
Sound |
|
/*
* JVirus is a PacMan clone, written in Java.
*
* Please read "http://jvirus.sourceforge.net/jvirus_licence.txt" for copyrights.
*
* The sourcecode is designed and created with
* Sun J2SDK 1.3 and Microsoft Visual J++ 6.0
*
* JVirus homepage: http://jvirus.sourceforge.net
*
* autor: Slawa Weis
* email: slawaweis@animatronik.net
*
*/
package org.game.JVirus;
import java.io.*;
import java.util.*;
import javax.sound.midi.*;
import javax.sound.sampled.*;
import org.game.JVirus.res.*;
/**
* Sound system of JVirus. Only static methods here.
*
* @see org.game.JVirus.res.Resource
*/
public final class Sound
{
/**
* Number of sound
*/
public static final int FX_MOVE = 0;
/**
* Number of sound
*/
public static final int FX_EAT1 = 1;
/**
* Number of sound
*/
public static final int FX_EAT2 = 2;
/**
* Number of sound
*/
public static final int FX_WIN = 3;
/**
* Number of sound
*/
public static final int FX_GATE_OPEN = 4;
/**
* Number of sound
*/
public static final int FX_FALL = 5;
/**
* Number of sound
*/
public static final int FX_LOSE = 6;
/**
* Number of sound
*/
public static final int FX_BEAM = 7;
/**
* sound names list to load from disk
*/
protected static final String fx_names [] = { "move", "eat_data", "eat_data2", "win", "gate_open", "fall", "lose", "beam" };
/**
* music list
*/
protected static Sequence background_sound_array [] = null;
/**
* if the music track run to end it start again.
* If the stop event coming from the programm and
* the track is not run to end, then not start again.
*/
protected static boolean ignoreStopEvent = false;
/**
* music volume
*/
protected static int musicVolume = 50;
/**
* last played track
*/
protected static int lastTrackNumber = 0;
/**
* midi Sequencer
*/
protected static Sequencer midiSequencer = null;
/**
* wav list
*/
protected static Clip fxs [] = null;
/**
* sound volume
*/
protected static int fxVolume = 50;
/**
* hidden constructor
*/
private Sound()
{
}
/**
* get music files count
*/
public static int getBackgroundCount()
{
if(background_sound_array != null)
return background_sound_array.length;
else
return -1;
}
/**
* play a music files
*/
public static void playBackground(int number)
{
if(midiSequencer != null)
{
if(midiSequencer.isRunning())
{
ignoreStopEvent = true;
midiSequencer.stop();
}
try
{
if(number >= 0)
{
lastTrackNumber = number;
midiSequencer.setMicrosecondPosition(0);
midiSequencer.setSequence(background_sound_array[number]);
midiSequencer.start();
setBackgroundVolume(musicVolume);
}
}
catch(InvalidMidiDataException e)
{
e.printStackTrace();
}
}
}
public static void playLastBackground()
{
playBackground(lastTrackNumber);
}
/**
* if the music track run to end this listener start it again.
*/
private static class BackgroundEndListener implements MetaEventListener
{
public void meta(MetaMessage meta)
{
// System.out.println(meta.getType() + " : " + ignoreStopEvent);
if(47 == meta.getType() && !ignoreStopEvent)
{
ignoreStopEvent = false;
midiSequencer.setMicrosecondPosition(0);
midiSequencer.start();
setBackgroundVolume(musicVolume);
}
}
}
/**
* set the music volume
*/
public static void setBackgroundVolume(int volume)
{
if(midiSequencer == null) return;
if(volume < 0 || volume > 100)
throw new IllegalArgumentException("volume must be between 0 and 100.");
musicVolume = volume;
double value = volume / 100.0;
MidiChannel channels[] = ((Synthesizer)midiSequencer).getChannels();
for(int i = 0; i < channels.length; i++)
{
channels[i].controlChange(7, (int)(value * 127.0));
}
}
/**
* set the music to mute
*/
public static void setBackgroundMute(boolean b)
{
// midiSequencer.setTrackMute(0, b);
if(midiSequencer != null)
{
MidiChannel channels[] = ((Synthesizer)midiSequencer).getChannels();
for(int i = 0; i < channels.length; i++)
{
channels[i].setMute(b);
}
}
}
/**
* stop music
*/
public static void stopBackground()
{
if(midiSequencer != null && midiSequencer.isRunning())
{
ignoreStopEvent = true;
midiSequencer.stop();
}
}
/**
* play a wav
*/
public static void playFX(int number)
{
if(fxs != null && !fxs[number].isActive())
{
fxs[number].setFramePosition(0);
fxs[number].start();
}
}
/**
* set sound volume
*/
public static void setFXVolume(int volume)
{
if(fxs == null) return;
if(volume < 0 || volume > 100)
throw new IllegalArgumentException("volume must be between 0 and 100.");
fxVolume = volume;
double value = volume / 100.0;
try
{
for(int i = 0; i < fxs.length; i++)
{
Clip clip = fxs[i];
FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
float dB = (float)(Math.log(value==0.0?0.0001:value)/Math.log(10.0)*20.0);
gainControl.setValue(dB);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* close the sound system
*/
public static void closeSoundSystem()
{
try
{
if(midiSequencer != null)
{
if(midiSequencer.isRunning())
{
ignoreStopEvent = true;
midiSequencer.stop();
}
if(midiSequencer.isOpen())
midiSequencer.close();
midiSequencer = null;
System.out.println("Midi resources free.");
}
if(fxs != null)
{
for(int i = 0; i < fxs.length; i++)
{
fxs[i].stop();
fxs[i].close();
}
fxs = null;
System.out.println("Sound resources free.");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
/**
* static initialiser
*/
static
{
boolean sound_disabled = false;
String jvirus_sound = System.getProperty("jvirus.sound");
if(jvirus_sound != null && jvirus_sound.equals("disabled"))
sound_disabled = true;
// if -Djvirus.sound=disabled, don't create
if(!sound_disabled)
{
initMidi();
setBackgroundVolume(50);
initFX();
setFXVolume(80);
}
else
System.out.println("Sound disabled.");
}
/**
* init the music system
*/
protected static void initMidi()
{
try
{
midiSequencer = MidiSystem.getSequencer();
if(midiSequencer != null)
{
if(!midiSequencer.isOpen()) midiSequencer.open();
}
}
catch(MidiUnavailableException e)
{
midiSequencer = null;
System.out.println("Sound disabled.");
e.printStackTrace();
}
if(midiSequencer == null) return;
Vector vecBackground = new Vector();
try
{
LineNumberReader lnr = new LineNumberReader(new InputStreamReader(Resource.class.getResourceAsStream("soundList.txt")));
String line = null;
while((line = lnr.readLine()) != null)
{
BufferedInputStream bis = new BufferedInputStream(Resource.class.getResourceAsStream(line), 20000);
vecBackground.addElement(MidiSystem.getSequence(bis));
}
}
catch(Exception e)
{
midiSequencer = null;
System.out.println("Sound disabled.");
e.printStackTrace();
}
if(midiSequencer == null) return;
midiSequencer.addMetaEventListener(new BackgroundEndListener());
background_sound_array = new Sequence[vecBackground.size()];
for(int i = 0; i < vecBackground.size(); i++)
background_sound_array[i] = (Sequence)vecBackground.elementAt(i);
System.out.println("Sound enabled.");
}
/**
* init the sound system
*/
protected static void initFX()
{
fxs = new Clip[fx_names.length];
try
{
for(int i = 0; i < fxs.length; i++)
{
BufferedInputStream bis = new BufferedInputStream(Resource.class.getResourceAsStream(fx_names[i] + ".wav"), 20000);
AudioInputStream stream = AudioSystem.getAudioInputStream(bis);
AudioFormat format = stream.getFormat();
DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat(), ((int) stream.getFrameLength() * format.getFrameSize()));
fxs[i] = (Clip)AudioSystem.getLine(info);
fxs[i].open(stream);
}
}
catch(Exception e)
{
fxs = null;
e.printStackTrace();
}
}
}
|
Sound |
|