UNPKG

@corti/dictation-web

Version:
126 lines 8.32 kB
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _MediaController_mediaStream, _MediaController_audioContext, _MediaController_analyser, _MediaController_mediaRecorder, _MediaController_visualiserInterval, _MediaController_audioLevel, _MediaController_onTrackEnded, _MediaController_onAudioLevelChange, _MediaController_dataHandler; import { calculateAudioLevel, createAudioAnalyzer, getMediaStream, } from "../utils/media.js"; export class MediaController { constructor(host) { _MediaController_mediaStream.set(this, null); _MediaController_audioContext.set(this, null); _MediaController_analyser.set(this, null); _MediaController_mediaRecorder.set(this, null); _MediaController_visualiserInterval.set(this, void 0); _MediaController_audioLevel.set(this, 0); _MediaController_onTrackEnded.set(this, void 0); _MediaController_onAudioLevelChange.set(this, void 0); _MediaController_dataHandler.set(this, void 0); this.host = host; host.addController(this); } hostDisconnected() { this.cleanup(); } async initialize(onTrackEnded, dataHandler) { await this.cleanup(); __classPrivateFieldSet(this, _MediaController_onTrackEnded, onTrackEnded, "f"); __classPrivateFieldSet(this, _MediaController_dataHandler, dataHandler, "f"); __classPrivateFieldSet(this, _MediaController_mediaStream, await getMediaStream(this.host._selectedDevice?.deviceId, this.host._debug_displayAudio), "f"); __classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => { track.addEventListener("ended", () => { if (__classPrivateFieldGet(this, _MediaController_onTrackEnded, "f")) { __classPrivateFieldGet(this, _MediaController_onTrackEnded, "f").call(this); } }); }); const { audioContext, analyser } = createAudioAnalyzer(__classPrivateFieldGet(this, _MediaController_mediaStream, "f")); __classPrivateFieldSet(this, _MediaController_audioContext, audioContext, "f"); __classPrivateFieldSet(this, _MediaController_analyser, analyser, "f"); __classPrivateFieldSet(this, _MediaController_mediaRecorder, new MediaRecorder(__classPrivateFieldGet(this, _MediaController_mediaStream, "f")), "f"); __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").ondataavailable = (event) => { if (__classPrivateFieldGet(this, _MediaController_dataHandler, "f")) { __classPrivateFieldGet(this, _MediaController_dataHandler, "f").call(this, event.data); } }; } getAudioLevel() { return __classPrivateFieldGet(this, _MediaController_analyser, "f") ? calculateAudioLevel(__classPrivateFieldGet(this, _MediaController_analyser, "f")) : 0; } startAudioLevelMonitoring(onAudioLevelChange) { this.stopAudioLevelMonitoring(); __classPrivateFieldSet(this, _MediaController_onAudioLevelChange, onAudioLevelChange, "f"); __classPrivateFieldSet(this, _MediaController_visualiserInterval, window.setInterval(() => { __classPrivateFieldSet(this, _MediaController_audioLevel, this.getAudioLevel() * 3, "f"); this.host.requestUpdate(); if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) { __classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f")); } }, 150), "f"); } stopAudioLevelMonitoring() { if (__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f")) { clearInterval(__classPrivateFieldGet(this, _MediaController_visualiserInterval, "f")); __classPrivateFieldSet(this, _MediaController_visualiserInterval, undefined, "f"); } __classPrivateFieldSet(this, _MediaController_audioLevel, 0, "f"); this.host.requestUpdate(); if (__classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f")) { __classPrivateFieldGet(this, _MediaController_onAudioLevelChange, "f").call(this, __classPrivateFieldGet(this, _MediaController_audioLevel, "f")); } } async cleanup() { this.stopAudioLevelMonitoring(); if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")?.state === "recording") { __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop(); } if (__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f")) { __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").ondataavailable = null; } if (__classPrivateFieldGet(this, _MediaController_mediaStream, "f")) { __classPrivateFieldGet(this, _MediaController_mediaStream, "f").getTracks().forEach((track) => { track.stop(); }); __classPrivateFieldSet(this, _MediaController_mediaStream, null, "f"); } if (__classPrivateFieldGet(this, _MediaController_audioContext, "f") && __classPrivateFieldGet(this, _MediaController_audioContext, "f").state !== "closed") { await __classPrivateFieldGet(this, _MediaController_audioContext, "f").close(); } __classPrivateFieldSet(this, _MediaController_audioContext, null, "f"); __classPrivateFieldSet(this, _MediaController_analyser, null, "f"); __classPrivateFieldSet(this, _MediaController_mediaRecorder, null, "f"); __classPrivateFieldSet(this, _MediaController_onTrackEnded, undefined, "f"); __classPrivateFieldSet(this, _MediaController_onAudioLevelChange, undefined, "f"); __classPrivateFieldSet(this, _MediaController_dataHandler, undefined, "f"); } /** * Stops the media recorder and waits for all buffered data to be flushed. * This ensures the final ondataavailable event fires before resolving. */ async stopRecording() { return new Promise((resolve) => { if (!__classPrivateFieldGet(this, _MediaController_mediaRecorder, "f") || __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").state !== "recording") { resolve(); return; } __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").onstop = () => { resolve(); }; __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f").stop(); }); } get mediaRecorder() { return __classPrivateFieldGet(this, _MediaController_mediaRecorder, "f"); } get audioLevel() { return __classPrivateFieldGet(this, _MediaController_audioLevel, "f"); } } _MediaController_mediaStream = new WeakMap(), _MediaController_audioContext = new WeakMap(), _MediaController_analyser = new WeakMap(), _MediaController_mediaRecorder = new WeakMap(), _MediaController_visualiserInterval = new WeakMap(), _MediaController_audioLevel = new WeakMap(), _MediaController_onTrackEnded = new WeakMap(), _MediaController_onAudioLevelChange = new WeakMap(), _MediaController_dataHandler = new WeakMap(); //# sourceMappingURL=media-controller.js.map