Initial working version
This commit is contained in:
+46
@@ -0,0 +1,46 @@
|
||||
'use strict';
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.MpcSv7Parser = void 0;
|
||||
const initDebug = require("debug");
|
||||
const BasicParser_1 = require("../../common/BasicParser");
|
||||
const SV7 = require("./StreamVersion7");
|
||||
const APEv2Parser_1 = require("../../apev2/APEv2Parser");
|
||||
const BitReader_1 = require("./BitReader");
|
||||
const debug = initDebug('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;
|
||||
Reference in New Issue
Block a user