Skip to content

Commit

Permalink
#195 Fix minor errors in DSF chunk parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
Borewit committed Apr 9, 2019
1 parent 20ec202 commit 4263624
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/dsf/DsfChunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ export interface IFormatChunk {
* Common chunk DSD header: the 'chunk name (Four-CC)' & chunk size
*/
export const FormatChunk: Token.IGetToken<IFormatChunk> = {
len: 44,
len: 40,

get: (buf: Buffer, off: number): IFormatChunk => {
return {
Expand Down
46 changes: 25 additions & 21 deletions src/dsf/DsfParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import { AbstractID3Parser } from '../id3v2/AbstractID3Parser';
import * as assert from 'assert';

import * as _debug from 'debug';
import {ChunkHeader, DsdChunk, FormatChunk, IChunkHeader, IDsdChunk} from "./DsfChunk";
import {ID3v2Parser} from "../id3v2/ID3v2Parser";
import { ChunkHeader, DsdChunk, FormatChunk, IChunkHeader, IDsdChunk } from "./DsfChunk";
import { ID3v2Parser } from "../id3v2/ID3v2Parser";

const debug = _debug('music-metadata:parser:DSF');

Expand All @@ -17,6 +17,7 @@ export class DsfParser extends AbstractID3Parser {

public async _parse(): Promise<void> {

const p0 = this.tokenizer.position; // mark start position, normally 0
const chunkHeader = await this.tokenizer.readToken<IChunkHeader>(ChunkHeader);
assert.strictEqual(chunkHeader.id, 'DSD ');
this.metadata.setFormat('dataformat', 'DSF');
Expand All @@ -26,30 +27,33 @@ export class DsfParser extends AbstractID3Parser {
debug(`No ID3v2 tag present`);
} else {
debug(`expect ID3v2 at offset=${dsdChunk.metadataPointer}`);
await this.parseChunks();
await this.parseChunks(dsdChunk.fileSize - chunkHeader.size);
// Jump to ID3 header
this.tokenizer.ignore(dsdChunk.metadataPointer - this.tokenizer.position);
this.tokenizer.ignore(dsdChunk.metadataPointer - this.tokenizer.position - p0);
return new ID3v2Parser().parse(this.metadata, this.tokenizer, this.options);
}
}

private async parseChunks() {
const chunkHeader = await this.tokenizer.readToken<IChunkHeader>(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', formatChunk.sampleCount / formatChunk.samplingFrequency);
const bitrate = formatChunk.bitsPerSample * formatChunk.samplingFrequency * formatChunk.channelNum;
this.metadata.setFormat('bitrate', bitrate);
return;
default:
this.tokenizer.ignore(chunkHeader.size - ChunkHeader.len);
break;
private async parseChunks(bytesRemaining: number) {
while (bytesRemaining >= ChunkHeader.len) {
const chunkHeader = await this.tokenizer.readToken<IChunkHeader>(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', formatChunk.sampleCount / formatChunk.samplingFrequency);
const bitrate = formatChunk.bitsPerSample * formatChunk.samplingFrequency * formatChunk.channelNum;
this.metadata.setFormat('bitrate', bitrate);
return; // We got what we want, stop further processing of chunks
default:
this.tokenizer.ignore(chunkHeader.size - ChunkHeader.len);
break;
}
bytesRemaining -= chunkHeader.size;
}
}
}

0 comments on commit 4263624

Please sign in to comment.