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;
 | 
						|
	}
 | 
						|
}
 |