forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package kha;
 | |
| 
 | |
| import haxe.io.Bytes;
 | |
| import haxe.io.BytesOutput;
 | |
| import kha.audio2.ogg.vorbis.Reader;
 | |
| 
 | |
| /**
 | |
|  * Contains compressed or uncompressed audio data.
 | |
|  */
 | |
| @:cppFileCode("\n#define STB_VORBIS_HEADER_ONLY\n#include <kinc/libs/stb_vorbis.c>")
 | |
| class Sound implements Resource {
 | |
| 	public var compressedData: Bytes;
 | |
| 	public var uncompressedData: kha.arrays.Float32Array;
 | |
| 	public var length: Float = 0; // in seconds
 | |
| 	public var channels: Int = 0;
 | |
| 	public var sampleRate: Int = 0;
 | |
| 
 | |
| 	public function new() {}
 | |
| 
 | |
| 	#if kha_kore
 | |
| 	public function uncompress(done: Void->Void): Void {
 | |
| 		if (uncompressedData != null) {
 | |
| 			done();
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		var samples: Int = 0;
 | |
| 		var channels: Int = 0;
 | |
| 		var samplesPerSecond: Int = 0;
 | |
| 
 | |
| 		untyped __cpp__("int16_t *data = nullptr");
 | |
| 		untyped __cpp__("samples = stb_vorbis_decode_memory((uint8_t*)compressedData->b->GetBase(), compressedData->length, &channels, &samplesPerSecond, &data)");
 | |
| 
 | |
| 		if (channels == 1) {
 | |
| 			length = samples / samplesPerSecond;
 | |
| 			uncompressedData = new kha.arrays.Float32Array(samples * 2);
 | |
| 			for (i in 0...samples) {
 | |
| 				untyped __cpp__("*((float*)&this->uncompressedData->self.data[({0} * 2) * 4]) = data[{0}] / 32767.0f", i);
 | |
| 				untyped __cpp__("*((float*)&this->uncompressedData->self.data[({0} * 2 + 1) * 4]) = data[{0}] / 32767.0f", i);
 | |
| 			}
 | |
| 		}
 | |
| 		else {
 | |
| 			length = samples / samplesPerSecond;
 | |
| 			samples *= channels;
 | |
| 			uncompressedData = new kha.arrays.Float32Array(samples);
 | |
| 			for (i in 0...samples) {
 | |
| 				untyped __cpp__("*((float*)&this->uncompressedData->self.data[{0} * 4]) = data[{0}] / 32767.0f", i);
 | |
| 			}
 | |
| 		}
 | |
| 		this.channels = channels;
 | |
| 		this.sampleRate = samplesPerSecond;
 | |
| 
 | |
| 		untyped __cpp__("delete[] data");
 | |
| 
 | |
| 		compressedData = null;
 | |
| 		done();
 | |
| 	}
 | |
| 	#else
 | |
| 	public function uncompress(done: Void->Void): Void {
 | |
| 		#if (!kha_no_ogg)
 | |
| 		if (uncompressedData != null) {
 | |
| 			done();
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		var output = new BytesOutput();
 | |
| 		var header = Reader.readAll(compressedData, output, true);
 | |
| 		var soundBytes = output.getBytes();
 | |
| 		var count = Std.int(soundBytes.length / 4);
 | |
| 		if (header.channel == 1) {
 | |
| 			length = count / kha.audio2.Audio.samplesPerSecond; // header.sampleRate;
 | |
| 			uncompressedData = new kha.arrays.Float32Array(count * 2);
 | |
| 			for (i in 0...count) {
 | |
| 				uncompressedData[i * 2 + 0] = soundBytes.getFloat(i * 4);
 | |
| 				uncompressedData[i * 2 + 1] = soundBytes.getFloat(i * 4);
 | |
| 			}
 | |
| 		}
 | |
| 		else {
 | |
| 			length = count / 2 / kha.audio2.Audio.samplesPerSecond; // header.sampleRate;
 | |
| 			uncompressedData = new kha.arrays.Float32Array(count);
 | |
| 			for (i in 0...count) {
 | |
| 				uncompressedData[i] = soundBytes.getFloat(i * 4);
 | |
| 			}
 | |
| 		}
 | |
| 		channels = header.channel;
 | |
| 		sampleRate = header.sampleRate;
 | |
| 		compressedData = null;
 | |
| 		done();
 | |
| 		#end
 | |
| 	}
 | |
| 	#end
 | |
| 
 | |
| 	public function unload() {
 | |
| 		compressedData = null;
 | |
| 		uncompressedData = null;
 | |
| 	}
 | |
| }
 |