121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package kha.java;
 | 
						|
 | 
						|
import java.lang.Runnable;
 | 
						|
 | 
						|
@:classCode('
 | 
						|
	java.io.File file;
 | 
						|
	javax.sound.sampled.AudioInputStream in;
 | 
						|
	javax.sound.sampled.SourceDataLine line;
 | 
						|
	int frameSize;
 | 
						|
	byte[] buffer = new byte [32 * 1024]; // 32k is arbitrary
 | 
						|
	Thread playThread;
 | 
						|
	boolean playing;
 | 
						|
	boolean notYetEOF;
 | 
						|
')
 | 
						|
class Music implements Runnable {
 | 
						|
	var loop: Bool = false;
 | 
						|
 | 
						|
	public function new(filename: String) {
 | 
						|
		init(filename);
 | 
						|
	}
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		try {
 | 
						|
			//instance = this;
 | 
						|
			java.io.File f = new java.io.File(filename);
 | 
						|
			file = f;
 | 
						|
			in = javax.sound.sampled.AudioSystem.getAudioInputStream (f);
 | 
						|
			javax.sound.sampled.AudioFormat format = in.getFormat();
 | 
						|
			javax.sound.sampled.AudioFormat.Encoding formatEncoding = format.getEncoding();
 | 
						|
			if (!(formatEncoding.equals(javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED) || formatEncoding.equals(javax.sound.sampled.AudioFormat.Encoding.PCM_UNSIGNED)))
 | 
						|
			   throw new javax.sound.sampled.UnsupportedAudioFileException(file.getName() + " is not PCM audio");
 | 
						|
		   //System.out.println ("got PCM format");
 | 
						|
		   frameSize = format.getFrameSize();
 | 
						|
		   javax.sound.sampled.DataLine.Info info = new javax.sound.sampled.DataLine.Info(javax.sound.sampled.SourceDataLine.class, format);
 | 
						|
		   //System.out.println ("got info");
 | 
						|
		   line = (javax.sound.sampled.SourceDataLine)javax.sound.sampled.AudioSystem.getLine(info);
 | 
						|
		   //System.out.println ("got line");
 | 
						|
		   line.open();
 | 
						|
		   //System.out.println ("opened line");
 | 
						|
		   playThread = new Thread(this);
 | 
						|
		   playing = false;
 | 
						|
		   notYetEOF = true;
 | 
						|
		}
 | 
						|
		catch (Exception ex) {
 | 
						|
			ex.printStackTrace();
 | 
						|
		}
 | 
						|
	')
 | 
						|
	function init(filename: String): Void {}
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		int readPoint = 0;
 | 
						|
		int bytesRead = 0;
 | 
						|
 | 
						|
		try {
 | 
						|
			while (playing) {
 | 
						|
				while (notYetEOF) {
 | 
						|
					if (playing) {
 | 
						|
						bytesRead = in.read(buffer, readPoint, buffer.length - readPoint);
 | 
						|
						if (bytesRead == -1) {
 | 
						|
							notYetEOF = false;
 | 
						|
							break;
 | 
						|
						}
 | 
						|
						// how many frames did we get,
 | 
						|
						// and how many are left over?
 | 
						|
						//int frames = bytesRead / frameSize;
 | 
						|
						int leftover = bytesRead % frameSize;
 | 
						|
						// send to line
 | 
						|
						line.write(buffer, readPoint, bytesRead-leftover);
 | 
						|
						// save the leftover bytes
 | 
						|
						System.arraycopy(buffer, bytesRead, buffer, 0, leftover);
 | 
						|
	                    readPoint = leftover;
 | 
						|
					}
 | 
						|
					else {
 | 
						|
						// if not playing
 | 
						|
						// Thread.yield();
 | 
						|
						try { Thread.sleep (10);}
 | 
						|
						catch (InterruptedException ie) {}
 | 
						|
					}
 | 
						|
				}
 | 
						|
				//System.out.println ("reached eof");
 | 
						|
				try {
 | 
						|
					in = javax.sound.sampled.AudioSystem.getAudioInputStream(file);
 | 
						|
				}
 | 
						|
				catch (javax.sound.sampled.UnsupportedAudioFileException e) {
 | 
						|
					e.printStackTrace();
 | 
						|
				}
 | 
						|
				if (loop) notYetEOF = true;
 | 
						|
				else playing = false;
 | 
						|
			}
 | 
						|
			line.drain();
 | 
						|
			line.stop();
 | 
						|
		}
 | 
						|
		catch (java.io.IOException ioe) {
 | 
						|
			ioe.printStackTrace();
 | 
						|
		}
 | 
						|
		finally {
 | 
						|
			// line.close();
 | 
						|
		}
 | 
						|
	')
 | 
						|
	public function run(): Void {}
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		this.loop = loop;
 | 
						|
		playing = true;
 | 
						|
		if (!playThread.isAlive())
 | 
						|
			playThread.start();
 | 
						|
		line.start();
 | 
						|
	')
 | 
						|
	function play2(loop: Bool): Void {}
 | 
						|
 | 
						|
	public function play(loop: Bool = false): Void {
 | 
						|
		play2(loop);
 | 
						|
	}
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		playing = false;
 | 
						|
		line.stop();
 | 
						|
	')
 | 
						|
	public function stop(): Void {}
 | 
						|
}
 |