UNPKG

extendable-media-recorder-wav-encoder-worker

Version:
55 lines (54 loc) 2.92 kB
import { createWorker } from "worker-factory"; import { createCreateOrUpdateRecording } from "./factories/create-or-update-recording"; import { createEncode } from "./factories/encode"; import { computeNumberOfSamples } from "./functions/compute-number-of-samples"; import { encodeHeader } from "./functions/encode-header"; import { shiftChannelDataArrays } from "./functions/shift-channel-data-arrays"; export * from "./interfaces/index"; export * from "./types/index"; const recordings = /* @__PURE__ */ new Map(); const createOrUpdateRecording = createCreateOrUpdateRecording(recordings); const encode = createEncode(computeNumberOfSamples, encodeHeader); const encodings = /* @__PURE__ */ new Map(); createWorker(self, { characterize: () => { return { result: /^audio\/wav$/ }; }, encode: ({ recordingId, timeslice }) => { const encoding = encodings.get(recordingId); if (encoding !== void 0) { encodings.delete(recordingId); encoding.reject(new Error("Another request was made to initiate an encoding.")); } const recording = recordings.get(recordingId); if (timeslice !== null) { if (recording === void 0 || computeNumberOfSamples(recording.channelDataArrays[0]) * (1e3 / recording.sampleRate) < timeslice) { return new Promise((resolve, reject) => { encodings.set(recordingId, { reject, resolve, timeslice }); }); } const shiftedChannelDataArrays = shiftChannelDataArrays(recording.channelDataArrays, Math.ceil(timeslice * (recording.sampleRate / 1e3))); const arrayBuffers = encode(shiftedChannelDataArrays, recording.isComplete ? "initial" : "subsequent", 16, recording.sampleRate); recording.isComplete = false; return { result: arrayBuffers, transferables: arrayBuffers }; } if (recording !== void 0) { const arrayBuffers = encode(recording.channelDataArrays, recording.isComplete ? "complete" : "subsequent", 16, recording.sampleRate); recordings.delete(recordingId); return { result: arrayBuffers, transferables: arrayBuffers }; } return { result: [], transferables: [] }; }, record: ({ recordingId, sampleRate, typedArrays }) => { const recording = createOrUpdateRecording(recordingId, sampleRate, typedArrays); const encoding = encodings.get(recordingId); if (encoding !== void 0 && computeNumberOfSamples(recording.channelDataArrays[0]) * (1e3 / sampleRate) >= encoding.timeslice) { const shiftedChannelDataArrays = shiftChannelDataArrays(recording.channelDataArrays, Math.ceil(encoding.timeslice * (sampleRate / 1e3))); const arrayBuffers = encode(shiftedChannelDataArrays, recording.isComplete ? "initial" : "subsequent", 16, sampleRate); recording.isComplete = false; encodings.delete(recordingId); encoding.resolve({ result: arrayBuffers, transferables: arrayBuffers }); } return { result: null }; } });