115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.js; | ||
|  | 
 | ||
|  | import haxe.io.Bytes; | ||
|  | import js.Browser; | ||
|  | import js.html.XMLHttpRequest; | ||
|  | import kha.audio2.Audio; | ||
|  | 
 | ||
|  | /* | ||
|  | 	class WebAudioChannel extends kha.SoundChannel { | ||
|  | 	private var buffer: Dynamic; | ||
|  | 	private var startTime: Float; | ||
|  | 	private var offset: Float; | ||
|  | 	private var source: Dynamic; | ||
|  | 
 | ||
|  | 	public function new(buffer: Dynamic) { | ||
|  | 		super(); | ||
|  | 		this.offset = 0; | ||
|  | 		this.buffer = buffer; | ||
|  | 		this.startTime = Audio._context.currentTime;  | ||
|  | 		this.source = Audio._context.createBufferSource(); | ||
|  | 		this.source.buffer = this.buffer; | ||
|  | 		this.source.connect(Audio._context.destination); | ||
|  | 		this.source.start(0); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function play(): Void { | ||
|  | 		if (source != null) return; | ||
|  | 		super.play(); | ||
|  | 		startTime = Audio._context.currentTime - offset; | ||
|  | 		source.start(0, offset); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function pause(): Void { | ||
|  | 		source.stop(); | ||
|  | 		offset = Audio._context.currentTime - startTime; | ||
|  | 		startTime = -1; | ||
|  | 		source = null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function stop(): Void { | ||
|  | 		source.stop(); | ||
|  | 		source = null; | ||
|  | 		offset = 0; | ||
|  | 		startTime = -1; | ||
|  | 		super.stop(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function getCurrentPos(): Int { | ||
|  | 		if (startTime < 0) return Math.ceil(offset * 1000); | ||
|  | 		else return Math.ceil((Audio._context.currentTime - startTime) * 1000); //Miliseconds | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function getLength(): Int { | ||
|  | 		return Math.floor(buffer.duration * 1000); //Miliseconds | ||
|  | 	} | ||
|  | 	} | ||
|  |  */ | ||
|  | class WebAudioSound extends kha.Sound { | ||
|  | 	public function new(filename: String, done: kha.Sound->Void, failed: AssetError->Void) { | ||
|  | 		super(); | ||
|  | 		var request = untyped new XMLHttpRequest(); | ||
|  | 		request.open("GET", filename, true); | ||
|  | 		request.responseType = "arraybuffer"; | ||
|  | 
 | ||
|  | 		request.onerror = function() { | ||
|  | 			failed({url: filename}); | ||
|  | 		}; | ||
|  | 
 | ||
|  | 		request.onload = function() { | ||
|  | 			compressedData = Bytes.ofData(request.response); | ||
|  | 			uncompressedData = null; | ||
|  | 			done(this); | ||
|  | 		}; | ||
|  | 		request.send(null); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function superUncompress(done: Void->Void): Void { | ||
|  | 		super.uncompress(done); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function uncompress(done: Void->Void): Void { | ||
|  | 		Audio._context.decodeAudioData(compressedData.getData(), function(buffer: js.html.audio.AudioBuffer) { | ||
|  | 			final ch0 = buffer.getChannelData(0); | ||
|  | 			final ch1 = buffer.numberOfChannels == 1 ? ch0 : buffer.getChannelData(1); | ||
|  | 			final len = ch0.length; | ||
|  | 			uncompressedData = new kha.arrays.Float32Array(len * 2); | ||
|  | 			length = buffer.duration; | ||
|  | 			channels = buffer.numberOfChannels; | ||
|  | 			sampleRate = Math.round(buffer.sampleRate); | ||
|  | 			var idx = 0; | ||
|  | 			var i = 0; | ||
|  | 			final lidx = len * 2; | ||
|  | 			function uncompressInner() { | ||
|  | 				var chk_len = idx + 11025; | ||
|  | 				var next_chk = chk_len > lidx ? lidx : chk_len; | ||
|  | 				while (idx < next_chk) { | ||
|  | 					uncompressedData[idx] = ch0[i]; | ||
|  | 					uncompressedData[idx + 1] = ch1[i]; | ||
|  | 					idx += 2; | ||
|  | 					++i; | ||
|  | 				} | ||
|  | 				if (idx < lidx) | ||
|  | 					js.Browser.window.setTimeout(uncompressInner, 0); | ||
|  | 				else { | ||
|  | 					compressedData = null; | ||
|  | 					done(); | ||
|  | 				} | ||
|  | 			}; | ||
|  | 			uncompressInner(); | ||
|  | 		}, function() { | ||
|  | 			superUncompress(done); | ||
|  | 		}); | ||
|  | 	} | ||
|  | } |