Initial working version
This commit is contained in:
+36
@@ -0,0 +1,36 @@
|
||||
import { IGetToken } from 'strtok3/lib/core';
|
||||
/**
|
||||
* Speex Header Packet
|
||||
* Ref: https://www.speex.org/docs/manual/speex-manual/node8.html#SECTION00830000000000000000
|
||||
*/
|
||||
export interface IHeader {
|
||||
/**
|
||||
* speex_string, char[] 8
|
||||
*/
|
||||
speex: string;
|
||||
/**
|
||||
* speex_version, char[] 20
|
||||
*/
|
||||
version: string;
|
||||
/**
|
||||
* Version id
|
||||
*/
|
||||
version_id: number;
|
||||
header_size: number;
|
||||
rate: number;
|
||||
mode: number;
|
||||
mode_bitstream_version: number;
|
||||
nb_channels: number;
|
||||
bitrate: number;
|
||||
frame_size: number;
|
||||
vbr: number;
|
||||
frames_per_packet: number;
|
||||
extra_headers: number;
|
||||
reserved1: number;
|
||||
reserved2: number;
|
||||
}
|
||||
/**
|
||||
* Speex Header Packet
|
||||
* Ref: https://www.speex.org/docs/manual/speex-manual/node8.html#SECTION00830000000000000000
|
||||
*/
|
||||
export declare const Header: IGetToken<IHeader>;
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.Header = void 0;
|
||||
const Token = require("token-types");
|
||||
const util = require("../../common/Util");
|
||||
/**
|
||||
* Speex Header Packet
|
||||
* Ref: https://www.speex.org/docs/manual/speex-manual/node8.html#SECTION00830000000000000000
|
||||
*/
|
||||
exports.Header = {
|
||||
len: 80,
|
||||
get: (buf, off) => {
|
||||
return {
|
||||
speex: new Token.StringType(8, 'ascii').get(buf, off + 0),
|
||||
version: util.trimRightNull(new Token.StringType(20, 'ascii').get(buf, off + 8)),
|
||||
version_id: buf.readInt32LE(off + 28),
|
||||
header_size: buf.readInt32LE(off + 32),
|
||||
rate: buf.readInt32LE(off + 36),
|
||||
mode: buf.readInt32LE(off + 40),
|
||||
mode_bitstream_version: buf.readInt32LE(off + 44),
|
||||
nb_channels: buf.readInt32LE(off + 48),
|
||||
bitrate: buf.readInt32LE(off + 52),
|
||||
frame_size: buf.readInt32LE(off + 56),
|
||||
vbr: buf.readInt32LE(off + 60),
|
||||
frames_per_packet: buf.readInt32LE(off + 64),
|
||||
extra_headers: buf.readInt32LE(off + 68),
|
||||
reserved1: buf.readInt32LE(off + 72),
|
||||
reserved2: buf.readInt32LE(off + 76)
|
||||
};
|
||||
}
|
||||
};
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
/// <reference types="node" />
|
||||
import { ITokenizer } from 'strtok3/lib/core';
|
||||
import { IPageHeader } from '../Ogg';
|
||||
import { VorbisParser } from '../vorbis/VorbisParser';
|
||||
import { IOptions } from '../../type';
|
||||
import { INativeMetadataCollector } from '../../common/MetadataCollector';
|
||||
/**
|
||||
* Speex, RFC 5574
|
||||
* Ref:
|
||||
* https://www.speex.org/docs/manual/speex-manual/
|
||||
* https://tools.ietf.org/html/rfc5574
|
||||
*/
|
||||
export declare class SpeexParser extends VorbisParser {
|
||||
private tokenizer;
|
||||
constructor(metadata: INativeMetadataCollector, options: IOptions, tokenizer: ITokenizer);
|
||||
/**
|
||||
* Parse first Speex Ogg page
|
||||
* @param {IPageHeader} header
|
||||
* @param {Buffer} pageData
|
||||
*/
|
||||
protected parseFirstPage(header: IPageHeader, pageData: Buffer): void;
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.SpeexParser = void 0;
|
||||
const initDebug = require("debug");
|
||||
const Speex = require("./Speex");
|
||||
const VorbisParser_1 = require("../vorbis/VorbisParser");
|
||||
const debug = initDebug('music-metadata:parser:ogg:speex');
|
||||
/**
|
||||
* Speex, RFC 5574
|
||||
* Ref:
|
||||
* https://www.speex.org/docs/manual/speex-manual/
|
||||
* https://tools.ietf.org/html/rfc5574
|
||||
*/
|
||||
class SpeexParser extends VorbisParser_1.VorbisParser {
|
||||
constructor(metadata, options, tokenizer) {
|
||||
super(metadata, options);
|
||||
this.tokenizer = tokenizer;
|
||||
}
|
||||
/**
|
||||
* Parse first Speex Ogg page
|
||||
* @param {IPageHeader} header
|
||||
* @param {Buffer} pageData
|
||||
*/
|
||||
parseFirstPage(header, pageData) {
|
||||
debug('First Ogg/Speex page');
|
||||
const speexHeader = Speex.Header.get(pageData, 0);
|
||||
this.metadata.setFormat('codec', `Speex ${speexHeader.version}`);
|
||||
this.metadata.setFormat('numberOfChannels', speexHeader.nb_channels);
|
||||
this.metadata.setFormat('sampleRate', speexHeader.rate);
|
||||
if (speexHeader.bitrate !== -1) {
|
||||
this.metadata.setFormat('bitrate', speexHeader.bitrate);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.SpeexParser = SpeexParser;
|
||||
Reference in New Issue
Block a user