UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

102 lines (101 loc) 3.83 kB
import { o as __toESM } from "./chunk-CNf5ZN-e.js"; import { t as require_src } from "./src-6PhJB9jV.js"; import { f as INT32_LE, m as INT64_LE, o as makeUnexpectedFileContentError, w as UINT64_LE } from "./BasicParser-CSYy5xVJ.js"; import { i as FourCcToken } from "./APEv2Parser-Drjv2OIw.js"; import { t as ID3v2Parser } from "./ID3v2Parser-QOk8QoNp.js"; import { t as AbstractID3Parser } from "./AbstractID3Parser-B0YuPNia.js"; //#region node_modules/music-metadata/lib/dsf/DsfChunk.js var import_src = /* @__PURE__ */ __toESM(require_src(), 1); /** * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size */ const ChunkHeader = { len: 12, get: (buf, off) => { return { id: FourCcToken.get(buf, off), size: UINT64_LE.get(buf, off + 4) }; } }; /** * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size */ const DsdChunk = { len: 16, get: (buf, off) => { return { fileSize: INT64_LE.get(buf, off), metadataPointer: INT64_LE.get(buf, off + 8) }; } }; /** * Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size */ const FormatChunk = { len: 40, get: (buf, off) => { return { formatVersion: INT32_LE.get(buf, off), formatID: INT32_LE.get(buf, off + 4), channelType: INT32_LE.get(buf, off + 8), channelNum: INT32_LE.get(buf, off + 12), samplingFrequency: INT32_LE.get(buf, off + 16), bitsPerSample: INT32_LE.get(buf, off + 20), sampleCount: INT64_LE.get(buf, off + 24), blockSizePerChannel: INT32_LE.get(buf, off + 32) }; } }; //#endregion //#region node_modules/music-metadata/lib/dsf/DsfParser.js const debug = (0, import_src.default)("music-metadata:parser:DSF"); var DsdContentParseError = class extends makeUnexpectedFileContentError("DSD") {}; /** * DSF (dsd stream file) File Parser * Ref: https://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf */ var DsfParser = class extends AbstractID3Parser { async postId3v2Parse() { const p0 = this.tokenizer.position; const chunkHeader = await this.tokenizer.readToken(ChunkHeader); if (chunkHeader.id !== "DSD ") throw new DsdContentParseError("Invalid chunk signature"); this.metadata.setFormat("container", "DSF"); this.metadata.setFormat("lossless", true); this.metadata.setAudioOnly(); const dsdChunk = await this.tokenizer.readToken(DsdChunk); if (dsdChunk.metadataPointer === BigInt(0)) debug("No ID3v2 tag present"); else { debug(`expect ID3v2 at offset=${dsdChunk.metadataPointer}`); await this.parseChunks(dsdChunk.fileSize - chunkHeader.size); await this.tokenizer.ignore(Number(dsdChunk.metadataPointer) - this.tokenizer.position - p0); return new ID3v2Parser().parse(this.metadata, this.tokenizer, this.options); } } async parseChunks(bytesRemaining) { while (bytesRemaining >= ChunkHeader.len) { const chunkHeader = await this.tokenizer.readToken(ChunkHeader); debug(`Parsing chunk name=${chunkHeader.id} size=${chunkHeader.size}`); switch (chunkHeader.id) { case "fmt ": { const formatChunk = await this.tokenizer.readToken(FormatChunk); this.metadata.setFormat("numberOfChannels", formatChunk.channelNum); this.metadata.setFormat("sampleRate", formatChunk.samplingFrequency); this.metadata.setFormat("bitsPerSample", formatChunk.bitsPerSample); this.metadata.setFormat("numberOfSamples", formatChunk.sampleCount); this.metadata.setFormat("duration", Number(formatChunk.sampleCount) / formatChunk.samplingFrequency); const bitrate = formatChunk.bitsPerSample * formatChunk.samplingFrequency * formatChunk.channelNum; this.metadata.setFormat("bitrate", bitrate); return; } default: this.tokenizer.ignore(Number(chunkHeader.size) - ChunkHeader.len); break; } bytesRemaining -= chunkHeader.size; } } }; //#endregion export { DsfParser };