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