162 lines
3.5 KiB
Haxe
162 lines
3.5 KiB
Haxe
package kha.java;
|
|
|
|
import kha.audio1.AudioChannel;
|
|
|
|
@:classCode('
|
|
class SoundThread implements Runnable {
|
|
private java.util.ArrayList<Sound> sounds = new java.util.ArrayList<Sound>();
|
|
private java.util.Queue<Integer> queue = new java.util.ArrayDeque<Integer>();
|
|
private java.util.ArrayDeque<Sound> soundqueue = new java.util.ArrayDeque<Sound>();
|
|
|
|
@Override
|
|
public void run() {
|
|
for (;;) {
|
|
boolean notempty;
|
|
synchronized (this) {
|
|
notempty = !queue.isEmpty();
|
|
}
|
|
while (notempty) {
|
|
Sound sound;
|
|
synchronized (this) {
|
|
int index = queue.remove();
|
|
sound = sounds.get(index);
|
|
notempty = !queue.isEmpty();
|
|
}
|
|
if (soundqueue.contains(sound)) soundqueue.remove(sound);
|
|
soundqueue.push(sound);
|
|
if (!sound.isLoaded()) {
|
|
if (soundqueue.size() < 30) {
|
|
try {
|
|
javax.sound.sampled.Clip clip = javax.sound.sampled.AudioSystem.getClip();
|
|
sound.load(clip);
|
|
}
|
|
catch (javax.sound.sampled.LineUnavailableException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
else {
|
|
java.util.Iterator<Sound> it = soundqueue.descendingIterator();
|
|
while (true) {
|
|
Sound last = it.next();
|
|
if (last.isLoaded()) {
|
|
javax.sound.sampled.Clip clip = last.unloadit();
|
|
sound.load(clip);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
sound.realplay();
|
|
}
|
|
synchronized (this) {
|
|
try {
|
|
wait();
|
|
}
|
|
catch (InterruptedException e) {
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public synchronized int addSound(Sound sound) {
|
|
sounds.add(sound);
|
|
return sounds.size() - 1;
|
|
}
|
|
|
|
public synchronized void play(int index) {
|
|
queue.add(index);
|
|
notify();
|
|
}
|
|
|
|
public synchronized void stop(int index) {
|
|
queue.remove(index);
|
|
notify();
|
|
}
|
|
}
|
|
|
|
private static SoundThread thread;
|
|
private javax.sound.sampled.Clip clip;
|
|
|
|
public javax.sound.sampled.Clip unloadit() {
|
|
javax.sound.sampled.Clip clip = this.clip;
|
|
this.clip = null;
|
|
return clip;
|
|
}
|
|
|
|
public void load(javax.sound.sampled.Clip clip) {
|
|
this.clip = clip;
|
|
javax.sound.sampled.AudioInputStream stream;
|
|
try {
|
|
stream = javax.sound.sampled.AudioSystem.getAudioInputStream(new java.io.File(filename));
|
|
clip.close();
|
|
clip.open(stream);
|
|
}
|
|
catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
')
|
|
@:nativeGen
|
|
@:keep
|
|
@:native("kha.java.Sound")
|
|
class Sound extends kha.Sound {
|
|
var index: Int;
|
|
var filename: String;
|
|
|
|
public function new(filename: String) {
|
|
super();
|
|
init(filename);
|
|
}
|
|
|
|
@:functionCode('
|
|
this.filename = filename;
|
|
if (thread == null) {
|
|
thread = new SoundThread();
|
|
Thread realthread = new Thread(thread);
|
|
realthread.start();
|
|
}
|
|
index = thread.addSound(this);
|
|
')
|
|
function init(filename: String) {}
|
|
|
|
@:functionCode('
|
|
thread.play(index);
|
|
return null;
|
|
')
|
|
public function play(): AudioChannel {
|
|
return null;
|
|
}
|
|
|
|
@:functionCode('
|
|
if (clip.isRunning()) {
|
|
clip.stop();
|
|
}
|
|
thread.stop(index);
|
|
')
|
|
public function stop(): Void {}
|
|
|
|
@:functionCode('
|
|
return clip != null;
|
|
')
|
|
public function isLoaded(): Bool {
|
|
return true;
|
|
}
|
|
|
|
@:functionCode('
|
|
if (!clip.isRunning()) {
|
|
clip.setFramePosition(0);
|
|
clip.loop(0);
|
|
}
|
|
else clip.setFramePosition(0);
|
|
')
|
|
public function realplay(): Void {}
|
|
|
|
@:functionCode('
|
|
return clip.isRunning();
|
|
')
|
|
public function isRunning(): Bool {
|
|
return true;
|
|
}
|
|
}
|