in app/src/audio-utils/createPCMStream.js [4:52]
export default function createPCMStream(mediaStream, onClose) {
const ctx = new AudioContext();
const recorder = ctx.createScriptProcessor(null, 1, 1);
recorder.connect(ctx.destination);
const input = ctx.createMediaStreamSource(mediaStream);
// If we've been told to boost the value, hook up a gain node,
// otherwise just pipe it straight through to the script processor
if (mediaStream.__boost) {
const gain = ctx.createGain();
gain.gain.value = mediaStream.__boost;
input.connect(gain);
gain.connect(recorder);
} else {
input.connect(recorder);
}
let recording = true, dataCallback, dataQueue = [];
recorder.onaudioprocess = e => {
if (recording) {
const data = e.inputBuffer.getChannelData(0);
if (dataCallback) {
dataCallback(data);
} else {
dataQueue.push(data)
}
}
}
return {
onData: (fn) => {
dataCallback = fn;
dataQueue.forEach(x => fn(x));
},
stop: () => {
if (ctx.state === 'closed') return;
mediaStream.getAudioTracks().forEach(t => t.stop());
recorder.disconnect();
input.disconnect();
ctx.close();
recording = false;
onClose();
}
}
}