Skip to content

Commit ed199bc

Browse files
webui: faster WAV PCM encode via hoisted channels and Int16Array
1 parent 786e92e commit ed199bc

1 file changed

Lines changed: 13 additions & 5 deletions

File tree

tools/server/webui/src/lib/utils/audio-recording.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,20 @@ function audioBufferToWav(buffer: AudioBuffer): Blob {
203203
writeString(36, 'data'); // Subchunk2ID
204204
view.setUint32(40, dataSize, true); // Subchunk2Size
205205

206-
let offset = 44;
206+
// Cache channel arrays, write PCM via Int16Array (native little-endian, matches WAV)
207+
const channels: Float32Array[] = new Array(numberOfChannels);
208+
for (let c = 0; c < numberOfChannels; c++) {
209+
channels[c] = buffer.getChannelData(c);
210+
}
211+
212+
const pcm = new Int16Array(arrayBuffer, 44, length * numberOfChannels);
213+
let p = 0;
207214
for (let i = 0; i < length; i++) {
208-
for (let channel = 0; channel < numberOfChannels; channel++) {
209-
const sample = Math.max(-1, Math.min(1, buffer.getChannelData(channel)[i]));
210-
view.setInt16(offset, sample * 0x7fff, true);
211-
offset += 2;
215+
for (let c = 0; c < numberOfChannels; c++) {
216+
let s = channels[c][i];
217+
if (s > 1) s = 1;
218+
else if (s < -1) s = -1;
219+
pcm[p++] = s * 0x7fff;
212220
}
213221
}
214222

0 commit comments

Comments
 (0)