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