speaker-calibration 2.2.268 → 2.2.269
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/example/i18n.js +6144 -5199
- package/dist/listener.js +1 -1
- package/dist/main.js +1 -1
- package/dist/phonePeer.js +2 -2
- package/package.json +1 -1
- package/src/listener-app/PhonePeer.js +19 -14
- package/src/peer-connection/speaker.js +11 -1
package/dist/main.js
CHANGED
|
@@ -125,7 +125,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
125
125
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
126
126
|
|
|
127
127
|
"use strict";
|
|
128
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var qrcode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! qrcode */ \"./node_modules/qrcode/lib/browser.js\");\n/* harmony import */ var _audioPeer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./audioPeer */ \"./src/peer-connection/audioPeer.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _peerErrors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./peerErrors */ \"./src/peer-connection/peerErrors.js\");\nvar _Speaker;\n\n\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n\n\n\n\n\n//import {phrases} from '../../dist/example/i18n';\n\n/**\r\n * @class Handles the speaker's side of the connection. Responsible for calibration process\r\n * and communication with the listener.\r\n * @augments AudioPeer\r\n */\nvar _showQRCode = /*#__PURE__*/new WeakMap();\nvar _showSpinner = /*#__PURE__*/new WeakMap();\nvar _removeUIElems = /*#__PURE__*/new WeakMap();\nvar _onPeerOpen = /*#__PURE__*/new WeakMap();\nvar _onPeerConnection = /*#__PURE__*/new WeakMap();\nvar _onPeerDisconnected = /*#__PURE__*/new WeakMap();\nvar _onPeerError = /*#__PURE__*/new WeakMap();\nvar _onIncomingData = /*#__PURE__*/new WeakMap();\nvar _ready = /*#__PURE__*/new WeakMap();\nclass Speaker extends _audioPeer__WEBPACK_IMPORTED_MODULE_3__[\"default\"] {\n /**\r\n * Takes the parameters for calibration and a connection manager instance.\r\n *\r\n * @param params - See type definition for initParameters.\r\n * @param CalibratorInstance - An instance of the AudioCalibrator class\r\n * @param connectionManager - An instance of the ConnectionManager class\r\n */\n constructor(params, CalibratorInstance) {\n var _params$language, _params$debug, _params$isSmartPhone, _params$calibrateSoun, _params$calibrateSoun2, _params$instructionDi, _params$soundSubtitle, _params$timeToCalibra, _params$soundMessageI, _params$titleDisplayI, _params$timeToCalibra2, _params$isParticipant, _params$isLoudspeaker, _params$micrpohoneIdF, _params$buttonsContai, _params$phrases, _params$calibrateSoun3;\n let connectionManager = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n super(params);\n _defineProperty(this, \"uri\", '');\n _defineProperty(this, \"qrImage\", void 0);\n _defineProperty(this, \"shortURL\", void 0);\n /**\r\n * Called after the peer conncection has been opened.\r\n * Generates a QR code for the connection and displays it.\r\n *\r\n * @private\r\n * @example\r\n */\n\n _classPrivateFieldInitSpec(this, _showQRCode, async () => {\n const queryStringParameters = {\n speakerPeerId: this.peer.id,\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n };\n const queryString = this.queryStringFromObject(queryStringParameters);\n this.uri = this.siteUrl + queryString;\n if (this.isSmartPhone) {\n // Generate QR code\n const qrCanvas = document.createElement('canvas');\n qrCanvas.setAttribute('id', 'qrCanvas');\n qrcode__WEBPACK_IMPORTED_MODULE_2__.toCanvas(qrCanvas, this.uri, error => {\n if (error) console.error(error);\n });\n\n // Create QR image\n const qrImage = new Image();\n qrImage.setAttribute('id', 'compatibilityCheckQRImage');\n qrImage.style.zIndex = Infinity;\n qrImage.style.height = '150px';\n qrImage.style.width = '150px';\n qrImage.style.margin = '-10px';\n qrImage.style.aspectRatio = 1;\n qrImage.src = qrCanvas.toDataURL();\n this.qrImage = qrImage;\n\n // Get shortened URL\n let shortURL = this.uri;\n try {\n const response = await fetch('https://api.short.io/links/public', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: 'pk_fysLKGj3legZz4XZ'\n },\n body: JSON.stringify({\n domain: 'listeners.link',\n originalURL: this.uri\n })\n });\n if (!response.ok) {\n throw new Error(\"HTTP error! Status: \".concat(response.status));\n }\n const data = await response.json();\n shortURL = data.shortURL;\n } catch (error) {\n console.error('Error:', error.message);\n }\n\n // Main container with 3 columns\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.alignItems = 'flex-start';\n container.style.paddingTop = '0';\n container.id = 'skipQRContainer';\n\n // Column 1: QR Code\n const qrColumn = document.createElement('div');\n qrColumn.style.flex = '0 0 auto';\n qrColumn.appendChild(qrImage);\n\n // Column 2: Explanation Text\n const textColumn = document.createElement('div');\n textColumn.style.flex = '1';\n textColumn.style.padding = '0 20px';\n textColumn.style.maxWidth = '560px';\n const explanation = document.createElement('h2');\n explanation.style.fontSize = '1.1rem';\n explanation.id = 'skipQRExplanation';\n explanation.style.margin = '0';\n explanation.style.textAlign = 'left';\n explanation.style.lineHeight = '1.5';\n explanation.innerHTML = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.formatLineBreak)(this.phrases.RC_skipQR_ExplanationWithoutPreferNot[this.language].replace('[[xxx]]', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")).replace('[[XXX]]', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")), this.phrases.RC_checkInternetConnection[this.language]);\n const language = this.language;\n const phrases = this.phrases;\n const checkConnection = document.createElement('a');\n checkConnection.id = 'check-connection';\n checkConnection.href = '#';\n checkConnection.innerHTML = \"check the phone's internet connection\";\n checkConnection.addEventListener('click', function (event) {\n event.preventDefault();\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.createAndShowPopup)(language, phrases);\n });\n explanation.querySelector('a#check-connection').replaceWith(checkConnection);\n textColumn.appendChild(explanation);\n\n // Column 3: Buttons\n const buttonColumn = document.createElement('div');\n buttonColumn.style.display = 'flex';\n buttonColumn.style.flexDirection = 'column';\n buttonColumn.style.gap = '10px';\n buttonColumn.style.flex = '0 0 auto';\n buttonColumn.style.alignItems = 'flex-end';\n buttonColumn.appendChild(this.buttonsContainer);\n\n // Assemble the columns\n container.appendChild(qrColumn);\n container.appendChild(textColumn);\n container.appendChild(buttonColumn);\n document.getElementById(this.targetElement).appendChild(container);\n } else {\n // show the link to the user\n // If specified HTML Id is available, show QR code there\n if (document.getElementById(this.targetElement)) {\n // const linkTag = document.createElement('a');\n // linkTag.setAttribute('href', uri);\n // linkTag.innerHTML = 'Click here to start the calibration';\n // linkTag.target = '_blank';\n // document.getElementById(this.targetElement).appendChild(linkTag);\n // document.getElementById(this.targetElement).appendChild(qrCanvas);\n\n const proceedButton = document.createElement('button');\n proceedButton.setAttribute('id', 'calibrationProceedButton');\n proceedButton.setAttribute('class', 'btn btn-success');\n proceedButton.innerHTML = this.phrases.T_proceed[this.language];\n proceedButton.onclick = () => {\n // open the link in a new tab\n window.open(this.uri, '_blank');\n // remove the button\n document.getElementById('calibrationProceedButton').remove();\n };\n document.getElementById(this.targetElement).appendChild(proceedButton);\n }\n }\n // or just print it to console\n console.log('TEST: Peer reachable at: ', this.uri);\n });\n _classPrivateFieldInitSpec(this, _showSpinner, () => {\n const spinner = document.createElement('div');\n spinner.className = 'spinner-border ml-auto';\n spinner.role = 'status';\n spinner.ariaHidden = 'true';\n spinner.style.marginTop = '0.8rem';\n document.getElementById(this.targetElement).appendChild(spinner);\n\n // clear instructionDisplay\n const soundMessage = document.getElementById(this.soundMessageId);\n soundMessage.innerHTML = '';\n soundMessage.style.display = 'none';\n const instructionDisplay = document.getElementById(this.instructionDisplayId);\n const background = document.getElementById('background'); // todo: get background id from params\n const subtitle = document.getElementById(this.soundSubtitleId);\n if (subtitle) {\n subtitle.innerHTML = '';\n }\n if (instructionDisplay) {\n instructionDisplay.innerHTML = '';\n instructionDisplay.style.whiteSpace = 'nowrap';\n instructionDisplay.style.fontWeight = 'bold';\n instructionDisplay.style.width = 'fit-content';\n instructionDisplay.innerHTML = this.phrases.RC_soundRecording[this.language];\n let fontSize = 100;\n instructionDisplay.style.fontSize = fontSize + 'px';\n while (instructionDisplay.scrollWidth > background.scrollWidth * 0.9 && fontSize > 10) {\n fontSize--;\n instructionDisplay.style.fontSize = fontSize + 'px';\n }\n // const p = document.createElement('p');\n // // font size\n // p.style.fontSize = '1.1rem';\n // p.style.fontWeight = 'normal';\n // p.style.paddingTop = '20px';\n // const timeToCalibrateText = phrases.RC_howLongToCalibrate['en-US'];\n // p.innerHTML = timeToCalibrateText.replace('[[N11]]', this.timeToCalibrate);\n // instructionDisplay.appendChild(p);\n }\n const timeToCalibrateDisplay = document.getElementById(this.timeToCalibrateDisplay);\n if (timeToCalibrateDisplay) {\n const timeToCalibrateText = this.phrases.RC_howLongToCalibrate[this.language];\n timeToCalibrateDisplay.innerHTML = timeToCalibrateText.replace('[[N11]]', this.timeToCalibrate);\n timeToCalibrateDisplay.style.fontWeight = 'normal';\n timeToCalibrateDisplay.style.fontSize = '1rem';\n // timeToCalibrateDisplay.style.paddingTop = '20px';\n }\n\n // Update title - titleDisplayId\n const titleDisplay = document.getElementById(this.titleDisplayId);\n if (titleDisplay) {\n // if (this.isParticipant) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n // } else if (this.isSmartPhone) {\n // if (this.isLoudspeakerCalibration) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n if (this.isLoudspeakerCalibration) {\n if (this.isParticipant) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n } else if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('4', '5');\n }\n } else {\n if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n }\n }\n }\n });\n _classPrivateFieldInitSpec(this, _removeUIElems, () => {\n const parent = document.getElementById(this.targetElement);\n while (parent.firstChild) {\n parent.firstChild.remove();\n }\n });\n /**\r\n * Called when the peer connection is opened.\r\n * Saves the peer id and calls the QR code generator.\r\n *\r\n * @param peerId - The peer id of the peer connection.\r\n * @param id\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerOpen, id => {\n // Workaround for peer.reconnect deleting previous id\n try {\n if (id === null) {\n console.error('Received null id from peer open');\n this.peer.id = this.lastPeerId;\n } else {\n this.lastPeerId = this.peer.id;\n }\n if (id !== this.peer.id) {\n console.warn('DEBUG Check you assumption that id === this.peer.id');\n }\n } catch (error) {\n console.error('Error in #onPeerOpen: ', error);\n }\n _classPrivateFieldGet(_showQRCode, this).call(this);\n });\n /**\r\n * Called when the peer connection is established.\r\n * Enforces a single connection.\r\n *\r\n * @param connection - The connection object.\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerConnection, connection => {\n // Allow only a single connection\n if (this.conn && this.conn.open) {\n connection.on('open', () => {\n connection.send('Already connected to another client');\n setTimeout(() => {\n connection.close();\n }, 500);\n });\n return;\n }\n this.conn = connection;\n console.log('Connected to: ', this.conn.peer);\n _classPrivateFieldGet(_ready, this).call(this);\n });\n /**\r\n * Called when the peer connection is closed.\r\n *\r\n * @private\r\n * @example\r\n */\n _defineProperty(this, \"onPeerClose\", () => {\n this.conn = null;\n console.log('Connection destroyed');\n });\n /**\r\n * Called when the peer connection is disconnected.\r\n * Attempts to reconnect.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerDisconnected, () => {\n console.log('Connection lost. Please reconnect');\n try {\n // Workaround for peer.reconnect deleting previous id\n this.peer.id = this.lastPeerId;\n // eslint-disable-next-line no-underscore-dangle\n this.peer._lastServerId = this.lastPeerId;\n this.peer.reconnect();\n } catch (error) {\n console.error('Error in #onPeerDisconnected: ', error);\n }\n });\n /**\r\n * Called when the peer connection encounters an error.\r\n *\r\n * @param error\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerError, error => {\n // TODO: check if this function is needed or not\n console.error(error);\n });\n /**\r\n * Called when data is received from the peer connection.\r\n *\r\n * @param data\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onIncomingData, data => {\n // enforce object type\n if (!Object.prototype.hasOwnProperty.call(data, 'name') || !Object.prototype.hasOwnProperty.call(data, 'payload')) {\n console.error('Received malformed data: ', data);\n return;\n }\n const name = data.payload.name;\n const payload = data.payload.payload;\n switch (name) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', payload);\n if (!payload) {\n window.speaker.ac.setSamplingRates(window.speaker.calibrateSoundHz);\n } else {\n window.speaker.ac.setSamplingRates(payload);\n }\n break;\n case 'sampleSize':\n window.speaker.ac.setSampleSize(payload);\n break;\n case 'deviceType':\n window.speaker.ac.setDeviceType(payload);\n break;\n case 'deviceName':\n window.speaker.ac.setDeviceName(payload);\n break;\n case 'flags':\n //this.ac.setDeviceName(data.payload);\n console.log('FLAGS');\n console.log(payload);\n window.speaker.ac.setFlags(payload);\n break;\n case 'deviceInfo':\n window.speaker.ac.setDeviceInfo(payload);\n console.log('Received device info from listener: ', payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', payload);\n if (payload.type === 'error') {\n this.permissionStatus = 'error';\n window.speaker.ac.setPermissionStatus('error');\n } else if (payload.type === 'denied') {\n this.permissionStatus = 'denied';\n window.speaker.ac.setPermissionStatus('denied');\n } else if (payload.type === 'granted') {\n this.permissionStatus = 'granted';\n window.speaker.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.MissingSpeakerIdError.name:\n throw payload;\n break;\n default:\n break;\n }\n });\n /**\r\n * Called when the peer connection is #ready.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _ready, () => {\n // Perform callback with data\n this.conn.on('data', _classPrivateFieldGet(_onIncomingData, this));\n this.conn.on('close', () => {\n console.log('Connection reset<br>Awaiting connection...');\n this.conn = null;\n });\n });\n /** .\r\n * .\r\n * .\r\n * Debug method for downloading the recorded audio\r\n *\r\n * @public\r\n * @example\r\n */\n _defineProperty(this, \"downloadData\", () => {\n this.ac.downloadData();\n });\n this.language = (_params$language = params === null || params === void 0 ? void 0 : params.language) !== null && _params$language !== void 0 ? _params$language : 'en-US';\n this.siteUrl += '/listener?';\n // this.ac = CalibratorInstance;\n this.result = null;\n this.debug = (_params$debug = params === null || params === void 0 ? void 0 : params.debug) !== null && _params$debug !== void 0 ? _params$debug : false;\n this.isSmartPhone = (_params$isSmartPhone = params === null || params === void 0 ? void 0 : params.isSmartPhone) !== null && _params$isSmartPhone !== void 0 ? _params$isSmartPhone : false;\n this.calibrateSoundHz = (_params$calibrateSoun = params === null || params === void 0 ? void 0 : params.calibrateSoundHz) !== null && _params$calibrateSoun !== void 0 ? _params$calibrateSoun : 48000;\n this.calibrateSoundSamplingDesiredBits = (_params$calibrateSoun2 = params === null || params === void 0 ? void 0 : params.calibrateSoundSamplingDesiredBits) !== null && _params$calibrateSoun2 !== void 0 ? _params$calibrateSoun2 : 24;\n this.instructionDisplayId = (_params$instructionDi = params === null || params === void 0 ? void 0 : params.instructionDisplayId) !== null && _params$instructionDi !== void 0 ? _params$instructionDi : '';\n this.soundSubtitleId = (_params$soundSubtitle = params === null || params === void 0 ? void 0 : params.soundSubtitleId) !== null && _params$soundSubtitle !== void 0 ? _params$soundSubtitle : '';\n this.timeToCalibrateDisplay = (_params$timeToCalibra = params === null || params === void 0 ? void 0 : params.timeToCalibrateId) !== null && _params$timeToCalibra !== void 0 ? _params$timeToCalibra : '';\n this.soundMessageId = (_params$soundMessageI = params === null || params === void 0 ? void 0 : params.soundMessageId) !== null && _params$soundMessageI !== void 0 ? _params$soundMessageI : '';\n this.titleDisplayId = (_params$titleDisplayI = params === null || params === void 0 ? void 0 : params.titleDisplayId) !== null && _params$titleDisplayI !== void 0 ? _params$titleDisplayI : '';\n this.timeToCalibrate = (_params$timeToCalibra2 = params === null || params === void 0 ? void 0 : params.timeToCalibrate) !== null && _params$timeToCalibra2 !== void 0 ? _params$timeToCalibra2 : 10;\n this.isParticipant = (_params$isParticipant = params === null || params === void 0 ? void 0 : params.isParticipant) !== null && _params$isParticipant !== void 0 ? _params$isParticipant : false;\n this.isLoudspeakerCalibration = (_params$isLoudspeaker = params === null || params === void 0 ? void 0 : params.isLoudspeakerCalibration) !== null && _params$isLoudspeaker !== void 0 ? _params$isLoudspeaker : false;\n this.deviceId = (_params$micrpohoneIdF = params === null || params === void 0 ? void 0 : params.micrpohoneIdFromWebAudioApi) !== null && _params$micrpohoneIdF !== void 0 ? _params$micrpohoneIdF : '';\n this.buttonsContainer = (_params$buttonsContai = params === null || params === void 0 ? void 0 : params.buttonsContainer) !== null && _params$buttonsContai !== void 0 ? _params$buttonsContai : document.createElement('div');\n this.phrases = (_params$phrases = params === null || params === void 0 ? void 0 : params.phrases) !== null && _params$phrases !== void 0 ? _params$phrases : {};\n this.permissionStatus = 'pending';\n this.calibrateSoundHz = (_params$calibrateSoun3 = params === null || params === void 0 ? void 0 : params.calibrateSoundHz) !== null && _params$calibrateSoun3 !== void 0 ? _params$calibrateSoun3 : 48000;\n this.name = 'SoundCalibration'; // Name used for submodule registration\n this.connectionManager = connectionManager;\n\n // Register with connection manager if provided\n if (this.connectionManager) {\n this.connectionManager.registerSubmodule(this);\n }\n }\n // Required method for submodule interface\n onMessage(data, connectionManager) {\n if (!data || !data.name && !data.type) {\n console.error('Received malformed data: ', data);\n return;\n }\n\n // Convert type to name if needed for backward compatibility\n const messageName = data.payload.name;\n const payload = data.payload.payload;\n switch (messageName) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', payload);\n if (!payload) {\n window.speaker.ac.setSamplingRates(window.speaker.calibrateSoundHz);\n } else {\n window.speaker.ac.setSamplingRates(payload);\n }\n break;\n case 'sampleSize':\n window.speaker.ac.setSampleSize(payload);\n break;\n case 'deviceType':\n window.speaker.ac.setDeviceType(payload);\n break;\n case 'deviceName':\n window.speaker.ac.setDeviceName(payload);\n break;\n case 'flags':\n console.log('FLAGS');\n console.log(payload);\n window.speaker.ac.setFlags(payload);\n break;\n case 'deviceInfo':\n window.speaker.ac.setDeviceInfo(payload);\n console.log('Received device info from listener: ', payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', payload);\n if (payload.type === 'error') {\n this.permissionStatus = 'error';\n window.speaker.ac.setPermissionStatus('error');\n } else if (payload.type === 'denied') {\n this.permissionStatus = 'denied';\n window.speaker.ac.setPermissionStatus('denied');\n } else if (payload.type === 'granted') {\n this.permissionStatus = 'granted';\n window.speaker.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.MissingSpeakerIdError.name:\n throw payload;\n default:\n break;\n }\n }\n\n /**\r\n * Prepares the parameters to send to the listener\r\n * @returns {Object} Parameters for the listener\r\n */\n prepareConnectionParams() {\n var _this$connectionManag;\n const params = {\n type: 'SoundCalibration',\n name: 'SoundCalibration',\n message: 'connectionParams',\n payload: {\n speakerPeerId: (_this$connectionManag = this.connectionManager) === null || _this$connectionManag === void 0 ? void 0 : _this$connectionManag.getPeerID(),\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n }\n };\n console.log('prepareConnectionParams', params);\n return params;\n }\n\n //no need to connect to the listener, just simulate the calibration\n}\n\n/* \r\nReferenced links:\r\nhttps://stackoverflow.com/questions/28016664/when-you-pass-this-as-an-argument/28016676#28016676\r\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\r\nhttps://stackoverflow.com/questions/879152/how-do-i-make-javascript-beep [3]\r\n*/\n_Speaker = Speaker;\n_defineProperty(Speaker, \"simulateCalibration\", async function (params, CalibratorInstance, connectionManager) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n speaker.ac = CalibratorInstance;\n //set sampling rates\n speaker.ac.setSamplingRates(speaker.calibrateSoundHz);\n speaker.ac.setSampleSize(speaker.calibrateSoundSamplingDesiredBits);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.result = await speaker.ac.startCalibration(null, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n return speaker.result;\n});\n/**\r\n * Async factory method that creates the Speaker object, and returns a promise that resolves to the result of the calibration.\r\n *\r\n * @param params - The parameters to be passed to the peer object.\r\n * @param CalibratorInstance - The class that defines the calibration process.\r\n * @param connectionManager - Instance of the ConnectionManager\r\n * @param timeOut - The amount of time to wait before timing out the connection (in milliseconds).\r\n * @public\r\n */\n_defineProperty(Speaker, \"startCalibration\", async function (params, CalibratorInstance, connectionManager) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n // Create a speaker instance and register with the connection manager\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n speaker.ac = CalibratorInstance;\n await speaker.connectionManager.waitForPeerConnection();\n await speaker.connectionManager.resolveWhenHandshakeReceived();\n speaker.connectionManager.sendPageTitle('EasyEyes Microphone');\n speaker.connectionManager.send({\n name: 'CompatibilityPeer',\n message: 'Text',\n text: 'Loading...'\n });\n speaker.connectionManager.send({\n name: 'SoundCalibration',\n message: 'phrases',\n payload: speaker.phrases\n });\n\n // Send connection parameters to the listener\n speaker.connectionManager.send(speaker.prepareConnectionParams());\n\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (speaker.permissionStatus === 'error' || speaker.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve('permission denied');\n }\n }, 100);\n console.log('Setting up call handler on the peer');\n // Set up call handler on the peer\n speaker.connectionManager.peer.on('call', async call => {\n console.log('Received call from listener');\n clearInterval(permissionCheckInterval); // Clear interval when call is received\n\n // Answer the call\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_4__.sleep)(1);\n }\n if (params.displayUpdate) {\n params.displayUpdate.style.display = '';\n }\n\n // resolve when we have a result\n speaker.result = await speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n //remove the call\n speaker.connectionManager.peer.off('call');\n resolve(speaker.result);\n });\n\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n clearInterval(permissionCheckInterval);\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_5__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n console.log('Call handler set up', speaker.connectionManager.peer);\n });\n});\n_defineProperty(Speaker, \"testIIR\", async function (params, CalibratorInstance, IIR, connectionManager) {\n let timeOut = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n\n // Set QR code parameters\n connectionManager.setQueryParams(speaker.prepareQRParams());\n\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // when a call is received\n connectionManager.peer.on('call', async call => {\n // Answer the call (one way)\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_4__.sleep)(1);\n }\n // resolve when we have a result\n speaker.result = await speaker.ac.playMLSwithIIR(stream, IIR);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_5__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"closeConnection\", () => {\n _Speaker.conn = null;\n console.log('Connection destroyed');\n});\n_defineProperty(Speaker, \"repeatCalibration\", async (params, stream, CalibratorInstance) => {\n var _window$speaker, _window$speaker2;\n window.speaker.ac = CalibratorInstance;\n _classPrivateFieldGet(_removeUIElems, _window$speaker = window.speaker).call(_window$speaker);\n _classPrivateFieldGet(_showSpinner, _window$speaker2 = window.speaker).call(_window$speaker2);\n console.log('This is a repeat');\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (window.speaker.permissionStatus === 'error' || window.speaker.permissionStatus === 'denied') {\n var _window$speaker3;\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, _window$speaker3 = window.speaker).call(_window$speaker3);\n resolve('permission denied');\n }\n }, 100);\n\n // Start calibration process\n (async () => {\n try {\n var _window$speaker4;\n const result = await window.speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, _window$speaker4 = window.speaker).call(_window$speaker4);\n resolve(result);\n } catch (error) {\n clearInterval(permissionCheckInterval);\n reject(error);\n }\n })();\n });\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Speaker);\n\n//# sourceURL=webpack://speakerCalibrator/./src/peer-connection/speaker.js?");
|
|
128
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! core-js/modules/es.string.replace.js */ \"./node_modules/core-js/modules/es.string.replace.js\");\n/* harmony import */ var core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es_string_replace_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! core-js/modules/web.dom-collections.iterator.js */ \"./node_modules/core-js/modules/web.dom-collections.iterator.js\");\n/* harmony import */ var core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_collections_iterator_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var qrcode__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! qrcode */ \"./node_modules/qrcode/lib/browser.js\");\n/* harmony import */ var _audioPeer__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./audioPeer */ \"./src/peer-connection/audioPeer.js\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"./src/utils.js\");\n/* harmony import */ var _peerErrors__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./peerErrors */ \"./src/peer-connection/peerErrors.js\");\nvar _Speaker;\n\n\nfunction _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }\nfunction _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError(\"Cannot initialize the same private elements twice on an object\"); }\nfunction _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == typeof i ? i : i + \"\"; }\nfunction _toPrimitive(t, r) { if (\"object\" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != typeof i) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }\nfunction _assertClassBrand(e, t, n) { if (\"function\" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError(\"Private element is not present on this object\"); }\n\n\n\n\n\n\n//import {phrases} from '../../dist/example/i18n';\n\n/**\r\n * @class Handles the speaker's side of the connection. Responsible for calibration process\r\n * and communication with the listener.\r\n * @augments AudioPeer\r\n */\nvar _showQRCode = /*#__PURE__*/new WeakMap();\nvar _showSpinner = /*#__PURE__*/new WeakMap();\nvar _removeUIElems = /*#__PURE__*/new WeakMap();\nvar _onPeerOpen = /*#__PURE__*/new WeakMap();\nvar _onPeerConnection = /*#__PURE__*/new WeakMap();\nvar _onPeerDisconnected = /*#__PURE__*/new WeakMap();\nvar _onPeerError = /*#__PURE__*/new WeakMap();\nvar _onIncomingData = /*#__PURE__*/new WeakMap();\nvar _ready = /*#__PURE__*/new WeakMap();\nclass Speaker extends _audioPeer__WEBPACK_IMPORTED_MODULE_3__[\"default\"] {\n /**\r\n * Takes the parameters for calibration and a connection manager instance.\r\n *\r\n * @param params - See type definition for initParameters.\r\n * @param CalibratorInstance - An instance of the AudioCalibrator class\r\n * @param connectionManager - An instance of the ConnectionManager class\r\n */\n constructor(params, CalibratorInstance) {\n var _params$language, _params$debug, _params$isSmartPhone, _params$calibrateSoun, _params$calibrateSoun2, _params$instructionDi, _params$soundSubtitle, _params$timeToCalibra, _params$soundMessageI, _params$titleDisplayI, _params$timeToCalibra2, _params$isParticipant, _params$isLoudspeaker, _params$micrpohoneIdF, _params$buttonsContai, _params$phrases, _params$calibrateSoun3;\n let connectionManager = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n super(params);\n _defineProperty(this, \"uri\", '');\n _defineProperty(this, \"qrImage\", void 0);\n _defineProperty(this, \"shortURL\", void 0);\n /**\r\n * Called after the peer conncection has been opened.\r\n * Generates a QR code for the connection and displays it.\r\n *\r\n * @private\r\n * @example\r\n */\n\n _classPrivateFieldInitSpec(this, _showQRCode, async () => {\n const queryStringParameters = {\n speakerPeerId: this.peer.id,\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n };\n const queryString = this.queryStringFromObject(queryStringParameters);\n this.uri = this.siteUrl + queryString;\n if (this.isSmartPhone) {\n // Generate QR code\n const qrCanvas = document.createElement('canvas');\n qrCanvas.setAttribute('id', 'qrCanvas');\n qrcode__WEBPACK_IMPORTED_MODULE_2__.toCanvas(qrCanvas, this.uri, error => {\n if (error) console.error(error);\n });\n\n // Create QR image\n const qrImage = new Image();\n qrImage.setAttribute('id', 'compatibilityCheckQRImage');\n qrImage.style.zIndex = Infinity;\n qrImage.style.height = '150px';\n qrImage.style.width = '150px';\n qrImage.style.margin = '-10px';\n qrImage.style.aspectRatio = 1;\n qrImage.src = qrCanvas.toDataURL();\n this.qrImage = qrImage;\n\n // Get shortened URL\n let shortURL = this.uri;\n try {\n const response = await fetch('https://api.short.io/links/public', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: 'pk_fysLKGj3legZz4XZ'\n },\n body: JSON.stringify({\n domain: 'listeners.link',\n originalURL: this.uri\n })\n });\n if (!response.ok) {\n throw new Error(\"HTTP error! Status: \".concat(response.status));\n }\n const data = await response.json();\n shortURL = data.shortURL;\n } catch (error) {\n console.error('Error:', error.message);\n }\n\n // Main container with 3 columns\n const container = document.createElement('div');\n container.style.display = 'flex';\n container.style.alignItems = 'flex-start';\n container.style.paddingTop = '0';\n container.id = 'skipQRContainer';\n\n // Column 1: QR Code\n const qrColumn = document.createElement('div');\n qrColumn.style.flex = '0 0 auto';\n qrColumn.appendChild(qrImage);\n\n // Column 2: Explanation Text\n const textColumn = document.createElement('div');\n textColumn.style.flex = '1';\n textColumn.style.padding = '0 20px';\n textColumn.style.maxWidth = '560px';\n const explanation = document.createElement('h2');\n explanation.style.fontSize = '1.1rem';\n explanation.id = 'skipQRExplanation';\n explanation.style.margin = '0';\n explanation.style.textAlign = 'left';\n explanation.style.lineHeight = '1.5';\n explanation.innerHTML = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.formatLineBreak)(this.phrases.RC_skipQR_ExplanationWithoutPreferNot[this.language].replace('[[xxx]]', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")).replace('[[XXX]]', \"<b style=\\\"user-select: text\\\">\".concat(shortURL, \"</b>\")), this.phrases.RC_checkInternetConnection[this.language]);\n const language = this.language;\n const phrases = this.phrases;\n const checkConnection = document.createElement('a');\n checkConnection.id = 'check-connection';\n checkConnection.href = '#';\n checkConnection.innerHTML = \"check the phone's internet connection\";\n checkConnection.addEventListener('click', function (event) {\n event.preventDefault();\n (0,_utils__WEBPACK_IMPORTED_MODULE_4__.createAndShowPopup)(language, phrases);\n });\n explanation.querySelector('a#check-connection').replaceWith(checkConnection);\n textColumn.appendChild(explanation);\n\n // Column 3: Buttons\n const buttonColumn = document.createElement('div');\n buttonColumn.style.display = 'flex';\n buttonColumn.style.flexDirection = 'column';\n buttonColumn.style.gap = '10px';\n buttonColumn.style.flex = '0 0 auto';\n buttonColumn.style.alignItems = 'flex-end';\n buttonColumn.appendChild(this.buttonsContainer);\n\n // Assemble the columns\n container.appendChild(qrColumn);\n container.appendChild(textColumn);\n container.appendChild(buttonColumn);\n document.getElementById(this.targetElement).appendChild(container);\n } else {\n // show the link to the user\n // If specified HTML Id is available, show QR code there\n if (document.getElementById(this.targetElement)) {\n // const linkTag = document.createElement('a');\n // linkTag.setAttribute('href', uri);\n // linkTag.innerHTML = 'Click here to start the calibration';\n // linkTag.target = '_blank';\n // document.getElementById(this.targetElement).appendChild(linkTag);\n // document.getElementById(this.targetElement).appendChild(qrCanvas);\n\n const proceedButton = document.createElement('button');\n proceedButton.setAttribute('id', 'calibrationProceedButton');\n proceedButton.setAttribute('class', 'btn btn-success');\n proceedButton.innerHTML = this.phrases.T_proceed[this.language];\n proceedButton.onclick = () => {\n // open the link in a new tab\n window.open(this.uri, '_blank');\n // remove the button\n document.getElementById('calibrationProceedButton').remove();\n };\n document.getElementById(this.targetElement).appendChild(proceedButton);\n }\n }\n // or just print it to console\n console.log('TEST: Peer reachable at: ', this.uri);\n });\n _classPrivateFieldInitSpec(this, _showSpinner, () => {\n const spinner = document.createElement('div');\n spinner.className = 'spinner-border ml-auto';\n spinner.role = 'status';\n spinner.ariaHidden = 'true';\n spinner.style.marginTop = '0.8rem';\n document.getElementById(this.targetElement).appendChild(spinner);\n\n // clear instructionDisplay\n const soundMessage = document.getElementById(this.soundMessageId);\n soundMessage.innerHTML = '';\n soundMessage.style.display = 'none';\n const instructionDisplay = document.getElementById(this.instructionDisplayId);\n const background = document.getElementById('background'); // todo: get background id from params\n const subtitle = document.getElementById(this.soundSubtitleId);\n if (subtitle) {\n subtitle.innerHTML = '';\n }\n if (instructionDisplay) {\n instructionDisplay.innerHTML = '';\n instructionDisplay.style.whiteSpace = 'nowrap';\n instructionDisplay.style.fontWeight = 'bold';\n instructionDisplay.style.width = 'fit-content';\n instructionDisplay.innerHTML = this.phrases.RC_soundRecording[this.language];\n let fontSize = 100;\n instructionDisplay.style.fontSize = fontSize + 'px';\n while (instructionDisplay.scrollWidth > background.scrollWidth * 0.9 && fontSize > 10) {\n fontSize--;\n instructionDisplay.style.fontSize = fontSize + 'px';\n }\n // const p = document.createElement('p');\n // // font size\n // p.style.fontSize = '1.1rem';\n // p.style.fontWeight = 'normal';\n // p.style.paddingTop = '20px';\n // const timeToCalibrateText = phrases.RC_howLongToCalibrate['en-US'];\n // p.innerHTML = timeToCalibrateText.replace('[[N11]]', this.timeToCalibrate);\n // instructionDisplay.appendChild(p);\n }\n const timeToCalibrateDisplay = document.getElementById(this.timeToCalibrateDisplay);\n if (timeToCalibrateDisplay) {\n const timeToCalibrateText = this.phrases.RC_howLongToCalibrate[this.language];\n timeToCalibrateDisplay.innerHTML = timeToCalibrateText.replace('[[N11]]', this.timeToCalibrate);\n timeToCalibrateDisplay.style.fontWeight = 'normal';\n timeToCalibrateDisplay.style.fontSize = '1rem';\n // timeToCalibrateDisplay.style.paddingTop = '20px';\n }\n\n // Update title - titleDisplayId\n const titleDisplay = document.getElementById(this.titleDisplayId);\n if (titleDisplay) {\n // if (this.isParticipant) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n // } else if (this.isSmartPhone) {\n // if (this.isLoudspeakerCalibration) {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n // } else {\n // titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n // }\n if (this.isLoudspeakerCalibration) {\n if (this.isParticipant) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n } else if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('6', '7');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('4', '5');\n }\n } else {\n if (this.isSmartPhone) {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('5', '6');\n } else {\n titleDisplay.innerHTML = titleDisplay.innerHTML.replace('3', '4');\n }\n }\n }\n });\n _classPrivateFieldInitSpec(this, _removeUIElems, () => {\n const parent = document.getElementById(this.targetElement);\n while (parent.firstChild) {\n parent.firstChild.remove();\n }\n });\n /**\r\n * Called when the peer connection is opened.\r\n * Saves the peer id and calls the QR code generator.\r\n *\r\n * @param peerId - The peer id of the peer connection.\r\n * @param id\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerOpen, id => {\n // Workaround for peer.reconnect deleting previous id\n try {\n if (id === null) {\n console.error('Received null id from peer open');\n this.peer.id = this.lastPeerId;\n } else {\n this.lastPeerId = this.peer.id;\n }\n if (id !== this.peer.id) {\n console.warn('DEBUG Check you assumption that id === this.peer.id');\n }\n } catch (error) {\n console.error('Error in #onPeerOpen: ', error);\n }\n _classPrivateFieldGet(_showQRCode, this).call(this);\n });\n /**\r\n * Called when the peer connection is established.\r\n * Enforces a single connection.\r\n *\r\n * @param connection - The connection object.\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerConnection, connection => {\n // Allow only a single connection\n if (this.conn && this.conn.open) {\n connection.on('open', () => {\n connection.send('Already connected to another client');\n setTimeout(() => {\n connection.close();\n }, 500);\n });\n return;\n }\n this.conn = connection;\n console.log('Connected to: ', this.conn.peer);\n _classPrivateFieldGet(_ready, this).call(this);\n });\n /**\r\n * Called when the peer connection is closed.\r\n *\r\n * @private\r\n * @example\r\n */\n _defineProperty(this, \"onPeerClose\", () => {\n this.conn = null;\n console.log('Connection destroyed');\n });\n /**\r\n * Called when the peer connection is disconnected.\r\n * Attempts to reconnect.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerDisconnected, () => {\n console.log('Connection lost. Please reconnect');\n try {\n // Workaround for peer.reconnect deleting previous id\n this.peer.id = this.lastPeerId;\n // eslint-disable-next-line no-underscore-dangle\n this.peer._lastServerId = this.lastPeerId;\n this.peer.reconnect();\n } catch (error) {\n console.error('Error in #onPeerDisconnected: ', error);\n }\n });\n /**\r\n * Called when the peer connection encounters an error.\r\n *\r\n * @param error\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onPeerError, error => {\n // TODO: check if this function is needed or not\n console.error(error);\n });\n /**\r\n * Called when data is received from the peer connection.\r\n *\r\n * @param data\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _onIncomingData, data => {\n // enforce object type\n if (!Object.prototype.hasOwnProperty.call(data, 'name') || !Object.prototype.hasOwnProperty.call(data, 'payload')) {\n console.error('Received malformed data: ', data);\n return;\n }\n const name = data.payload.name;\n const payload = data.payload.payload;\n switch (name) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', payload);\n if (!payload) {\n window.speaker.ac.setSamplingRates(window.speaker.calibrateSoundHz);\n } else {\n window.speaker.ac.setSamplingRates(payload);\n }\n break;\n case 'sampleSize':\n window.speaker.ac.setSampleSize(payload);\n break;\n case 'deviceType':\n window.speaker.ac.setDeviceType(payload);\n break;\n case 'deviceName':\n window.speaker.ac.setDeviceName(payload);\n break;\n case 'flags':\n //this.ac.setDeviceName(data.payload);\n console.log('FLAGS');\n console.log(payload);\n window.speaker.ac.setFlags(payload);\n break;\n case 'deviceInfo':\n window.speaker.ac.setDeviceInfo(payload);\n console.log('Received device info from listener: ', payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', payload);\n if (payload.type === 'error') {\n this.permissionStatus = 'error';\n window.speaker.ac.setPermissionStatus('error');\n } else if (payload.type === 'denied') {\n this.permissionStatus = 'denied';\n window.speaker.ac.setPermissionStatus('denied');\n } else if (payload.type === 'granted') {\n this.permissionStatus = 'granted';\n window.speaker.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.MissingSpeakerIdError.name:\n throw payload;\n break;\n default:\n break;\n }\n });\n /**\r\n * Called when the peer connection is #ready.\r\n *\r\n * @private\r\n * @example\r\n */\n _classPrivateFieldInitSpec(this, _ready, () => {\n // Perform callback with data\n this.conn.on('data', _classPrivateFieldGet(_onIncomingData, this));\n this.conn.on('close', () => {\n console.log('Connection reset<br>Awaiting connection...');\n this.conn = null;\n });\n });\n /** .\r\n * .\r\n * .\r\n * Debug method for downloading the recorded audio\r\n *\r\n * @public\r\n * @example\r\n */\n _defineProperty(this, \"downloadData\", () => {\n this.ac.downloadData();\n });\n this.language = (_params$language = params === null || params === void 0 ? void 0 : params.language) !== null && _params$language !== void 0 ? _params$language : 'en-US';\n this.siteUrl += '/listener?';\n // this.ac = CalibratorInstance;\n this.result = null;\n this.debug = (_params$debug = params === null || params === void 0 ? void 0 : params.debug) !== null && _params$debug !== void 0 ? _params$debug : false;\n this.isSmartPhone = (_params$isSmartPhone = params === null || params === void 0 ? void 0 : params.isSmartPhone) !== null && _params$isSmartPhone !== void 0 ? _params$isSmartPhone : false;\n this.calibrateSoundHz = (_params$calibrateSoun = params === null || params === void 0 ? void 0 : params.calibrateSoundHz) !== null && _params$calibrateSoun !== void 0 ? _params$calibrateSoun : 48000;\n this.calibrateSoundSamplingDesiredBits = (_params$calibrateSoun2 = params === null || params === void 0 ? void 0 : params.calibrateSoundSamplingDesiredBits) !== null && _params$calibrateSoun2 !== void 0 ? _params$calibrateSoun2 : 24;\n this.instructionDisplayId = (_params$instructionDi = params === null || params === void 0 ? void 0 : params.instructionDisplayId) !== null && _params$instructionDi !== void 0 ? _params$instructionDi : '';\n this.soundSubtitleId = (_params$soundSubtitle = params === null || params === void 0 ? void 0 : params.soundSubtitleId) !== null && _params$soundSubtitle !== void 0 ? _params$soundSubtitle : '';\n this.timeToCalibrateDisplay = (_params$timeToCalibra = params === null || params === void 0 ? void 0 : params.timeToCalibrateId) !== null && _params$timeToCalibra !== void 0 ? _params$timeToCalibra : '';\n this.soundMessageId = (_params$soundMessageI = params === null || params === void 0 ? void 0 : params.soundMessageId) !== null && _params$soundMessageI !== void 0 ? _params$soundMessageI : '';\n this.titleDisplayId = (_params$titleDisplayI = params === null || params === void 0 ? void 0 : params.titleDisplayId) !== null && _params$titleDisplayI !== void 0 ? _params$titleDisplayI : '';\n this.timeToCalibrate = (_params$timeToCalibra2 = params === null || params === void 0 ? void 0 : params.timeToCalibrate) !== null && _params$timeToCalibra2 !== void 0 ? _params$timeToCalibra2 : 10;\n this.isParticipant = (_params$isParticipant = params === null || params === void 0 ? void 0 : params.isParticipant) !== null && _params$isParticipant !== void 0 ? _params$isParticipant : false;\n this.isLoudspeakerCalibration = (_params$isLoudspeaker = params === null || params === void 0 ? void 0 : params.isLoudspeakerCalibration) !== null && _params$isLoudspeaker !== void 0 ? _params$isLoudspeaker : false;\n this.deviceId = (_params$micrpohoneIdF = params === null || params === void 0 ? void 0 : params.micrpohoneIdFromWebAudioApi) !== null && _params$micrpohoneIdF !== void 0 ? _params$micrpohoneIdF : '';\n this.buttonsContainer = (_params$buttonsContai = params === null || params === void 0 ? void 0 : params.buttonsContainer) !== null && _params$buttonsContai !== void 0 ? _params$buttonsContai : document.createElement('div');\n this.phrases = (_params$phrases = params === null || params === void 0 ? void 0 : params.phrases) !== null && _params$phrases !== void 0 ? _params$phrases : {};\n this.permissionStatus = 'pending';\n this.calibrateSoundHz = (_params$calibrateSoun3 = params === null || params === void 0 ? void 0 : params.calibrateSoundHz) !== null && _params$calibrateSoun3 !== void 0 ? _params$calibrateSoun3 : 48000;\n this.name = 'SoundCalibration'; // Name used for submodule registration\n this.connectionManager = connectionManager;\n\n // Register with connection manager if provided\n if (this.connectionManager) {\n this.connectionManager.registerSubmodule(this);\n }\n }\n // Required method for submodule interface\n onMessage(data, connectionManager) {\n if (!data || !data.name && !data.type) {\n console.error('Received malformed data: ', data);\n return;\n }\n\n // Convert type to name if needed for backward compatibility\n const messageName = data.payload.name;\n const payload = data.payload.payload;\n switch (messageName) {\n case 'samplingRate':\n console.log('Received sampling rate from listener: ', payload);\n if (!payload) {\n window.speaker.ac.setSamplingRates(window.speaker.calibrateSoundHz);\n } else {\n window.speaker.ac.setSamplingRates(payload);\n }\n break;\n case 'sampleSize':\n window.speaker.ac.setSampleSize(payload);\n break;\n case 'deviceType':\n window.speaker.ac.setDeviceType(payload);\n break;\n case 'deviceName':\n window.speaker.ac.setDeviceName(payload);\n break;\n case 'flags':\n console.log('FLAGS');\n console.log(payload);\n window.speaker.ac.setFlags(payload);\n break;\n case 'deviceInfo':\n window.speaker.ac.setDeviceInfo(payload);\n console.log('Received device info from listener: ', payload);\n break;\n case 'permissionStatus':\n console.log('Received permission status from listener: ', payload);\n if (payload.type === 'error') {\n this.permissionStatus = 'error';\n window.speaker.ac.setPermissionStatus('error');\n } else if (payload.type === 'denied') {\n this.permissionStatus = 'denied';\n window.speaker.ac.setPermissionStatus('denied');\n } else if (payload.type === 'granted') {\n this.permissionStatus = 'granted';\n window.speaker.ac.setPermissionStatus('granted');\n console.log('Permission granted');\n }\n break;\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.UnsupportedDeviceError.name:\n case _peerErrors__WEBPACK_IMPORTED_MODULE_5__.MissingSpeakerIdError.name:\n throw payload;\n default:\n break;\n }\n }\n\n /**\r\n * Prepares the parameters to send to the listener\r\n * @returns {Object} Parameters for the listener\r\n */\n prepareConnectionParams() {\n var _this$connectionManag;\n const params = {\n type: 'SoundCalibration',\n name: 'SoundCalibration',\n message: 'connectionParams',\n payload: {\n speakerPeerId: (_this$connectionManag = this.connectionManager) === null || _this$connectionManag === void 0 ? void 0 : _this$connectionManag.getPeerID(),\n sp: this.isSmartPhone,\n hz: this.calibrateSoundHz,\n bits: this.calibrateSoundSamplingDesiredBits,\n lang: this.language,\n deviceId: this.deviceId\n }\n };\n console.log('prepareConnectionParams', params);\n return params;\n }\n\n //no need to connect to the listener, just simulate the calibration\n}\n\n/* \r\nReferenced links:\r\nhttps://stackoverflow.com/questions/28016664/when-you-pass-this-as-an-argument/28016676#28016676\r\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes\r\nhttps://stackoverflow.com/questions/879152/how-do-i-make-javascript-beep [3]\r\n*/\n_Speaker = Speaker;\n_defineProperty(Speaker, \"simulateCalibration\", async function (params, CalibratorInstance, connectionManager) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n speaker.ac = CalibratorInstance;\n //set sampling rates\n speaker.ac.setSamplingRates(speaker.calibrateSoundHz);\n speaker.ac.setSampleSize(speaker.calibrateSoundSamplingDesiredBits);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.result = await speaker.ac.startCalibration(null, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n return speaker.result;\n});\n/**\r\n * Async factory method that creates the Speaker object, and returns a promise that resolves to the result of the calibration.\r\n *\r\n * @param params - The parameters to be passed to the peer object.\r\n * @param CalibratorInstance - The class that defines the calibration process.\r\n * @param connectionManager - Instance of the ConnectionManager\r\n * @param timeOut - The amount of time to wait before timing out the connection (in milliseconds).\r\n * @public\r\n */\n_defineProperty(Speaker, \"startCalibration\", async function (params, CalibratorInstance, connectionManager) {\n let timeOut = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 180000;\n // Create a speaker instance and register with the connection manager\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n speaker.ac = CalibratorInstance;\n await speaker.connectionManager.waitForPeerConnection();\n await speaker.connectionManager.resolveWhenHandshakeReceived();\n speaker.connectionManager.sendPageTitle('EasyEyes Microphone');\n speaker.connectionManager.send({\n name: 'CompatibilityPeer',\n message: 'Text',\n text: 'Loading...'\n });\n //only send the following fields, RC_microphonePermissionDenied, RC_microphonePermission, RC_placeSmartphoneMicrophone, RC_turnMeToReadBelow, RC_soundRecording, RC_soundRecordingSmallScreen, RC_soundRecording, RC_backToExperimentWindow, RC_allowMicrophoneUse\n speaker.connectionManager.send({\n name: 'SoundCalibration',\n message: 'phrases',\n payload: {\n RC_microphonePermissionDenied: speaker.phrases.RC_microphonePermissionDenied,\n RC_microphonePermission: speaker.phrases.RC_microphonePermission,\n RC_placeSmartphoneMicrophone: speaker.phrases.RC_placeSmartphoneMicrophone,\n RC_turnMeToReadBelow: speaker.phrases.RC_turnMeToReadBelow,\n RC_soundRecording: speaker.phrases.RC_soundRecording,\n RC_soundRecordingSmallScreen: speaker.phrases.RC_soundRecordingSmallScreen,\n RC_backToExperimentWindow: speaker.phrases.RC_backToExperimentWindow,\n RC_allowMicrophoneUse: speaker.phrases.RC_allowMicrophoneUse\n }\n });\n\n // Send connection parameters to the listener\n speaker.connectionManager.send(speaker.prepareConnectionParams());\n\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (speaker.permissionStatus === 'error' || speaker.permissionStatus === 'denied') {\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve('permission denied');\n }\n }, 100);\n console.log('Setting up call handler on the peer');\n // Set up call handler on the peer\n speaker.connectionManager.peer.on('call', async call => {\n console.log('Received call from listener');\n clearInterval(permissionCheckInterval); // Clear interval when call is received\n\n // Answer the call\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_4__.sleep)(1);\n }\n if (params.displayUpdate) {\n params.displayUpdate.style.display = '';\n }\n\n // resolve when we have a result\n speaker.result = await speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n //remove the call\n speaker.connectionManager.peer.off('call');\n resolve(speaker.result);\n });\n\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n clearInterval(permissionCheckInterval);\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_5__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n console.log('Call handler set up', speaker.connectionManager.peer);\n });\n});\n_defineProperty(Speaker, \"testIIR\", async function (params, CalibratorInstance, IIR, connectionManager) {\n let timeOut = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 180000;\n window.speaker = new _Speaker(params, CalibratorInstance, connectionManager);\n const {\n speaker\n } = window;\n\n // Set QR code parameters\n connectionManager.setQueryParams(speaker.prepareQRParams());\n\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // when a call is received\n connectionManager.peer.on('call', async call => {\n // Answer the call (one way)\n call.answer();\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n _classPrivateFieldGet(_showSpinner, speaker).call(speaker);\n speaker.ac.createLocalAudio(document.getElementById(speaker.targetElement));\n // when we start receiving audio\n call.on('stream', async stream => {\n window.localStream = stream;\n window.localAudio.srcObject = stream;\n window.localAudio.autoplay = false;\n\n // if the sinkSamplingRate is not set sleep\n while (!speaker.ac.sampleRatesSet()) {\n console.log('SinkSamplingRate is undefined, sleeping');\n await (0,_utils__WEBPACK_IMPORTED_MODULE_4__.sleep)(1);\n }\n // resolve when we have a result\n speaker.result = await speaker.ac.playMLSwithIIR(stream, IIR);\n _classPrivateFieldGet(_removeUIElems, speaker).call(speaker);\n resolve(speaker.result);\n });\n // if we do not receive a result within the timeout, reject\n setTimeout(() => {\n reject(new _peerErrors__WEBPACK_IMPORTED_MODULE_5__.CalibrationTimedOutError(\"Calibration failed to produce a result after \".concat(timeOut / 1000, \" seconds. Try increasing \\\"_timeoutSec\\\", which is currently \").concat(timeOut / 1000, \" seconds.\")));\n }, timeOut);\n });\n });\n});\n_defineProperty(Speaker, \"closeConnection\", () => {\n _Speaker.conn = null;\n console.log('Connection destroyed');\n});\n_defineProperty(Speaker, \"repeatCalibration\", async (params, stream, CalibratorInstance) => {\n var _window$speaker, _window$speaker2;\n window.speaker.ac = CalibratorInstance;\n _classPrivateFieldGet(_removeUIElems, _window$speaker = window.speaker).call(_window$speaker);\n _classPrivateFieldGet(_showSpinner, _window$speaker2 = window.speaker).call(_window$speaker2);\n console.log('This is a repeat');\n // wrap the calibration process in a promise so we can await it\n return new Promise((resolve, reject) => {\n // Add a permission check handler\n const permissionCheckInterval = setInterval(() => {\n if (window.speaker.permissionStatus === 'error' || window.speaker.permissionStatus === 'denied') {\n var _window$speaker3;\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, _window$speaker3 = window.speaker).call(_window$speaker3);\n resolve('permission denied');\n }\n }, 100);\n\n // Start calibration process\n (async () => {\n try {\n var _window$speaker4;\n const result = await window.speaker.ac.startCalibration(stream, params.gainValues, params.ICalib, params.knownIR, params.microphoneName, params.calibrateSoundCheck, params.isSmartPhone, params.calibrateSoundBurstDb, params.calibrateSoundBurstFilteredExtraDb, params.calibrateSoundBurstLevelReTBool, params.calibrateSoundBurstUses1000HzGainBool, params.calibrateSoundBurstRepeats, params.calibrateSoundBurstSec, params._calibrateSoundBurstPreSec, params._calibrateSoundBurstPostSec, params.calibrateSoundHz, params.calibrateSoundIRSec, params.calibrateSoundIIRSec, params.calibrateSoundIIRPhase, params.calibrateSound1000HzPreSec, params.calibrateSound1000HzSec, params.calibrateSound1000HzPostSec, params.calibrateSoundBackgroundSecs, params.calibrateSoundSmoothOctaves, params.calibrateSoundSmoothMinBandwidthHz, params.calibrateSoundPowerBinDesiredSec, params.calibrateSoundPowerDbSDToleratedDb, params.calibrateSoundTaperSec, params.micManufacturer, params.micSerialNumber, params.micModelNumber, params.micModelName, params.calibrateMicrophonesBool, params.authorEmails, params.webAudioDeviceNames, params.IDsToSaveInSoundProfileLibrary, params.restartButton, params.reminder, params.calibrateSoundLimit, params.calibrateSoundBurstNormalizeBy1000HzGainBool, params.calibrateSoundBurstScalarDB, params.calibrateSound1000HzMaxSD_dB, params.calibrateSound1000HzMaxTries, params._calibrateSoundBurstMaxSD_dB, params.calibrateSoundSamplingDesiredBits, params.language, params.loudspeakerModelName, params.phrases, params.soundSubtitleId, params.calibrateSoundBurstDownsample, params.calibrateSoundSimulateMicrophone, params.calibrateSoundSimulateMicrophoneTime, params.calibrateSoundSimulateLoudspeaker, params.calibrateSoundSimulateLoudspeakerTime, params.calibrateSoundSimulateMicrophoneFrequencies, params.calibrateSoundSimulateLoudspeakerFrequencies, params.calibrateSoundSimulateMicrophoneType, params.calibrateSoundSimulateLoudspeakerType, params.calibrateSoundSimulateLoudspeakerFileName, params.calibrateSoundSimulateMicrophoneFileName, params.isLoudspeakerCalibration);\n clearInterval(permissionCheckInterval);\n _classPrivateFieldGet(_removeUIElems, _window$speaker4 = window.speaker).call(_window$speaker4);\n resolve(result);\n } catch (error) {\n clearInterval(permissionCheckInterval);\n reject(error);\n }\n })();\n });\n});\n/* harmony default export */ __webpack_exports__[\"default\"] = (Speaker);\n\n//# sourceURL=webpack://speakerCalibrator/./src/peer-connection/speaker.js?");
|
|
129
129
|
|
|
130
130
|
/***/ }),
|
|
131
131
|
|