Files
LNXSDK/lib/aura/Sources/aura/channels/StreamChannel.hx
2025-01-22 16:18:30 +01:00

65 lines
1.6 KiB
Haxe

package aura.channels;
import aura.utils.Pointer;
import kha.arrays.Float32Array;
import aura.threading.BufferCache;
import aura.threading.Message;
import aura.types.AudioBuffer;
/**
Wrapper around `kha.audio2.StreamChannel` (for now).
**/
class StreamChannel extends BaseChannel {
final khaChannel: kha.audio2.StreamChannel;
final p_khaBuffer = new Pointer<Float32Array>(null);
public function new(khaChannel: kha.audio2.StreamChannel) {
this.khaChannel = khaChannel;
}
public function play(retrigger: Bool) {
paused = false;
finished = false;
khaChannel.play();
if (retrigger) {
khaChannel.position = 0;
}
}
public function pause() {
paused = true;
khaChannel.pause();
}
public function stop() {
finished = true;
khaChannel.stop();
}
function nextSamples(requestedSamples: AudioBuffer, sampleRate: Hertz) {
if (!BufferCache.getBuffer(TFloat32Array, p_khaBuffer, 1, requestedSamples.numChannels * requestedSamples.channelLength)) {
requestedSamples.clear();
return;
}
final khaBuffer = p_khaBuffer.get();
khaChannel.nextSamples(khaBuffer, requestedSamples.channelLength, sampleRate);
requestedSamples.deinterleaveFromFloat32Array(khaBuffer, requestedSamples.numChannels);
}
override function parseMessage(message: Message) {
switch (message.id) {
// Because we're using a Kha implementation here, we cannot use the
// LinearInterpolator parameters
case ChannelMessageID.PVolume: khaChannel.volume = cast message.data;
case ChannelMessageID.PPitch:
case ChannelMessageID.PDopplerRatio:
case ChannelMessageID.PDstAttenuation:
default:
super.parseMessage(message);
}
}
}