UNPKG

node-audio-mixer

Version:

PCM audio mixer with customizable parameters

32 lines (31 loc) • 1.95 kB
"use strict"; 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; }