{"version":3,"sources":["webpack:///./src/views/recorder/lib/encoder.ts","webpack:///./src/views/recorder/lib/devices.ts","webpack:///./node_modules/core-js/modules/es.array-buffer.constructor.js","webpack:///./src/views/recorder/lib/backup_recorder.ts"],"names":["min","Math","max","setString","view","offset","str","len","length","i","setUint8","charCodeAt","Encoder","numSamples","numChannels","sampleRate","dataViews","buffer","nCh","this","DataView","ArrayBuffer","ch","x","setInt16","push","dataSize","setUint32","setUint16","unshift","blob","Blob","type","cleanup","selectDevice","id","LocalStorage","setInputDevice","setVideoInputDevice","getInputDevice","getVideoInputDevice","getDevices","navigator","mediaDevices","enumerateDevices","console","log","inputDevice","constraints","video","audio","channelCount","echoCancellation","deviceId","undefined","getUserMedia","stream","getTracks","forEach","t","stop","devices","deviceType","inputDevices","filter","kind","map","name","label","error","$","global","arrayBufferModule","setSpecies","ARRAY_BUFFER","NativeArrayBuffer","forced","onupdate","isRecording","bufferSize","isPause","duration","savedDuration","exact","encoder","_micCaptured","track","input","disconnect","processor","context","currentTime","close","finish","now","Date","record","recordedAt","toISOString","title","toLocaleString","window","AudioContext","webkitAudioContext","analyzer","createAnalyser","createMediaStreamSource","createScriptProcessor","fftSize","smoothingTimeConstant","connect","destination","onaudioprocess","ev","sample","inputBuffer","getChannelData","encode","Uint8Array","frequencyBinCount","getByteFrequencyData","sum","reduce","cum","curr","vol"],"mappings":"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","file":"assets/js/chunk-6c1c781d.f0a44100.js","sourcesContent":["const min = Math.min,\r\n max = Math.max;\r\n\r\nconst setString = function (view: any, offset: any, str: any) {\r\n const len = str.length;\r\n for (let i = 0; i < len; ++i) view.setUint8(offset + i, str.charCodeAt(i));\r\n};\r\n\r\nexport class Encoder {\r\n numSamples = 0;\r\n numChannels = 1;\r\n sampleRate = 48000;\r\n dataViews: DataView[] = [];\r\n constructor() {}\r\n\r\n encode(buffer: [Float32Array]) {\r\n const len = buffer[0].length,\r\n nCh = this.numChannels,\r\n view = new DataView(new ArrayBuffer(len * nCh * 2));\r\n let offset = 0;\r\n for (let i = 0; i < len; ++i)\r\n for (let ch = 0; ch < nCh; ++ch) {\r\n const x = buffer[ch][i] * 0x7fff;\r\n view.setInt16(offset, x < 0 ? max(x, -0x8000) : min(x, 0x7fff), true);\r\n offset += 2;\r\n }\r\n this.dataViews.push(view);\r\n this.numSamples += len;\r\n }\r\n\r\n finish() {\r\n const dataSize = this.numChannels * this.numSamples * 2,\r\n view = new DataView(new ArrayBuffer(44));\r\n setString(view, 0, \"RIFF\");\r\n view.setUint32(4, 36 + dataSize, true);\r\n setString(view, 8, \"WAVE\");\r\n setString(view, 12, \"fmt \");\r\n view.setUint32(16, 16, true);\r\n view.setUint16(20, 1, true);\r\n view.setUint16(22, this.numChannels, true);\r\n view.setUint32(24, this.sampleRate, true);\r\n view.setUint32(28, this.sampleRate * 4, true);\r\n view.setUint16(32, this.numChannels * 2, true);\r\n view.setUint16(34, 16, true);\r\n setString(view, 36, \"data\");\r\n view.setUint32(40, dataSize, true);\r\n this.dataViews.unshift(view);\r\n const blob = new Blob(this.dataViews, { type: \"audio/wav\" });\r\n this.cleanup();\r\n return blob;\r\n }\r\n\r\n cleanup() {\r\n this.dataViews = [];\r\n }\r\n}\r\n","import LocalStorage from \"@/core/utils/LocalStorage\";\r\n\r\ntype DeviceType = \"video\" | \"audio\";\r\nexport interface Device {\r\n id: string;\r\n name: string;\r\n}\r\n\r\nexport const selectDevice = (id: string, type: DeviceType = \"audio\") => {\r\n if (type === \"audio\") LocalStorage.setInputDevice(id);\r\n else LocalStorage.setVideoInputDevice(id);\r\n};\r\n\r\nexport const getInputDevice = (type: DeviceType = \"audio\") => {\r\n return type === \"audio\"\r\n ? LocalStorage.getInputDevice()\r\n : LocalStorage.getVideoInputDevice();\r\n};\r\n\r\nexport const getDevices = async (type: DeviceType = \"audio\") => {\r\n if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {\r\n console.log(\"enumerateDevices() not supported.\");\r\n return [];\r\n }\r\n\r\n const inputDevice = getInputDevice();\r\n const constraints: MediaStreamConstraints =\r\n type === \"audio\"\r\n ? {\r\n video: false,\r\n audio: {\r\n channelCount: 1,\r\n echoCancellation: false,\r\n deviceId: inputDevice ? inputDevice : undefined,\r\n },\r\n }\r\n : {\r\n audio: false,\r\n video: {\r\n deviceId: inputDevice ? inputDevice : undefined,\r\n },\r\n };\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\r\n stream.getTracks().forEach(t => t.stop());\r\n const devices = await navigator.mediaDevices.enumerateDevices();\r\n\r\n const deviceType: MediaDeviceKind =\r\n type === \"audio\" ? \"audioinput\" : \"videoinput\";\r\n const inputDevices = devices\r\n .filter(x => x.kind === deviceType)\r\n .map(x => ({ id: x.deviceId, name: x.label } as Device));\r\n if (!inputDevice && inputDevices.length > 0)\r\n selectDevice(inputDevices[0].id, type);\r\n return inputDevices;\r\n } catch (error) {\r\n console.error(\"Error getting devices:\", error);\r\n return [];\r\n }\r\n};\r\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar arrayBufferModule = require('../internals/array-buffer');\nvar setSpecies = require('../internals/set-species');\n\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar ArrayBuffer = arrayBufferModule[ARRAY_BUFFER];\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\n\n// `ArrayBuffer` constructor\n// https://tc39.github.io/ecma262/#sec-arraybuffer-constructor\n$({ global: true, forced: NativeArrayBuffer !== ArrayBuffer }, {\n ArrayBuffer: ArrayBuffer\n});\n\nsetSpecies(ARRAY_BUFFER);\n","import { Recording } from \"@/core/models\";\r\nimport { getInputDevice } from \"./devices\";\r\nimport { Encoder } from \"./encoder\";\r\n\r\nexport default class {\r\n isRecording = false;\r\n bufferSize = 4096;\r\n isPause = false;\r\n duration = 0;\r\n savedDuration = 0;\r\n\r\n stream?: MediaStream;\r\n encoder?: Encoder;\r\n context?: AudioContext;\r\n processor?: ScriptProcessorNode;\r\n input?: MediaStreamAudioSourceNode;\r\n analyzer?: AnalyserNode;\r\n onupdate: (vol: number) => void;\r\n\r\n constructor(onupdate: (vol: number) => void = () => {}) {\r\n this.onupdate = onupdate;\r\n }\r\n\r\n async start() {\r\n const inputDevice = getInputDevice();\r\n const constraints: MediaStreamConstraints = {\r\n video: false,\r\n audio: {\r\n channelCount: 1,\r\n echoCancellation: false,\r\n deviceId: inputDevice ? { exact: inputDevice } : undefined,\r\n },\r\n };\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia(constraints);\r\n this.stream = stream;\r\n this.encoder = new Encoder();\r\n this._micCaptured(stream);\r\n } catch (error) {\r\n console.log(\"Mic error\", error);\r\n }\r\n }\r\n\r\n async stop() {\r\n this.stream?.getTracks().forEach((track: MediaStreamTrack) => track.stop());\r\n\r\n this.input?.disconnect();\r\n this.processor?.disconnect();\r\n this.duration = this.context?.currentTime || this.savedDuration;\r\n this.context?.close();\r\n\r\n const blob = this.encoder?.finish();\r\n if (!blob) return;\r\n\r\n const now = new Date();\r\n const record = {\r\n blob: blob,\r\n recordedAt: now.toISOString(),\r\n title: `Recorded on ${now.toLocaleString()}`,\r\n } as Recording;\r\n\r\n this.savedDuration = 0;\r\n this.duration = 0;\r\n this.isRecording = false;\r\n\r\n return record;\r\n }\r\n\r\n pause() {\r\n this.stream?.getTracks().forEach((track: MediaStreamTrack) => track.stop());\r\n this.input?.disconnect();\r\n this.processor?.disconnect();\r\n this.duration = this.context?.currentTime || this.savedDuration;\r\n this.context?.close();\r\n\r\n this.savedDuration = this.duration;\r\n this.isPause = true;\r\n }\r\n\r\n _micCaptured(stream: MediaStream) {\r\n // @ts-ignore\r\n this.context = new (window.AudioContext || window.webkitAudioContext)();\r\n this.duration = this.savedDuration;\r\n this.analyzer = this.context.createAnalyser();\r\n this.input = this.context.createMediaStreamSource(stream);\r\n this.processor = this.context.createScriptProcessor(this.bufferSize, 1, 1);\r\n this.stream = stream;\r\n\r\n this.analyzer.fftSize = 64;\r\n this.analyzer.smoothingTimeConstant = 0.3;\r\n\r\n this.input.connect(this.analyzer);\r\n this.analyzer.connect(this.processor);\r\n this.processor.connect(this.context.destination);\r\n this.processor.onaudioprocess = (ev: AudioProcessingEvent) => {\r\n // Toggle if recording\r\n if (!this.isRecording || (this.isRecording && this.isPause)) {\r\n this.isPause = false;\r\n this.isRecording = true;\r\n }\r\n\r\n // encode sample\r\n const sample = ev.inputBuffer.getChannelData(0);\r\n this.encoder?.encode([sample]);\r\n\r\n // get duration\r\n this.duration = this.savedDuration + (this.context?.currentTime || 0);\r\n\r\n // get volume\r\n if (!this.analyzer) return;\r\n const buffer = new Uint8Array(this.analyzer.frequencyBinCount);\r\n this.analyzer.getByteFrequencyData(buffer);\r\n const sum = buffer.reduce((cum, curr) => cum + curr, 0);\r\n const vol = sum / buffer.length;\r\n this.onupdate(vol);\r\n };\r\n\r\n this.input?.connect(this.processor);\r\n this.processor.connect(this.context.destination);\r\n }\r\n}\r\n"],"sourceRoot":""}