openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
152 lines (151 loc) • 6.75 kB
JavaScript
import { o as __toESM } from "./chunk-CNf5ZN-e.js";
import { t as require_src } from "./src-6PhJB9jV.js";
import { t as fromBuffer } from "./lib-X3TAZBh2.js";
import { E as Uint8ArrayType, S as UINT32_LE, T as UINT8, _ as UINT16_BE, g as StringType, o as makeUnexpectedFileContentError, p as INT64_BE, t as BasicParser, x as UINT32_BE } from "./BasicParser-CSYy5xVJ.js";
import { i as FourCcToken } from "./APEv2Parser-Drjv2OIw.js";
import { t as ID3v2Parser } from "./ID3v2Parser-QOk8QoNp.js";
//#region node_modules/music-metadata/lib/dsdiff/DsdiffToken.js
var import_src = /* @__PURE__ */ __toESM(require_src(), 1);
/**
* DSDIFF chunk header
* The data-size encoding is deviating from EA-IFF 85
* Ref: http://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf
*/
const ChunkHeader64 = {
len: 12,
get: (buf, off) => {
return {
chunkID: FourCcToken.get(buf, off),
chunkSize: INT64_BE.get(buf, off + 4)
};
}
};
//#endregion
//#region node_modules/music-metadata/lib/dsdiff/DsdiffParser.js
const debug = (0, import_src.default)("music-metadata:parser:aiff");
var DsdiffContentParseError = class extends makeUnexpectedFileContentError("DSDIFF") {};
/**
* DSDIFF - Direct Stream Digital Interchange File Format (Phillips)
*
* Ref:
* - http://www.sonicstudio.com/pdf/dsd/DSDIFF_1.5_Spec.pdf
*/
var DsdiffParser = class extends BasicParser {
async parse() {
const header = await this.tokenizer.readToken(ChunkHeader64);
if (header.chunkID !== "FRM8") throw new DsdiffContentParseError("Unexpected chunk-ID");
this.metadata.setAudioOnly();
const type = (await this.tokenizer.readToken(FourCcToken)).trim();
switch (type) {
case "DSD":
this.metadata.setFormat("container", `DSDIFF/${type}`);
this.metadata.setFormat("lossless", true);
return this.readFmt8Chunks(header.chunkSize - BigInt(FourCcToken.len));
default: throw new DsdiffContentParseError(`Unsupported DSDIFF type: ${type}`);
}
}
async readFmt8Chunks(remainingSize) {
while (remainingSize >= ChunkHeader64.len) {
const chunkHeader = await this.tokenizer.readToken(ChunkHeader64);
debug(`Chunk id=${chunkHeader.chunkID}`);
await this.readData(chunkHeader);
remainingSize -= BigInt(ChunkHeader64.len) + chunkHeader.chunkSize;
}
}
async readData(header) {
debug(`Reading data of chunk[ID=${header.chunkID}, size=${header.chunkSize}]`);
const p0 = this.tokenizer.position;
switch (header.chunkID.trim()) {
case "FVER":
debug(`DSDIFF version=${await this.tokenizer.readToken(UINT32_LE)}`);
break;
case "PROP":
if (await this.tokenizer.readToken(FourCcToken) !== "SND ") throw new DsdiffContentParseError("Unexpected PROP-chunk ID");
await this.handleSoundPropertyChunks(header.chunkSize - BigInt(FourCcToken.len));
break;
case "ID3": {
const rst = fromBuffer(await this.tokenizer.readToken(new Uint8ArrayType(Number(header.chunkSize))));
await new ID3v2Parser().parse(this.metadata, rst, this.options);
break;
}
case "DSD":
if (this.metadata.format.numberOfChannels) this.metadata.setFormat("numberOfSamples", Number(header.chunkSize * BigInt(8) / BigInt(this.metadata.format.numberOfChannels)));
if (this.metadata.format.numberOfSamples && this.metadata.format.sampleRate) this.metadata.setFormat("duration", this.metadata.format.numberOfSamples / this.metadata.format.sampleRate);
break;
default:
debug(`Ignore chunk[ID=${header.chunkID}, size=${header.chunkSize}]`);
break;
}
const remaining = header.chunkSize - BigInt(this.tokenizer.position - p0);
if (remaining > 0) {
debug(`After Parsing chunk, remaining ${remaining} bytes`);
await this.tokenizer.ignore(Number(remaining));
}
}
async handleSoundPropertyChunks(remainingSize) {
debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`);
while (remainingSize > 0) {
const sndPropHeader = await this.tokenizer.readToken(ChunkHeader64);
debug(`Sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`);
const p0 = this.tokenizer.position;
switch (sndPropHeader.chunkID.trim()) {
case "FS": {
const sampleRate = await this.tokenizer.readToken(UINT32_BE);
this.metadata.setFormat("sampleRate", sampleRate);
break;
}
case "CHNL": {
const numChannels = await this.tokenizer.readToken(UINT16_BE);
this.metadata.setFormat("numberOfChannels", numChannels);
await this.handleChannelChunks(sndPropHeader.chunkSize - BigInt(UINT16_BE.len));
break;
}
case "CMPR": {
const compressionIdCode = (await this.tokenizer.readToken(FourCcToken)).trim();
const count = await this.tokenizer.readToken(UINT8);
const compressionName = await this.tokenizer.readToken(new StringType(count, "ascii"));
if (compressionIdCode === "DSD") {
this.metadata.setFormat("lossless", true);
this.metadata.setFormat("bitsPerSample", 1);
}
this.metadata.setFormat("codec", `${compressionIdCode} (${compressionName})`);
break;
}
case "ABSS":
debug(`ABSS ${await this.tokenizer.readToken(UINT16_BE)}:${await this.tokenizer.readToken(UINT8)}:${await this.tokenizer.readToken(UINT8)}.${await this.tokenizer.readToken(UINT32_BE)}`);
break;
case "LSCO":
debug(`LSCO lsConfig=${await this.tokenizer.readToken(UINT16_BE)}`);
break;
default:
debug(`Unknown sound-property-chunk[ID=${sndPropHeader.chunkID}, size=${sndPropHeader.chunkSize}]`);
await this.tokenizer.ignore(Number(sndPropHeader.chunkSize));
}
const remaining = sndPropHeader.chunkSize - BigInt(this.tokenizer.position - p0);
if (remaining > 0) {
debug(`After Parsing sound-property-chunk ${sndPropHeader.chunkSize}, remaining ${remaining} bytes`);
await this.tokenizer.ignore(Number(remaining));
}
remainingSize -= BigInt(ChunkHeader64.len) + sndPropHeader.chunkSize;
debug(`Parsing sound-property-chunks, remainingSize=${remainingSize}`);
}
if (this.metadata.format.lossless && this.metadata.format.sampleRate && this.metadata.format.numberOfChannels && this.metadata.format.bitsPerSample) {
const bitrate = this.metadata.format.sampleRate * this.metadata.format.numberOfChannels * this.metadata.format.bitsPerSample;
this.metadata.setFormat("bitrate", bitrate);
}
}
async handleChannelChunks(remainingSize) {
debug(`Parsing channel-chunks, remainingSize=${remainingSize}`);
const channels = [];
while (remainingSize >= FourCcToken.len) {
const channelId = await this.tokenizer.readToken(FourCcToken);
debug(`Channel[ID=${channelId}]`);
channels.push(channelId);
remainingSize -= BigInt(FourCcToken.len);
}
debug(`Channels: ${channels.join(", ")}`);
return channels;
}
};
//#endregion
export { DsdiffParser };