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