"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MpcSv7Parser = void 0; const debug_1 = require("debug"); const BasicParser_1 = require("../../common/BasicParser"); const APEv2Parser_1 = require("../../apev2/APEv2Parser"); const BitReader_1 = require("./BitReader"); const SV7 = require("./StreamVersion7"); const debug = (0, debug_1.default)('music-metadata:parser:musepack'); class MpcSv7Parser extends BasicParser_1.BasicParser { constructor() { super(...arguments); this.audioLength = 0; } async parse() { const header = await this.tokenizer.readToken(SV7.Header); if (header.signature !== 'MP+') throw new Error('Unexpected magic number'); debug(`stream-version=${header.streamMajorVersion}.${header.streamMinorVersion}`); this.metadata.setFormat('container', 'Musepack, SV7'); this.metadata.setFormat('sampleRate', header.sampleFrequency); const numberOfSamples = 1152 * (header.frameCount - 1) + header.lastFrameLength; this.metadata.setFormat('numberOfSamples', numberOfSamples); this.duration = numberOfSamples / header.sampleFrequency; this.metadata.setFormat('duration', this.duration); this.bitreader = new BitReader_1.BitReader(this.tokenizer); this.metadata.setFormat('numberOfChannels', header.midSideStereo || header.intensityStereo ? 2 : 1); const version = await this.bitreader.read(8); this.metadata.setFormat('codec', (version / 100).toFixed(2)); await this.skipAudioData(header.frameCount); debug(`End of audio stream, switching to APEv2, offset=${this.tokenizer.position}`); return APEv2Parser_1.APEv2Parser.tryParseApeHeader(this.metadata, this.tokenizer, this.options); } async skipAudioData(frameCount) { while (frameCount-- > 0) { const frameLength = await this.bitreader.read(20); this.audioLength += 20 + frameLength; await this.bitreader.ignore(frameLength); } // last frame const lastFrameLength = await this.bitreader.read(11); this.audioLength += lastFrameLength; this.metadata.setFormat('bitrate', this.audioLength / this.duration); } } exports.MpcSv7Parser = MpcSv7Parser;