Deal properly with truncated WAVE files

This commit is contained in:
Vanilagy
2025-06-23 15:53:31 +02:00
parent c546deed7a
commit e22839f5a2
+5 -3
View File
@@ -42,10 +42,12 @@ export class WaveDemuxer extends Demuxer {
async readMetadata() {
return this.metadataPromise ??= (async () => {
const actualFileSize = await this.metadataReader.reader.source.getSize();
const riffType = this.metadataReader.readAscii(4);
this.metadataReader.littleEndian = riffType === 'RIFF';
const totalFileSize = this.metadataReader.readU32() + 8;
const totalFileSize = Math.min(this.metadataReader.readU32() + 8, actualFileSize);
const format = this.metadataReader.readAscii(4);
if (format !== 'WAVE') {
@@ -64,7 +66,7 @@ export class WaveDemuxer extends Demuxer {
await this.parseFmtChunk(chunkSize);
} else if (chunkId === 'data') {
this.dataStart = this.metadataReader.pos;
this.dataSize = chunkSize;
this.dataSize = Math.min(chunkSize, totalFileSize - this.dataStart);
}
this.metadataReader.pos = startPos + chunkSize + (chunkSize & 1); // Handle padding
@@ -90,7 +92,7 @@ export class WaveDemuxer extends Demuxer {
let formatTag = this.metadataReader.readU16();
const numChannels = this.metadataReader.readU16();
const sampleRate = this.metadataReader.readU32();
this.metadataReader.pos += 4;
this.metadataReader.pos += 4; // Bytes per second
const blockAlign = this.metadataReader.readU16();
let bitsPerSample: number;