meyda
Version:
Real-time feature extraction for the web audio api
87 lines (71 loc) • 2.38 kB
JavaScript
var WavManager = function (open_callback, data_callback, end_callback) {
var source = new Buffer(1);
var fs = require("fs");
var wav = require("wav");
var _dcb = data_callback;
var _ecb = end_callback;
var _bitDepth = 16;
var _numBytesPerSample = 2;
var _endian = "LE";
var _signed = false;
var _format = "unknown";
var _channels = 1;
var read_fun = "readUIntBE";
function int_res(signed, depth) {
//if the fmt is signed int, the max absolute value is half the actual number of possible values
return signed ? Math.pow(2, depth) / 2 : Math.pow(2, depth);
}
this.format = function () {
return _format;
};
this.open = function (path) {
var file = fs.createReadStream(path);
var source = new Buffer(1); //empty the current source if needed
var reader = new wav.Reader();
reader.on("format", function (format) {
//read wav headers
open_callback({ sampleRate: format.sampleRate });
_bitDepth = format.bitDepth;
_numBytesPerSample = _bitDepth / 8;
_endian = format.endianness;
_signed = format.signed;
_channels = format.channels;
_format = format;
read_fun = (_signed ? "readInt" : "readUInt") + _endian;
});
reader.on("data", function (_d) {
source = Buffer.concat([source, _d], source.length + _d.length);
var output = new Float32Array(_d.length / _numBytesPerSample);
var source_pos = 0;
var out_pos = 0;
for (
;
source_pos < _d.length;
source_pos += _numBytesPerSample, out_pos++
) {
output[out_pos] =
_d[read_fun](source_pos, _numBytesPerSample) /
int_res(_signed, _bitDepth);
}
if (_dcb) _dcb(output);
});
reader.on("end", function () {
var output = new Float32Array(source.length / _numBytesPerSample);
var source_pos = 0;
var out_pos = 0;
//here we discard the last byte because we don't really need this anyway and it's quicker
for (
;
source_pos < source.length - _numBytesPerSample;
source_pos += _numBytesPerSample, out_pos++
) {
output[out_pos] =
source[read_fun](source_pos, _numBytesPerSample) /
int_res(_signed, _bitDepth);
}
if (_ecb) _ecb(output);
});
file.pipe(reader);
};
};
module.exports = WavManager;