mirror of
https://github.com/2006-Scape/2006Scape.git
synced 2026-07-03 00:31:51 +00:00
9c5ea6ec1d
* fix: Remove Oracle JRE dependency for sound effects
115 lines
2.4 KiB
Java
115 lines
2.4 KiB
Java
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
|
|
import javax.sound.sampled.*;
|
|
|
|
public class SoundPlayer implements Runnable {
|
|
|
|
private AudioInputStream stream;
|
|
private DataLine.Info info;
|
|
private SourceDataLine sound;
|
|
|
|
private InputStream soundStream;
|
|
private Thread player;
|
|
private int delay;
|
|
private int soundLevel;
|
|
public static int volume;
|
|
|
|
/**
|
|
* Initializes the sound player.
|
|
* @param stream
|
|
* @param level
|
|
* @param delay
|
|
*/
|
|
public SoundPlayer(InputStream stream, int level, int delay) {
|
|
if (level == 0 || volume == 4 || level - volume <= 0) {
|
|
return;
|
|
}
|
|
this.soundStream = stream;
|
|
this.soundLevel = level;
|
|
this.delay = delay;
|
|
player = new Thread(this);
|
|
player.start();
|
|
}
|
|
|
|
/**
|
|
* Plays the sound.
|
|
*/
|
|
public void run() {
|
|
try {
|
|
stream = AudioSystem.getAudioInputStream(soundStream);
|
|
|
|
AudioFormat format = stream.getFormat();
|
|
info = new DataLine.Info(SourceDataLine.class, format);
|
|
sound = (SourceDataLine) AudioSystem.getLine(info);
|
|
sound.open(format);
|
|
|
|
FloatControl volume = (FloatControl) sound.getControl(FloatControl.Type.MASTER_GAIN);
|
|
volume.setValue(getDecibels(soundLevel - getVolume()));
|
|
if (delay > 0) {
|
|
Thread.sleep(delay);
|
|
}
|
|
sound.start();
|
|
|
|
int nBytesRead = 0;
|
|
int EXTERNAL_BUFFER_SIZE = 524288;
|
|
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
|
|
try {
|
|
while (nBytesRead != -1) {
|
|
nBytesRead = stream.read(abData, 0, abData.length);
|
|
if (nBytesRead >= 0) {
|
|
sound.write(abData, 0, nBytesRead);
|
|
}
|
|
}
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
} finally {
|
|
sound.drain();
|
|
sound.close();
|
|
}
|
|
|
|
stream.close();
|
|
player.interrupt();
|
|
} catch (Exception e) {
|
|
player.interrupt();
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sets the client's volume level.
|
|
* @param level
|
|
*/
|
|
public static void setVolume(int level) {
|
|
volume = level;
|
|
}
|
|
|
|
/**
|
|
* Returns the client's volume level.
|
|
*/
|
|
public static int getVolume() {
|
|
return volume;
|
|
}
|
|
|
|
/**
|
|
* Returns the decibels for a given volume level.
|
|
* @param level
|
|
* @return
|
|
*/
|
|
public float getDecibels(int level) {
|
|
switch (level) {
|
|
case 0: // 4 in player options
|
|
return (float) -1.0f;
|
|
case 1: // 3
|
|
return (float) -5.0f;
|
|
case 2: // 2
|
|
return (float) -10.0f;
|
|
case 3: // 1
|
|
return (float) -15.0f;
|
|
case 4: // off
|
|
return (float) -100.0f;
|
|
default:
|
|
return (float) 0.0f;
|
|
}
|
|
}
|
|
} |