const TARGET_NUMBER_OF_CHANNELS = 2; const TARGET_SAMPLE_RATE = 48000; function mixAudio(waves, length) { if (waves.length === 1 && waves[0].length === length) { return waves[0]; } const mixed = new Int16Array(length); if (waves.length === 1) { mixed.set(waves[0].subarray(0, length)); return mixed; } for (let i = 0; i < length; i++) { const sum = waves.reduce((acc, wave) => { var _a; return acc + ((_a = wave[i]) !== null && _a !== void 0 ? _a : 0); }, 0); // Clamp to Int16 range mixed[i] = Math.max(-32768, Math.min(32767, sum)); } return mixed; } export const onlyInlineAudio = ({ assets, fps, frame, }) => { const inlineAudio = assets.filter((asset) => asset.type === 'inline-audio'); if (inlineAudio.length === 0) { return null; } const expectedLength = Math.round((TARGET_NUMBER_OF_CHANNELS * TARGET_SAMPLE_RATE) / fps); for (const asset of inlineAudio) { if (asset.toneFrequency !== 1) { throw new Error('Setting the toneFrequency is not supported yet in web rendering.'); } } const mixedAudio = mixAudio(inlineAudio.map((asset) => asset.audio), expectedLength); return new AudioData({ data: mixedAudio, format: 's16', numberOfChannels: TARGET_NUMBER_OF_CHANNELS, numberOfFrames: expectedLength / TARGET_NUMBER_OF_CHANNELS, sampleRate: TARGET_SAMPLE_RATE, timestamp: (frame / fps) * 1000000, }); };