in src/frontends/live_api_react/frontend/src/utils/audio-streamer.ts [124:209]
private scheduleNextBuffer() {
const SCHEDULE_AHEAD_TIME = 0.2;
while (
this.audioQueue.length > 0 &&
this.scheduledTime < this.context.currentTime + SCHEDULE_AHEAD_TIME
) {
const audioData = this.audioQueue.shift()!;
const audioBuffer = this.createAudioBuffer(audioData);
const source = this.context.createBufferSource();
if (this.audioQueue.length === 0) {
if (this.endOfQueueAudioSource) {
this.endOfQueueAudioSource.onended = null;
}
this.endOfQueueAudioSource = source;
source.onended = () => {
if (
!this.audioQueue.length &&
this.endOfQueueAudioSource === source
) {
this.endOfQueueAudioSource = null;
this.onComplete();
}
};
}
source.buffer = audioBuffer;
source.connect(this.gainNode);
const worklets = registeredWorklets.get(this.context);
if (worklets) {
Object.entries(worklets).forEach(([workletName, graph]) => {
const { node, handlers } = graph;
if (node) {
source.connect(node);
node.port.onmessage = function (ev: MessageEvent) {
handlers.forEach((handler) => {
handler.call(node.port, ev);
});
};
node.connect(this.context.destination);
}
});
}
// i added this trying to fix clicks
// this.gainNode.gain.setValueAtTime(0, 0);
// this.gainNode.gain.linearRampToValueAtTime(1, 1);
// Ensure we never schedule in the past
const startTime = Math.max(this.scheduledTime, this.context.currentTime);
source.start(startTime);
this.scheduledTime = startTime + audioBuffer.duration;
}
if (this.audioQueue.length === 0 && this.processingBuffer.length === 0) {
if (this.isStreamComplete) {
this.isPlaying = false;
if (this.checkInterval) {
clearInterval(this.checkInterval);
this.checkInterval = null;
}
} else {
if (!this.checkInterval) {
this.checkInterval = window.setInterval(() => {
if (
this.audioQueue.length > 0 ||
this.processingBuffer.length >= this.bufferSize
) {
this.scheduleNextBuffer();
}
}, 100) as unknown as number;
}
}
} else {
const nextCheckTime =
(this.scheduledTime - this.context.currentTime) * 1000;
setTimeout(
() => this.scheduleNextBuffer(),
Math.max(0, nextCheckTime - 50),
);
}
}