forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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; | ||
|  | 	} | ||
|  | } |