forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			102 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.audio2; | ||
|  | 
 | ||
|  | import haxe.io.Bytes; | ||
|  | import haxe.io.BytesOutput; | ||
|  | import kha.audio2.ogg.vorbis.Reader; | ||
|  | 
 | ||
|  | #if (!cpp && !hl) | ||
|  | class StreamChannel implements kha.audio1.AudioChannel { | ||
|  | 	#if (!kha_no_ogg) | ||
|  | 	var reader: Reader; | ||
|  | 	#end | ||
|  | 	var atend: Bool = false; | ||
|  | 	var loop: Bool; | ||
|  | 	var myVolume: Float; | ||
|  | 	var paused: Bool = false; | ||
|  | 
 | ||
|  | 	public function new(data: Bytes, loop: Bool) { | ||
|  | 		myVolume = 1; | ||
|  | 		this.loop = loop; | ||
|  | 		#if (!kha_no_ogg) | ||
|  | 		reader = Reader.openFromBytes(data); | ||
|  | 		#end | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function nextSamples(samples: kha.arrays.Float32Array, length: Int, sampleRate: Int): Void { | ||
|  | 		if (paused) { | ||
|  | 			for (i in 0...length) { | ||
|  | 				samples[i] = 0; | ||
|  | 			} | ||
|  | 			return; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		#if (!kha_no_ogg) | ||
|  | 		var count = reader.read(samples, Std.int(length / 2), 2, sampleRate, true) * 2; | ||
|  | 		if (count < length) { | ||
|  | 			if (loop) { | ||
|  | 				reader.currentMillisecond = 0; | ||
|  | 			} | ||
|  | 			else { | ||
|  | 				atend = true; | ||
|  | 			} | ||
|  | 			for (i in count...length) { | ||
|  | 				samples[i] = 0; | ||
|  | 			} | ||
|  | 		} | ||
|  | 		#end | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function play(): Void { | ||
|  | 		paused = false; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function pause(): Void { | ||
|  | 		paused = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public function stop(): Void { | ||
|  | 		atend = true; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var length(get, null): Float; // Seconds | ||
|  | 
 | ||
|  | 	function get_length(): Float { | ||
|  | 		#if (kha_no_ogg) | ||
|  | 		return 0.0; | ||
|  | 		#else | ||
|  | 		return reader.totalMillisecond / 1000.0; | ||
|  | 		#end | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var position(get, set): Float; // Seconds | ||
|  | 
 | ||
|  | 	function get_position(): Float { | ||
|  | 		#if (kha_no_ogg) | ||
|  | 		return 0.0; | ||
|  | 		#else | ||
|  | 		return reader.currentMillisecond / 1000.0; | ||
|  | 		#end | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_position(value: Float): Float { | ||
|  | 		return value; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var volume(get, set): Float; | ||
|  | 
 | ||
|  | 	function get_volume(): Float { | ||
|  | 		return myVolume; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function set_volume(value: Float): Float { | ||
|  | 		return myVolume = value; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	public var finished(get, null): Bool; | ||
|  | 
 | ||
|  | 	function get_finished(): Bool { | ||
|  | 		return atend; | ||
|  | 	} | ||
|  | } | ||
|  | #end |