node-audio-mixer
Version:
PCM audio mixer with customizable parameters
32 lines (31 loc) • 1.95 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.changeSampleRate = changeSampleRate;
const ModifiedDataView_1 = require("../../ModifiedDataView/ModifiedDataView");
const IsLittleEndian_1 = require("../General/IsLittleEndian");
const GetMethodName_1 = require("../General/GetMethodName");
function changeSampleRate(audioData, params, sampleRate) {
const bytesPerElement = params.bitDepth / 8;
const isLe = (0, IsLittleEndian_1.isLittleEndian)(params.endianness);
const scaleFactor = params.sampleRate / sampleRate;
const totalInputSamples = Math.floor(audioData.byteLength / bytesPerElement);
const totalOutputSamples = Math.ceil(totalInputSamples / scaleFactor);
const dataSize = totalOutputSamples * bytesPerElement;
const allocData = new Uint8Array(dataSize);
const allocDataView = new ModifiedDataView_1.ModifiedDataView(allocData.buffer);
const getSampleMethod = `get${(0, GetMethodName_1.getMethodName)(params.bitDepth, params.unsigned, params.float)}`;
const setSampleMethod = `set${(0, GetMethodName_1.getMethodName)(params.bitDepth, params.unsigned, params.float)}`;
for (let index = 0; index < totalOutputSamples; index++) {
const interpolatePosition = index * scaleFactor;
const previousPosition = Math.floor(interpolatePosition);
const nextPosition = previousPosition + 1;
const previousSample = audioData[getSampleMethod](previousPosition * bytesPerElement, isLe);
const nextSample = nextPosition < totalInputSamples
? audioData[getSampleMethod](nextPosition * bytesPerElement, isLe)
: previousSample;
const interpolatedValue = ((interpolatePosition - previousPosition) * (nextSample - previousSample)) + previousSample;
allocDataView[setSampleMethod](index * bytesPerElement, interpolatedValue, isLe);
}
params.sampleRate = sampleRate;
return allocDataView;
}