speaker-calibration 2.2.216 → 2.2.217
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/.eslintignore +71 -71
- package/.eslintrc.json +40 -40
- package/.gitignore +81 -0
- package/.prettierignore +69 -69
- package/.prettierrc +14 -14
- package/LICENSE +20 -20
- package/README.md +133 -133
- package/__mocks__/fileMock.js +1 -1
- package/__mocks__/styleMock.js +1 -1
- package/babel.config.js +3 -3
- package/coverage/clover.xml +71 -71
- package/coverage/coverage-final.json +224 -224
- package/coverage/lcov-report/PythonServerInterface.js.html +265 -265
- package/coverage/lcov-report/base.css +354 -354
- package/coverage/lcov-report/block-navigation.js +82 -82
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +123 -123
- package/coverage/lcov-report/prettify.css +101 -101
- package/coverage/lcov-report/prettify.js +937 -937
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +189 -189
- package/coverage/lcov-report/src/index.html +121 -121
- package/coverage/lcov-report/src/server/PythonServerInterface.js.html +268 -268
- package/coverage/lcov-report/src/server/index.html +123 -123
- package/coverage/lcov-report/src/tasks/audioCalibrator.js.html +499 -499
- package/coverage/lcov-report/src/tasks/audioRecorder.js.html +412 -412
- package/coverage/lcov-report/src/tasks/index.html +143 -143
- package/coverage/lcov-report/src/tasks/volume/index.html +123 -123
- package/coverage/lcov-report/src/tasks/volume/volume.js.html +409 -409
- package/coverage/lcov-report/src/utils.js.html +172 -172
- package/coverage/lcov.info +91 -91
- package/dist/Procfile +0 -0
- package/dist/example/NoSleep.min.js +1 -1
- package/dist/example/credentials.json.gpg +0 -0
- package/dist/example/fetch-languages-sheets.js +77 -77
- package/dist/example/i18n.js +28705 -28705
- package/dist/example/index.html +47 -47
- package/dist/example/listener.html +79 -79
- package/dist/example/server.js +51 -51
- package/dist/example/speaker.html +145 -145
- package/dist/example/speakerUI.js +273 -273
- package/dist/example/styles.css +99 -99
- package/dist/listener.js +13 -13
- package/dist/main.js +12 -12
- package/dist/main.js.LICENSE.txt +0 -0
- package/dist/mlsGen.js +6814 -6814
- package/dist/mlsGen.wasm +0 -0
- package/dist/package-lock.json +1018 -1018
- package/dist/package.json +18 -18
- package/doc/AudioCalibrator.html +417 -417
- package/doc/AudioPeer.html +251 -251
- package/doc/AudioRecorder.html +195 -195
- package/doc/ImpulseResponse.html +215 -215
- package/doc/Listener.html +308 -308
- package/doc/MlsGenInterface.html +226 -226
- package/doc/MyEventEmitter.html +274 -274
- package/doc/PythonServerAPI.html +109 -109
- package/doc/Speaker-Calibration-UML-Diagram.png +0 -0
- package/doc/Speaker.html +276 -276
- package/doc/Takes%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +128 -128
- package/doc/Takes%20the%20url%20of%20the%20current%20site%0Aand%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +138 -138
- package/doc/Takes%20the%20url%20of%20the%20current%20site%20and%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +137 -137
- package/doc/Volume.html +88 -88
- package/doc/audioCalibrator.js.html +179 -179
- package/doc/audioPeer.js.html +175 -175
- package/doc/audioRecorder.js.html +163 -163
- package/doc/creates%20a%20new%20AudioRecorder%20instance.%20%0ASets%20up%20the%20audio%20context%20and%20file%20reader..html +114 -114
- package/doc/fonts/OpenSans-Bold-webfont.eot +0 -0
- package/doc/fonts/OpenSans-Bold-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Bold-webfont.woff +0 -0
- package/doc/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
- package/doc/fonts/OpenSans-BoldItalic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
- package/doc/fonts/OpenSans-Italic-webfont.eot +0 -0
- package/doc/fonts/OpenSans-Italic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Italic-webfont.woff +0 -0
- package/doc/fonts/OpenSans-Light-webfont.eot +0 -0
- package/doc/fonts/OpenSans-Light-webfont.svg +1830 -1830
- package/doc/fonts/OpenSans-Light-webfont.woff +0 -0
- package/doc/fonts/OpenSans-LightItalic-webfont.eot +0 -0
- package/doc/fonts/OpenSans-LightItalic-webfont.svg +1834 -1834
- package/doc/fonts/OpenSans-LightItalic-webfont.woff +0 -0
- package/doc/fonts/OpenSans-Regular-webfont.eot +0 -0
- package/doc/fonts/OpenSans-Regular-webfont.svg +1830 -1830
- package/doc/fonts/OpenSans-Regular-webfont.woff +0 -0
- package/doc/global.html +308 -308
- package/doc/index.html +58 -58
- package/doc/listener.js.html +170 -170
- package/doc/mlsGen_mlsGenInterface.js.html +117 -117
- package/doc/myEventEmitter.js.html +124 -124
- package/doc/peer-connection_audioPeer.js.html +188 -188
- package/doc/peer-connection_listener.js.html +311 -311
- package/doc/peer-connection_speaker.js.html +381 -381
- package/doc/sc-activity-diagram.png +0 -0
- package/doc/scripts/linenumber.js +25 -25
- package/doc/scripts/prettify/Apache-License-2.0.txt +202 -202
- package/doc/scripts/prettify/lang-css.js +24 -24
- package/doc/scripts/prettify/prettify.js +640 -640
- package/doc/server_PythonServerAPI.js.html +160 -160
- package/doc/speaker.js.html +248 -248
- package/doc/styles/jsdoc-default.css +371 -371
- package/doc/styles/prettify-jsdoc.css +111 -111
- package/doc/styles/prettify-tomorrow.css +163 -163
- package/doc/tasks_audioCalibrator.js.html +207 -207
- package/doc/tasks_audioRecorder.js.html +190 -190
- package/doc/tasks_impulse-response_impulseResponse.js.html +442 -442
- package/doc/tasks_impulse-response_mlsGen_mlsGenInterface.js.html +175 -175
- package/doc/tasks_volume_volume.js.html +185 -185
- package/doc/utils.js.html +105 -105
- package/jest.config.js +173 -173
- package/netlify.toml +26 -26
- package/package.json +78 -78
- package/src/config/firebase.js +26 -26
- package/src/index.html +21 -21
- package/src/listener-app/listener.js +153 -153
- package/src/main.js +23 -23
- package/src/myEventEmitter.js +83 -83
- package/src/peer-connection/audioPeer.js +183 -183
- package/src/peer-connection/listener.js +369 -369
- package/src/peer-connection/peerErrors.js +25 -25
- package/src/peer-connection/speaker.js +765 -765
- package/src/powerCheck.js +98 -98
- package/src/server/PythonServerAPI.js +869 -869
- package/src/tasks/audioCalibrator.js +360 -351
- package/src/tasks/audioRecorder.js +315 -315
- package/src/tasks/combination/combination.js +3160 -3160
- package/src/tasks/combination/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/combination/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/combination/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/combination/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/impulse-response/impulseResponse.js +610 -610
- package/src/tasks/impulse-response/mlsGen/mlsGen.cpp +98 -98
- package/src/tasks/impulse-response/mlsGen/mlsGen.hpp +303 -303
- package/src/tasks/impulse-response/mlsGen/mlsGenInterface.js +131 -131
- package/src/tasks/impulse-response/mlsGen/mlsGenTest.cpp +180 -180
- package/src/tasks/volume/volume.cpp +2 -2
- package/src/tasks/volume/volume.hpp +22 -22
- package/src/tasks/volume/volume.js +279 -279
- package/src/utils.js +205 -205
- package/webpack.config.js +64 -64
- package/.github/workflows/update-phrases.yml +0 -37
- package/makefile +0 -74
package/src/index.html
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html class="no-js" lang="">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
|
6
|
-
<title>Sound Check</title>
|
|
7
|
-
<meta name="description" content="" />
|
|
8
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
9
|
-
|
|
10
|
-
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
11
|
-
<!-- Place favicon.ico in the root directory -->
|
|
12
|
-
</head>
|
|
13
|
-
<body>
|
|
14
|
-
<!--[if lt IE 8]>
|
|
15
|
-
<p class="browserupgrade">
|
|
16
|
-
You are using an <strong>outdated</strong> browser. Please
|
|
17
|
-
<a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.
|
|
18
|
-
</p>
|
|
19
|
-
<![endif]-->
|
|
20
|
-
</body>
|
|
21
|
-
</html>
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html class="no-js" lang="">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta http-equiv="x-ua-compatible" content="ie=edge" />
|
|
6
|
+
<title>Sound Check</title>
|
|
7
|
+
<meta name="description" content="" />
|
|
8
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
9
|
+
|
|
10
|
+
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
11
|
+
<!-- Place favicon.ico in the root directory -->
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<!--[if lt IE 8]>
|
|
15
|
+
<p class="browserupgrade">
|
|
16
|
+
You are using an <strong>outdated</strong> browser. Please
|
|
17
|
+
<a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.
|
|
18
|
+
</p>
|
|
19
|
+
<![endif]-->
|
|
20
|
+
</body>
|
|
21
|
+
</html>
|
|
@@ -1,153 +1,153 @@
|
|
|
1
|
-
// get element with id message
|
|
2
|
-
import {phrases} from '../../dist/example/i18n.js';
|
|
3
|
-
import {Listener} from '../main.js';
|
|
4
|
-
// get url query parameters
|
|
5
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
6
|
-
|
|
7
|
-
// get isSmartPhone query parameter
|
|
8
|
-
const isSmartPhone = urlParams.get('sp'); // previous isSmartPhone
|
|
9
|
-
|
|
10
|
-
const listenerParameters = {
|
|
11
|
-
targetElementId: 'display',
|
|
12
|
-
microphoneFromAPI: '',
|
|
13
|
-
microphoneDeviceId: '',
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
const container = document.getElementById('listenerContainer');
|
|
17
|
-
const recordingInProgress = phrases.RC_soundRecording['en-US'];
|
|
18
|
-
const backToExperimentWindow = phrases.RC_backToExperimentWindow['en-US'];
|
|
19
|
-
const allowMicrophone = phrases.RC_allowMicrophoneUse['en-US'].replace(/\n/g, '<br>');
|
|
20
|
-
const placeSmartphoneMicrophone = phrases.RC_placeSmartphoneMicrophone['en-US'].replace(
|
|
21
|
-
/\n/g,
|
|
22
|
-
'<br>'
|
|
23
|
-
);
|
|
24
|
-
const turnMeToReadBelow = phrases.RC_turnMeToReadBelow['en-US'].replace(/\n/g, '<br>');
|
|
25
|
-
const recordingInProgressElement = document.getElementById('recordingInProgress');
|
|
26
|
-
const allowMicrophoneElement = document.getElementById('allowMicrophone');
|
|
27
|
-
const turnMessageElement = document.getElementById('turnMeToReadBelow');
|
|
28
|
-
|
|
29
|
-
switch (isSmartPhone) {
|
|
30
|
-
case 'true':
|
|
31
|
-
allowMicrophoneElement.innerHTML = placeSmartphoneMicrophone;
|
|
32
|
-
allowMicrophoneElement.style.lineHeight = '1.2rem';
|
|
33
|
-
allowMicrophoneElement.style.fontSize = '14px';
|
|
34
|
-
turnMessageElement.innerHTML = turnMeToReadBelow;
|
|
35
|
-
turnMessageElement.style.lineHeight = '1.2rem';
|
|
36
|
-
turnMessageElement.style.fontSize = '14px';
|
|
37
|
-
// show the html upsidedown
|
|
38
|
-
const phrasesContainer = document.getElementById('phrases');
|
|
39
|
-
// add class
|
|
40
|
-
phrasesContainer.classList.add('phrases');
|
|
41
|
-
const html = document.querySelector('html');
|
|
42
|
-
html.style.overflow = 'hidden';
|
|
43
|
-
const display = document.getElementById('updateDisplay');
|
|
44
|
-
display.classList.add('updateDisplay');
|
|
45
|
-
container.style.display = 'block';
|
|
46
|
-
// event listener for id calibrationBeginButton
|
|
47
|
-
const calibrationBeginButton = document.getElementById('calibrationBeginButton');
|
|
48
|
-
console.log('Waiting for proceed button click');
|
|
49
|
-
|
|
50
|
-
calibrationBeginButton.addEventListener('click', async () => {
|
|
51
|
-
console.log('Proceed button clicked');
|
|
52
|
-
|
|
53
|
-
// remove the button
|
|
54
|
-
calibrationBeginButton.remove();
|
|
55
|
-
// remove turn message
|
|
56
|
-
turnMessageElement.remove();
|
|
57
|
-
// set the text of the html elements
|
|
58
|
-
recordingInProgressElement.innerHTML = recordingInProgress;
|
|
59
|
-
allowMicrophoneElement.innerHTML = allowMicrophone;
|
|
60
|
-
|
|
61
|
-
recordingInProgressElement.style.whiteSpace = 'nowrap';
|
|
62
|
-
recordingInProgressElement.style.fontWeight = 'bold';
|
|
63
|
-
// fit content
|
|
64
|
-
recordingInProgressElement.style.width = 'fit-content';
|
|
65
|
-
let fontSize = 100;
|
|
66
|
-
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
67
|
-
|
|
68
|
-
console.log('Adjusting font size for recording in progress text');
|
|
69
|
-
while (recordingInProgressElement.scrollWidth > window.innerWidth * 0.9 && fontSize > 10) {
|
|
70
|
-
fontSize--;
|
|
71
|
-
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
72
|
-
}
|
|
73
|
-
console.log('Done adjusting font size for recording in progress text');
|
|
74
|
-
const webAudioDeviceNames = {microphone: '', deviceID: ''};
|
|
75
|
-
const externalMicList = ['UMIK', 'Airpods', 'Bluetooth'];
|
|
76
|
-
try {
|
|
77
|
-
console.log('Getting user media...Should ask for microphone permission');
|
|
78
|
-
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
|
|
79
|
-
console.log('Got user media');
|
|
80
|
-
if (stream) {
|
|
81
|
-
console.log('Getting devices');
|
|
82
|
-
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
83
|
-
console.log(devices);
|
|
84
|
-
const mics = devices.filter(device => device.kind === 'audioinput');
|
|
85
|
-
mics.forEach(mic => {
|
|
86
|
-
if (externalMicList.some(externalMic => mic.label.includes(externalMic))) {
|
|
87
|
-
webAudioDeviceNames.microphone = mic.label;
|
|
88
|
-
webAudioDeviceNames.deviceID = mic.deviceId;
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
if (webAudioDeviceNames.microphone === '') {
|
|
92
|
-
webAudioDeviceNames.microphone = mics[0].label;
|
|
93
|
-
webAudioDeviceNames.deviceID = mics[0].deviceId;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
} catch (err) {
|
|
97
|
-
console.log(err);
|
|
98
|
-
}
|
|
99
|
-
listenerParameters.microphoneFromAPI = webAudioDeviceNames.microphone;
|
|
100
|
-
listenerParameters.microphoneDeviceId = webAudioDeviceNames.microphone;
|
|
101
|
-
let lock = null;
|
|
102
|
-
try {
|
|
103
|
-
if ('wakeLock' in navigator) {
|
|
104
|
-
lock = await navigator.wakeLock.request('screen');
|
|
105
|
-
}
|
|
106
|
-
} catch (err) {
|
|
107
|
-
console.log(err);
|
|
108
|
-
}
|
|
109
|
-
console.log(lock);
|
|
110
|
-
console.log('Starting Calibration');
|
|
111
|
-
console.log('Device id in example listenr:', listenerParameters.microphoneDeviceId);
|
|
112
|
-
window.listener = new Listener(listenerParameters);
|
|
113
|
-
console.log(window.listener);
|
|
114
|
-
if (lock) {
|
|
115
|
-
lock.release();
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
break;
|
|
119
|
-
case 'false':
|
|
120
|
-
// remove the button
|
|
121
|
-
const calibrationBeginButton2 = document.getElementById('calibrationBeginButton');
|
|
122
|
-
calibrationBeginButton2.remove();
|
|
123
|
-
container.style.display = 'block';
|
|
124
|
-
// event listener for when the page is loaded
|
|
125
|
-
|
|
126
|
-
window.addEventListener('load', () => {
|
|
127
|
-
// set the text of the html elements
|
|
128
|
-
recordingInProgressElement.innerHTML = recordingInProgress;
|
|
129
|
-
allowMicrophoneElement.innerHTML = allowMicrophone;
|
|
130
|
-
|
|
131
|
-
recordingInProgressElement.style.whiteSpace = 'nowrap';
|
|
132
|
-
recordingInProgressElement.style.fontWeight = 'bold';
|
|
133
|
-
|
|
134
|
-
// fit content
|
|
135
|
-
recordingInProgressElement.style.width = 'fit-content';
|
|
136
|
-
let fontSize = 100;
|
|
137
|
-
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
138
|
-
|
|
139
|
-
while (recordingInProgressElement.scrollWidth > window.innerWidth * 0.9 && fontSize > 10) {
|
|
140
|
-
fontSize--;
|
|
141
|
-
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
142
|
-
}
|
|
143
|
-
const message = document.getElementById('message');
|
|
144
|
-
message.style.lineHeight = '2.5rem';
|
|
145
|
-
const p = document.createElement('p');
|
|
146
|
-
p.innerHTML = backToExperimentWindow;
|
|
147
|
-
message.appendChild(p);
|
|
148
|
-
listenerParameters.microphoneDeviceId = urlParams.get('deviceId');
|
|
149
|
-
window.listener = new Listener(listenerParameters);
|
|
150
|
-
console.log(window.listener);
|
|
151
|
-
});
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
1
|
+
// get element with id message
|
|
2
|
+
import {phrases} from '../../dist/example/i18n.js';
|
|
3
|
+
import {Listener} from '../main.js';
|
|
4
|
+
// get url query parameters
|
|
5
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
6
|
+
|
|
7
|
+
// get isSmartPhone query parameter
|
|
8
|
+
const isSmartPhone = urlParams.get('sp'); // previous isSmartPhone
|
|
9
|
+
|
|
10
|
+
const listenerParameters = {
|
|
11
|
+
targetElementId: 'display',
|
|
12
|
+
microphoneFromAPI: '',
|
|
13
|
+
microphoneDeviceId: '',
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const container = document.getElementById('listenerContainer');
|
|
17
|
+
const recordingInProgress = phrases.RC_soundRecording['en-US'];
|
|
18
|
+
const backToExperimentWindow = phrases.RC_backToExperimentWindow['en-US'];
|
|
19
|
+
const allowMicrophone = phrases.RC_allowMicrophoneUse['en-US'].replace(/\n/g, '<br>');
|
|
20
|
+
const placeSmartphoneMicrophone = phrases.RC_placeSmartphoneMicrophone['en-US'].replace(
|
|
21
|
+
/\n/g,
|
|
22
|
+
'<br>'
|
|
23
|
+
);
|
|
24
|
+
const turnMeToReadBelow = phrases.RC_turnMeToReadBelow['en-US'].replace(/\n/g, '<br>');
|
|
25
|
+
const recordingInProgressElement = document.getElementById('recordingInProgress');
|
|
26
|
+
const allowMicrophoneElement = document.getElementById('allowMicrophone');
|
|
27
|
+
const turnMessageElement = document.getElementById('turnMeToReadBelow');
|
|
28
|
+
|
|
29
|
+
switch (isSmartPhone) {
|
|
30
|
+
case 'true':
|
|
31
|
+
allowMicrophoneElement.innerHTML = placeSmartphoneMicrophone;
|
|
32
|
+
allowMicrophoneElement.style.lineHeight = '1.2rem';
|
|
33
|
+
allowMicrophoneElement.style.fontSize = '14px';
|
|
34
|
+
turnMessageElement.innerHTML = turnMeToReadBelow;
|
|
35
|
+
turnMessageElement.style.lineHeight = '1.2rem';
|
|
36
|
+
turnMessageElement.style.fontSize = '14px';
|
|
37
|
+
// show the html upsidedown
|
|
38
|
+
const phrasesContainer = document.getElementById('phrases');
|
|
39
|
+
// add class
|
|
40
|
+
phrasesContainer.classList.add('phrases');
|
|
41
|
+
const html = document.querySelector('html');
|
|
42
|
+
html.style.overflow = 'hidden';
|
|
43
|
+
const display = document.getElementById('updateDisplay');
|
|
44
|
+
display.classList.add('updateDisplay');
|
|
45
|
+
container.style.display = 'block';
|
|
46
|
+
// event listener for id calibrationBeginButton
|
|
47
|
+
const calibrationBeginButton = document.getElementById('calibrationBeginButton');
|
|
48
|
+
console.log('Waiting for proceed button click');
|
|
49
|
+
|
|
50
|
+
calibrationBeginButton.addEventListener('click', async () => {
|
|
51
|
+
console.log('Proceed button clicked');
|
|
52
|
+
|
|
53
|
+
// remove the button
|
|
54
|
+
calibrationBeginButton.remove();
|
|
55
|
+
// remove turn message
|
|
56
|
+
turnMessageElement.remove();
|
|
57
|
+
// set the text of the html elements
|
|
58
|
+
recordingInProgressElement.innerHTML = recordingInProgress;
|
|
59
|
+
allowMicrophoneElement.innerHTML = allowMicrophone;
|
|
60
|
+
|
|
61
|
+
recordingInProgressElement.style.whiteSpace = 'nowrap';
|
|
62
|
+
recordingInProgressElement.style.fontWeight = 'bold';
|
|
63
|
+
// fit content
|
|
64
|
+
recordingInProgressElement.style.width = 'fit-content';
|
|
65
|
+
let fontSize = 100;
|
|
66
|
+
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
67
|
+
|
|
68
|
+
console.log('Adjusting font size for recording in progress text');
|
|
69
|
+
while (recordingInProgressElement.scrollWidth > window.innerWidth * 0.9 && fontSize > 10) {
|
|
70
|
+
fontSize--;
|
|
71
|
+
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
72
|
+
}
|
|
73
|
+
console.log('Done adjusting font size for recording in progress text');
|
|
74
|
+
const webAudioDeviceNames = {microphone: '', deviceID: ''};
|
|
75
|
+
const externalMicList = ['UMIK', 'Airpods', 'Bluetooth'];
|
|
76
|
+
try {
|
|
77
|
+
console.log('Getting user media...Should ask for microphone permission');
|
|
78
|
+
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
|
|
79
|
+
console.log('Got user media');
|
|
80
|
+
if (stream) {
|
|
81
|
+
console.log('Getting devices');
|
|
82
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
83
|
+
console.log(devices);
|
|
84
|
+
const mics = devices.filter(device => device.kind === 'audioinput');
|
|
85
|
+
mics.forEach(mic => {
|
|
86
|
+
if (externalMicList.some(externalMic => mic.label.includes(externalMic))) {
|
|
87
|
+
webAudioDeviceNames.microphone = mic.label;
|
|
88
|
+
webAudioDeviceNames.deviceID = mic.deviceId;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
if (webAudioDeviceNames.microphone === '') {
|
|
92
|
+
webAudioDeviceNames.microphone = mics[0].label;
|
|
93
|
+
webAudioDeviceNames.deviceID = mics[0].deviceId;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
} catch (err) {
|
|
97
|
+
console.log(err);
|
|
98
|
+
}
|
|
99
|
+
listenerParameters.microphoneFromAPI = webAudioDeviceNames.microphone;
|
|
100
|
+
listenerParameters.microphoneDeviceId = webAudioDeviceNames.microphone;
|
|
101
|
+
let lock = null;
|
|
102
|
+
try {
|
|
103
|
+
if ('wakeLock' in navigator) {
|
|
104
|
+
lock = await navigator.wakeLock.request('screen');
|
|
105
|
+
}
|
|
106
|
+
} catch (err) {
|
|
107
|
+
console.log(err);
|
|
108
|
+
}
|
|
109
|
+
console.log(lock);
|
|
110
|
+
console.log('Starting Calibration');
|
|
111
|
+
console.log('Device id in example listenr:', listenerParameters.microphoneDeviceId);
|
|
112
|
+
window.listener = new Listener(listenerParameters);
|
|
113
|
+
console.log(window.listener);
|
|
114
|
+
if (lock) {
|
|
115
|
+
lock.release();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
break;
|
|
119
|
+
case 'false':
|
|
120
|
+
// remove the button
|
|
121
|
+
const calibrationBeginButton2 = document.getElementById('calibrationBeginButton');
|
|
122
|
+
calibrationBeginButton2.remove();
|
|
123
|
+
container.style.display = 'block';
|
|
124
|
+
// event listener for when the page is loaded
|
|
125
|
+
|
|
126
|
+
window.addEventListener('load', () => {
|
|
127
|
+
// set the text of the html elements
|
|
128
|
+
recordingInProgressElement.innerHTML = recordingInProgress;
|
|
129
|
+
allowMicrophoneElement.innerHTML = allowMicrophone;
|
|
130
|
+
|
|
131
|
+
recordingInProgressElement.style.whiteSpace = 'nowrap';
|
|
132
|
+
recordingInProgressElement.style.fontWeight = 'bold';
|
|
133
|
+
|
|
134
|
+
// fit content
|
|
135
|
+
recordingInProgressElement.style.width = 'fit-content';
|
|
136
|
+
let fontSize = 100;
|
|
137
|
+
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
138
|
+
|
|
139
|
+
while (recordingInProgressElement.scrollWidth > window.innerWidth * 0.9 && fontSize > 10) {
|
|
140
|
+
fontSize--;
|
|
141
|
+
recordingInProgressElement.style.fontSize = fontSize + 'px';
|
|
142
|
+
}
|
|
143
|
+
const message = document.getElementById('message');
|
|
144
|
+
message.style.lineHeight = '2.5rem';
|
|
145
|
+
const p = document.createElement('p');
|
|
146
|
+
p.innerHTML = backToExperimentWindow;
|
|
147
|
+
message.appendChild(p);
|
|
148
|
+
listenerParameters.microphoneDeviceId = urlParams.get('deviceId');
|
|
149
|
+
window.listener = new Listener(listenerParameters);
|
|
150
|
+
console.log(window.listener);
|
|
151
|
+
});
|
|
152
|
+
break;
|
|
153
|
+
}
|
package/src/main.js
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import Listener from './peer-connection/listener';
|
|
2
|
-
import Speaker from './peer-connection/speaker';
|
|
3
|
-
|
|
4
|
-
import VolumeCalibration from './tasks/volume/volume';
|
|
5
|
-
import ImpulseResponseCalibration from './tasks/impulse-response/impulseResponse';
|
|
6
|
-
import CombinationCalibration from './tasks/combination/combination';
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
UnsupportedDeviceError,
|
|
10
|
-
MissingSpeakerIdError,
|
|
11
|
-
CalibrationTimedOutError,
|
|
12
|
-
} from './peer-connection/peerErrors';
|
|
13
|
-
|
|
14
|
-
export {
|
|
15
|
-
Listener,
|
|
16
|
-
Speaker,
|
|
17
|
-
VolumeCalibration,
|
|
18
|
-
ImpulseResponseCalibration,
|
|
19
|
-
UnsupportedDeviceError,
|
|
20
|
-
MissingSpeakerIdError,
|
|
21
|
-
CalibrationTimedOutError,
|
|
22
|
-
CombinationCalibration,
|
|
23
|
-
};
|
|
1
|
+
import Listener from './peer-connection/listener';
|
|
2
|
+
import Speaker from './peer-connection/speaker';
|
|
3
|
+
|
|
4
|
+
import VolumeCalibration from './tasks/volume/volume';
|
|
5
|
+
import ImpulseResponseCalibration from './tasks/impulse-response/impulseResponse';
|
|
6
|
+
import CombinationCalibration from './tasks/combination/combination';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
UnsupportedDeviceError,
|
|
10
|
+
MissingSpeakerIdError,
|
|
11
|
+
CalibrationTimedOutError,
|
|
12
|
+
} from './peer-connection/peerErrors';
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
Listener,
|
|
16
|
+
Speaker,
|
|
17
|
+
VolumeCalibration,
|
|
18
|
+
ImpulseResponseCalibration,
|
|
19
|
+
UnsupportedDeviceError,
|
|
20
|
+
MissingSpeakerIdError,
|
|
21
|
+
CalibrationTimedOutError,
|
|
22
|
+
CombinationCalibration,
|
|
23
|
+
};
|
package/src/myEventEmitter.js
CHANGED
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A simple event emitter class. Objects that inheret this class or implement it can then bubble events up to the UI
|
|
3
|
-
* similar to existings event emitter such as 'onChange' or 'onClick'.
|
|
4
|
-
*/
|
|
5
|
-
class MyEventEmitter {
|
|
6
|
-
#events;
|
|
7
|
-
|
|
8
|
-
/** .
|
|
9
|
-
* .
|
|
10
|
-
* .
|
|
11
|
-
* Default constructor, intializes an empty object to store events
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
*/
|
|
15
|
-
constructor() {
|
|
16
|
-
this.#events = {};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* The external API for this class. Gets called with an event name and a callback function that is fired when the event is emitted.
|
|
21
|
-
*
|
|
22
|
-
* @param name
|
|
23
|
-
* @param listener
|
|
24
|
-
* @example
|
|
25
|
-
*/
|
|
26
|
-
on(name, listener) {
|
|
27
|
-
if (!this.#events[name]) {
|
|
28
|
-
this.#events[name] = [];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
this.#events[name].push(listener);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/** .
|
|
35
|
-
* .
|
|
36
|
-
* .
|
|
37
|
-
* Function to remove a listener that was previously set
|
|
38
|
-
*
|
|
39
|
-
* @param {*} name
|
|
40
|
-
* @param {*} listenerToRemove
|
|
41
|
-
* @example
|
|
42
|
-
*/
|
|
43
|
-
removeListener(name, listenerToRemove) {
|
|
44
|
-
if (!this.#events[name]) {
|
|
45
|
-
throw new Error(`Can't remove a listener. Event "${name}" doesn't exits.`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
*
|
|
50
|
-
* @param listener
|
|
51
|
-
* @example
|
|
52
|
-
*/
|
|
53
|
-
const filterListeners = listener => listener !== listenerToRemove;
|
|
54
|
-
|
|
55
|
-
this.#events[name] = this.#events[name].filter(filterListeners);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* The internal API for this class. Gets called with an event name and a data object.
|
|
60
|
-
* Any callbacks that have been set to listen to the matching event are dispatched.
|
|
61
|
-
*
|
|
62
|
-
* @param name
|
|
63
|
-
* @param data
|
|
64
|
-
* @example
|
|
65
|
-
*/
|
|
66
|
-
emit(name, data) {
|
|
67
|
-
if (!this.#events[name]) {
|
|
68
|
-
throw new Error(`Can't emit an event. Event "${name}" doesn't exits.`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
*
|
|
73
|
-
* @param {*} callback
|
|
74
|
-
*/
|
|
75
|
-
const fireCallbacks = callback => {
|
|
76
|
-
callback(data);
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
this.#events[name].forEach(fireCallbacks);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export default MyEventEmitter;
|
|
1
|
+
/**
|
|
2
|
+
* A simple event emitter class. Objects that inheret this class or implement it can then bubble events up to the UI
|
|
3
|
+
* similar to existings event emitter such as 'onChange' or 'onClick'.
|
|
4
|
+
*/
|
|
5
|
+
class MyEventEmitter {
|
|
6
|
+
#events;
|
|
7
|
+
|
|
8
|
+
/** .
|
|
9
|
+
* .
|
|
10
|
+
* .
|
|
11
|
+
* Default constructor, intializes an empty object to store events
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
*/
|
|
15
|
+
constructor() {
|
|
16
|
+
this.#events = {};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The external API for this class. Gets called with an event name and a callback function that is fired when the event is emitted.
|
|
21
|
+
*
|
|
22
|
+
* @param name
|
|
23
|
+
* @param listener
|
|
24
|
+
* @example
|
|
25
|
+
*/
|
|
26
|
+
on(name, listener) {
|
|
27
|
+
if (!this.#events[name]) {
|
|
28
|
+
this.#events[name] = [];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
this.#events[name].push(listener);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** .
|
|
35
|
+
* .
|
|
36
|
+
* .
|
|
37
|
+
* Function to remove a listener that was previously set
|
|
38
|
+
*
|
|
39
|
+
* @param {*} name
|
|
40
|
+
* @param {*} listenerToRemove
|
|
41
|
+
* @example
|
|
42
|
+
*/
|
|
43
|
+
removeListener(name, listenerToRemove) {
|
|
44
|
+
if (!this.#events[name]) {
|
|
45
|
+
throw new Error(`Can't remove a listener. Event "${name}" doesn't exits.`);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
*
|
|
50
|
+
* @param listener
|
|
51
|
+
* @example
|
|
52
|
+
*/
|
|
53
|
+
const filterListeners = listener => listener !== listenerToRemove;
|
|
54
|
+
|
|
55
|
+
this.#events[name] = this.#events[name].filter(filterListeners);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The internal API for this class. Gets called with an event name and a data object.
|
|
60
|
+
* Any callbacks that have been set to listen to the matching event are dispatched.
|
|
61
|
+
*
|
|
62
|
+
* @param name
|
|
63
|
+
* @param data
|
|
64
|
+
* @example
|
|
65
|
+
*/
|
|
66
|
+
emit(name, data) {
|
|
67
|
+
if (!this.#events[name]) {
|
|
68
|
+
throw new Error(`Can't emit an event. Event "${name}" doesn't exits.`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
*
|
|
73
|
+
* @param {*} callback
|
|
74
|
+
*/
|
|
75
|
+
const fireCallbacks = callback => {
|
|
76
|
+
callback(data);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
this.#events[name].forEach(fireCallbacks);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export default MyEventEmitter;
|