speaker-calibration 2.2.256 → 2.2.258
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/index.html +123 -123
- package/coverage/lcov-report/prettify.css +101 -101
- package/coverage/lcov-report/prettify.js +937 -937
- 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/example/NoSleep.min.js +1 -1
- package/dist/example/fetch-languages-sheets.js +77 -77
- package/dist/example/i18n.js +29038 -29654
- package/dist/example/index.html +47 -47
- package/dist/example/listener.html +81 -81
- 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 +152 -152
- package/dist/listener.js +3 -3
- package/dist/main.js +9 -9
- 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/dist/phonePeer.js +3 -3
- 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.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.svg +1829 -1829
- package/doc/fonts/OpenSans-BoldItalic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Italic-webfont.svg +1829 -1829
- package/doc/fonts/OpenSans-Light-webfont.svg +1830 -1830
- package/doc/fonts/OpenSans-LightItalic-webfont.svg +1834 -1834
- package/doc/fonts/OpenSans-Regular-webfont.svg +1830 -1830
- 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/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/PhonePeer.js +499 -499
- package/src/listener-app/listener.js +380 -380
- package/src/main.js +22 -22
- package/src/myEventEmitter.js +83 -83
- package/src/peer-connection/audioPeer.js +100 -100
- package/src/peer-connection/listener.js +298 -298
- package/src/peer-connection/peerErrors.js +25 -25
- package/src/peer-connection/speaker.js +983 -983
- package/src/powerCheck.js +110 -110
- package/src/server/PythonServerAPI.js +1001 -1001
- package/src/tasks/combination/combination.js +3935 -3918
- 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 +215 -205
- package/webpack.config.js +65 -65
- package/.github/workflows/update-phrases.yml +0 -37
- package/makefile +0 -74
package/src/utils.js
CHANGED
|
@@ -1,205 +1,215 @@
|
|
|
1
|
-
import Swal from "sweetalert2";
|
|
2
|
-
//import {phrases} from '../dist/example/i18n.js';
|
|
3
|
-
/** .
|
|
4
|
-
* .
|
|
5
|
-
* .
|
|
6
|
-
* Utlity function to pause execution for a given time
|
|
7
|
-
*
|
|
8
|
-
* @param {number} seconds
|
|
9
|
-
* @returns {Promise}
|
|
10
|
-
* @example
|
|
11
|
-
*/
|
|
12
|
-
const sleep = seconds =>
|
|
13
|
-
new Promise(resolve => {
|
|
14
|
-
setTimeout(resolve, seconds * 1000);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
/** .
|
|
18
|
-
* .
|
|
19
|
-
* .
|
|
20
|
-
* Uiltity function to create and save a CSV file from a buffer
|
|
21
|
-
*
|
|
22
|
-
* @param {*} data
|
|
23
|
-
* @param {*} filename
|
|
24
|
-
* @example
|
|
25
|
-
*/
|
|
26
|
-
const saveToCSV = (data, filename = 'recordedMLSignal.csv') => {
|
|
27
|
-
// console.log(data)
|
|
28
|
-
let csvContent = 'data:text/csv;charset=utf-8,';
|
|
29
|
-
|
|
30
|
-
data.forEach((val, idx) => {
|
|
31
|
-
csvContent += `${idx},${val}\r\n`;
|
|
32
|
-
});
|
|
33
|
-
const encodedUri = encodeURI(csvContent);
|
|
34
|
-
const link = document.createElement('a');
|
|
35
|
-
link.setAttribute('href', encodedUri);
|
|
36
|
-
link.setAttribute('download', filename);
|
|
37
|
-
document.body.appendChild(link);
|
|
38
|
-
link.click();
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const saveToJSON = (data, filename = 'recordedMLSignal.json') => {
|
|
42
|
-
const jsonData = JSON.stringify(data, null, 2);
|
|
43
|
-
const blob = new Blob([jsonData], { type: 'application/json' });
|
|
44
|
-
const url = URL.createObjectURL(blob);
|
|
45
|
-
const link = document.createElement('a');
|
|
46
|
-
link.setAttribute('href', url);
|
|
47
|
-
link.setAttribute('download', filename);
|
|
48
|
-
document.body.appendChild(link);
|
|
49
|
-
link.click();
|
|
50
|
-
URL.revokeObjectURL(url);
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
/** .
|
|
55
|
-
* .
|
|
56
|
-
* .
|
|
57
|
-
* Utility function to create a buffer from a CSV file
|
|
58
|
-
*
|
|
59
|
-
* @param {*} csvString
|
|
60
|
-
* @param {*} delimiter
|
|
61
|
-
* @returns
|
|
62
|
-
* @example
|
|
63
|
-
*/
|
|
64
|
-
const csvToArray = (csvString, delimiter = ',') =>
|
|
65
|
-
csvString
|
|
66
|
-
.trim()
|
|
67
|
-
.split('\n')
|
|
68
|
-
.map(row => parseFloat(row.trim().split(delimiter)[1]));
|
|
69
|
-
|
|
70
|
-
const findMinValue = (array) => {
|
|
71
|
-
let minValue = array[0];
|
|
72
|
-
for (let i = 1; i < array.length; i++) {
|
|
73
|
-
if (array[i] < minValue) {
|
|
74
|
-
minValue = array[i];
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
return minValue;
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const findMaxValue = (array) => {
|
|
81
|
-
let maxValue = array[0];
|
|
82
|
-
for (let i = 1; i < array.length; i++) {
|
|
83
|
-
if (array[i] > maxValue) {
|
|
84
|
-
maxValue = array[i];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
return maxValue;
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
export const getCurrentTimeString = () => {
|
|
91
|
-
const date = new Date();
|
|
92
|
-
|
|
93
|
-
// Get the date string in the user's locale
|
|
94
|
-
const dateOptions = {
|
|
95
|
-
year: "numeric",
|
|
96
|
-
month: "long",
|
|
97
|
-
day: "numeric",
|
|
98
|
-
timeZoneName: "longOffset",
|
|
99
|
-
hour: "numeric",
|
|
100
|
-
minute: "numeric",
|
|
101
|
-
};
|
|
102
|
-
const dateString = date.toLocaleDateString(undefined, dateOptions);
|
|
103
|
-
|
|
104
|
-
return dateString.replace("at ", "");
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const standardDeviation = (values) => {
|
|
108
|
-
const avg = average(values);
|
|
109
|
-
|
|
110
|
-
const squareDiffs = values.map((value) => {
|
|
111
|
-
const diff = value - avg;
|
|
112
|
-
const sqrDiff = diff * diff;
|
|
113
|
-
return sqrDiff;
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
const avgSquareDiff = average(squareDiffs);
|
|
117
|
-
|
|
118
|
-
const stdDev = Math.sqrt(avgSquareDiff);
|
|
119
|
-
// only 1 digit after the decimal place
|
|
120
|
-
const std = Math.round(stdDev * 10) / 10;
|
|
121
|
-
return std.toFixed(1);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
const average = (data) => {
|
|
125
|
-
const sum = data.reduce((sum, value) => {
|
|
126
|
-
return sum + value;
|
|
127
|
-
}, 0);
|
|
128
|
-
|
|
129
|
-
const avg = sum / data.length;
|
|
130
|
-
return avg;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
function interpolate(x, x0, x1, y0, y1) {
|
|
134
|
-
return y0 + (y1 - y0) * (x - x0) / (x1 - x0);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
export const formatLineBreak =(inputStr,checkInternetConnection) => {
|
|
138
|
-
let finalStr = inputStr
|
|
139
|
-
.replace(/\n/g, '<br>')
|
|
140
|
-
.replace('LLL',
|
|
141
|
-
`<a href="#" id="check-connection">${checkInternetConnection}</a>`);
|
|
142
|
-
|
|
143
|
-
console.log(finalStr);
|
|
144
|
-
|
|
145
|
-
return finalStr;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
export const createAndShowPopup = (lang, phrases) => {
|
|
151
|
-
console.log(`
|
|
152
|
-
<div style="text-align: left;">
|
|
153
|
-
${convertAsterisksToList(phrases.RC_NeedInternetConnectedPhone[lang].replace(/\n/g, '<br>'))}
|
|
154
|
-
</div>
|
|
155
|
-
<div class="col-3" style="margin-top:10px;">
|
|
156
|
-
<button id="okaybtn" class="btn btn-lg btn-dark">
|
|
157
|
-
${phrases.EE_ok[lang]}
|
|
158
|
-
</button>
|
|
159
|
-
</div>`);
|
|
160
|
-
Swal.fire({
|
|
161
|
-
html: `
|
|
162
|
-
<div style="text-align: left;">
|
|
163
|
-
${convertAsterisksToList(phrases.RC_NeedInternetConnectedPhone[lang].replace(/\n/g, '<br>'))}
|
|
164
|
-
</div>
|
|
165
|
-
<div class="col-3" style="margin-top:10px;">
|
|
166
|
-
<button id="okaybtn" class="btn btn-lg btn-dark">
|
|
167
|
-
${phrases.EE_ok[lang]}
|
|
168
|
-
</button>
|
|
169
|
-
</div>`,
|
|
170
|
-
showConfirmButton: false,
|
|
171
|
-
position: 'bottom',
|
|
172
|
-
width: "40%",
|
|
173
|
-
customClass: {
|
|
174
|
-
container:'no-background',
|
|
175
|
-
},
|
|
176
|
-
showClass: {
|
|
177
|
-
popup: "fade-in",
|
|
178
|
-
},
|
|
179
|
-
hideClass: {
|
|
180
|
-
popup: "",
|
|
181
|
-
},
|
|
182
|
-
didOpen: () => {
|
|
183
|
-
const okayBtn = document.getElementById("okaybtn");
|
|
184
|
-
okayBtn.style.display = "flex";
|
|
185
|
-
okayBtn.addEventListener('click', () => {
|
|
186
|
-
Swal.close(); // Close the Swal popup
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
};
|
|
191
|
-
|
|
192
|
-
export function convertAsterisksToList(content) {
|
|
193
|
-
// Replace * with <li> and convert line breaks to </li><li>
|
|
194
|
-
console.log(content);
|
|
195
|
-
let result = content
|
|
196
|
-
.replace(/\* (.*?)(<br>|$)/g, '<li>$1</li>')
|
|
197
|
-
.replace(/(<li>)(<\/li>)\s*$/, '') // Remove trailing </li>
|
|
198
|
-
.replace('<li>', '<ul style="padding-left:40px"> <br> <li>');
|
|
199
|
-
result = result.replace('</li>5', '</li></ul>5');
|
|
200
|
-
return result;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
1
|
+
import Swal from "sweetalert2";
|
|
2
|
+
//import {phrases} from '../dist/example/i18n.js';
|
|
3
|
+
/** .
|
|
4
|
+
* .
|
|
5
|
+
* .
|
|
6
|
+
* Utlity function to pause execution for a given time
|
|
7
|
+
*
|
|
8
|
+
* @param {number} seconds
|
|
9
|
+
* @returns {Promise}
|
|
10
|
+
* @example
|
|
11
|
+
*/
|
|
12
|
+
const sleep = seconds =>
|
|
13
|
+
new Promise(resolve => {
|
|
14
|
+
setTimeout(resolve, seconds * 1000);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
/** .
|
|
18
|
+
* .
|
|
19
|
+
* .
|
|
20
|
+
* Uiltity function to create and save a CSV file from a buffer
|
|
21
|
+
*
|
|
22
|
+
* @param {*} data
|
|
23
|
+
* @param {*} filename
|
|
24
|
+
* @example
|
|
25
|
+
*/
|
|
26
|
+
const saveToCSV = (data, filename = 'recordedMLSignal.csv') => {
|
|
27
|
+
// console.log(data)
|
|
28
|
+
let csvContent = 'data:text/csv;charset=utf-8,';
|
|
29
|
+
|
|
30
|
+
data.forEach((val, idx) => {
|
|
31
|
+
csvContent += `${idx},${val}\r\n`;
|
|
32
|
+
});
|
|
33
|
+
const encodedUri = encodeURI(csvContent);
|
|
34
|
+
const link = document.createElement('a');
|
|
35
|
+
link.setAttribute('href', encodedUri);
|
|
36
|
+
link.setAttribute('download', filename);
|
|
37
|
+
document.body.appendChild(link);
|
|
38
|
+
link.click();
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const saveToJSON = (data, filename = 'recordedMLSignal.json') => {
|
|
42
|
+
const jsonData = JSON.stringify(data, null, 2);
|
|
43
|
+
const blob = new Blob([jsonData], { type: 'application/json' });
|
|
44
|
+
const url = URL.createObjectURL(blob);
|
|
45
|
+
const link = document.createElement('a');
|
|
46
|
+
link.setAttribute('href', url);
|
|
47
|
+
link.setAttribute('download', filename);
|
|
48
|
+
document.body.appendChild(link);
|
|
49
|
+
link.click();
|
|
50
|
+
URL.revokeObjectURL(url);
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
/** .
|
|
55
|
+
* .
|
|
56
|
+
* .
|
|
57
|
+
* Utility function to create a buffer from a CSV file
|
|
58
|
+
*
|
|
59
|
+
* @param {*} csvString
|
|
60
|
+
* @param {*} delimiter
|
|
61
|
+
* @returns
|
|
62
|
+
* @example
|
|
63
|
+
*/
|
|
64
|
+
const csvToArray = (csvString, delimiter = ',') =>
|
|
65
|
+
csvString
|
|
66
|
+
.trim()
|
|
67
|
+
.split('\n')
|
|
68
|
+
.map(row => parseFloat(row.trim().split(delimiter)[1]));
|
|
69
|
+
|
|
70
|
+
const findMinValue = (array) => {
|
|
71
|
+
let minValue = array[0];
|
|
72
|
+
for (let i = 1; i < array.length; i++) {
|
|
73
|
+
if (array[i] < minValue) {
|
|
74
|
+
minValue = array[i];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return minValue;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const findMaxValue = (array) => {
|
|
81
|
+
let maxValue = array[0];
|
|
82
|
+
for (let i = 1; i < array.length; i++) {
|
|
83
|
+
if (array[i] > maxValue) {
|
|
84
|
+
maxValue = array[i];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return maxValue;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const getCurrentTimeString = () => {
|
|
91
|
+
const date = new Date();
|
|
92
|
+
|
|
93
|
+
// Get the date string in the user's locale
|
|
94
|
+
const dateOptions = {
|
|
95
|
+
year: "numeric",
|
|
96
|
+
month: "long",
|
|
97
|
+
day: "numeric",
|
|
98
|
+
timeZoneName: "longOffset",
|
|
99
|
+
hour: "numeric",
|
|
100
|
+
minute: "numeric",
|
|
101
|
+
};
|
|
102
|
+
const dateString = date.toLocaleDateString(undefined, dateOptions);
|
|
103
|
+
|
|
104
|
+
return dateString.replace("at ", "");
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
const standardDeviation = (values) => {
|
|
108
|
+
const avg = average(values);
|
|
109
|
+
|
|
110
|
+
const squareDiffs = values.map((value) => {
|
|
111
|
+
const diff = value - avg;
|
|
112
|
+
const sqrDiff = diff * diff;
|
|
113
|
+
return sqrDiff;
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const avgSquareDiff = average(squareDiffs);
|
|
117
|
+
|
|
118
|
+
const stdDev = Math.sqrt(avgSquareDiff);
|
|
119
|
+
// only 1 digit after the decimal place
|
|
120
|
+
const std = Math.round(stdDev * 10) / 10;
|
|
121
|
+
return std.toFixed(1);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const average = (data) => {
|
|
125
|
+
const sum = data.reduce((sum, value) => {
|
|
126
|
+
return sum + value;
|
|
127
|
+
}, 0);
|
|
128
|
+
|
|
129
|
+
const avg = sum / data.length;
|
|
130
|
+
return avg;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
function interpolate(x, x0, x1, y0, y1) {
|
|
134
|
+
return y0 + (y1 - y0) * (x - x0) / (x1 - x0);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const formatLineBreak =(inputStr,checkInternetConnection) => {
|
|
138
|
+
let finalStr = inputStr
|
|
139
|
+
.replace(/\n/g, '<br>')
|
|
140
|
+
.replace('LLL',
|
|
141
|
+
`<a href="#" id="check-connection">${checkInternetConnection}</a>`);
|
|
142
|
+
|
|
143
|
+
console.log(finalStr);
|
|
144
|
+
|
|
145
|
+
return finalStr;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
export const createAndShowPopup = (lang, phrases) => {
|
|
151
|
+
console.log(`
|
|
152
|
+
<div style="text-align: left;">
|
|
153
|
+
${convertAsterisksToList(phrases.RC_NeedInternetConnectedPhone[lang].replace(/\n/g, '<br>'))}
|
|
154
|
+
</div>
|
|
155
|
+
<div class="col-3" style="margin-top:10px;">
|
|
156
|
+
<button id="okaybtn" class="btn btn-lg btn-dark">
|
|
157
|
+
${phrases.EE_ok[lang]}
|
|
158
|
+
</button>
|
|
159
|
+
</div>`);
|
|
160
|
+
Swal.fire({
|
|
161
|
+
html: `
|
|
162
|
+
<div style="text-align: left;">
|
|
163
|
+
${convertAsterisksToList(phrases.RC_NeedInternetConnectedPhone[lang].replace(/\n/g, '<br>'))}
|
|
164
|
+
</div>
|
|
165
|
+
<div class="col-3" style="margin-top:10px;">
|
|
166
|
+
<button id="okaybtn" class="btn btn-lg btn-dark">
|
|
167
|
+
${phrases.EE_ok[lang]}
|
|
168
|
+
</button>
|
|
169
|
+
</div>`,
|
|
170
|
+
showConfirmButton: false,
|
|
171
|
+
position: 'bottom',
|
|
172
|
+
width: "40%",
|
|
173
|
+
customClass: {
|
|
174
|
+
container:'no-background',
|
|
175
|
+
},
|
|
176
|
+
showClass: {
|
|
177
|
+
popup: "fade-in",
|
|
178
|
+
},
|
|
179
|
+
hideClass: {
|
|
180
|
+
popup: "",
|
|
181
|
+
},
|
|
182
|
+
didOpen: () => {
|
|
183
|
+
const okayBtn = document.getElementById("okaybtn");
|
|
184
|
+
okayBtn.style.display = "flex";
|
|
185
|
+
okayBtn.addEventListener('click', () => {
|
|
186
|
+
Swal.close(); // Close the Swal popup
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
export function convertAsterisksToList(content) {
|
|
193
|
+
// Replace * with <li> and convert line breaks to </li><li>
|
|
194
|
+
console.log(content);
|
|
195
|
+
let result = content
|
|
196
|
+
.replace(/\* (.*?)(<br>|$)/g, '<li>$1</li>')
|
|
197
|
+
.replace(/(<li>)(<\/li>)\s*$/, '') // Remove trailing </li>
|
|
198
|
+
.replace('<li>', '<ul style="padding-left:40px"> <br> <li>');
|
|
199
|
+
result = result.replace('</li>5', '</li></ul>5');
|
|
200
|
+
return result;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export const reorderMLS = (mlsSignal, preSec, sourceSamplingRate) => {
|
|
204
|
+
// Number of samples to move
|
|
205
|
+
const numSamplesToMove = Math.round(preSec * sourceSamplingRate);
|
|
206
|
+
if (numSamplesToMove <= 0 || numSamplesToMove >= mlsSignal.length) {
|
|
207
|
+
// Nothing to reorder, return original
|
|
208
|
+
return mlsSignal;
|
|
209
|
+
}
|
|
210
|
+
const lastPart = mlsSignal.slice(-numSamplesToMove);
|
|
211
|
+
const firstPart = mlsSignal.slice(0, mlsSignal.length - numSamplesToMove);
|
|
212
|
+
return lastPart.concat(firstPart);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export {sleep, saveToCSV, saveToJSON, csvToArray,findMinValue,findMaxValue, standardDeviation, interpolate};
|
package/webpack.config.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');
|
|
3
|
-
|
|
4
|
-
const config = {
|
|
5
|
-
entry: {
|
|
6
|
-
main: './src/main.js',
|
|
7
|
-
listener: './src/listener-app/listener.js',
|
|
8
|
-
phonePeer: './src/listener-app/PhonePeer.js',
|
|
9
|
-
},
|
|
10
|
-
output: {
|
|
11
|
-
path: path.resolve(__dirname, 'dist'),
|
|
12
|
-
filename: '[name].js',
|
|
13
|
-
library: {
|
|
14
|
-
name: 'speakerCalibrator',
|
|
15
|
-
type: 'umd',
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
module: {
|
|
19
|
-
rules: [
|
|
20
|
-
{
|
|
21
|
-
// If you have .mjs files, use test: /\.m?js$/,
|
|
22
|
-
test: /\.js$/,
|
|
23
|
-
exclude: /node_modules/,
|
|
24
|
-
use: {
|
|
25
|
-
loader: 'babel-loader',
|
|
26
|
-
options: {
|
|
27
|
-
// You can also move this config into a separate .babelrc or babel.config.js file
|
|
28
|
-
presets: [
|
|
29
|
-
[
|
|
30
|
-
'@babel/preset-env',
|
|
31
|
-
{
|
|
32
|
-
// Adjust your target browsers as needed
|
|
33
|
-
targets: {
|
|
34
|
-
ios: '12',
|
|
35
|
-
},
|
|
36
|
-
// This config tells Babel to automatically include necessary polyfills
|
|
37
|
-
// for features you use, referencing core-js where needed
|
|
38
|
-
useBuiltIns: 'usage',
|
|
39
|
-
corejs: '3',
|
|
40
|
-
},
|
|
41
|
-
],
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
test: /\.css$/,
|
|
48
|
-
use: ['style-loader', 'css-loader'],
|
|
49
|
-
},
|
|
50
|
-
],
|
|
51
|
-
},
|
|
52
|
-
plugins: [],
|
|
53
|
-
resolve: {
|
|
54
|
-
fallback: {
|
|
55
|
-
path: require.resolve('path-browserify'),
|
|
56
|
-
fs: false,
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
if (process.env.WEBPACK_ANALYZE === 'true') {
|
|
62
|
-
config.plugins.push(new BundleAnalyzerPlugin());
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
module.exports = config;
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const {BundleAnalyzerPlugin} = require('webpack-bundle-analyzer');
|
|
3
|
+
|
|
4
|
+
const config = {
|
|
5
|
+
entry: {
|
|
6
|
+
main: './src/main.js',
|
|
7
|
+
listener: './src/listener-app/listener.js',
|
|
8
|
+
phonePeer: './src/listener-app/PhonePeer.js',
|
|
9
|
+
},
|
|
10
|
+
output: {
|
|
11
|
+
path: path.resolve(__dirname, 'dist'),
|
|
12
|
+
filename: '[name].js',
|
|
13
|
+
library: {
|
|
14
|
+
name: 'speakerCalibrator',
|
|
15
|
+
type: 'umd',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
module: {
|
|
19
|
+
rules: [
|
|
20
|
+
{
|
|
21
|
+
// If you have .mjs files, use test: /\.m?js$/,
|
|
22
|
+
test: /\.js$/,
|
|
23
|
+
exclude: /node_modules/,
|
|
24
|
+
use: {
|
|
25
|
+
loader: 'babel-loader',
|
|
26
|
+
options: {
|
|
27
|
+
// You can also move this config into a separate .babelrc or babel.config.js file
|
|
28
|
+
presets: [
|
|
29
|
+
[
|
|
30
|
+
'@babel/preset-env',
|
|
31
|
+
{
|
|
32
|
+
// Adjust your target browsers as needed
|
|
33
|
+
targets: {
|
|
34
|
+
ios: '12',
|
|
35
|
+
},
|
|
36
|
+
// This config tells Babel to automatically include necessary polyfills
|
|
37
|
+
// for features you use, referencing core-js where needed
|
|
38
|
+
useBuiltIns: 'usage',
|
|
39
|
+
corejs: '3',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
test: /\.css$/,
|
|
48
|
+
use: ['style-loader', 'css-loader'],
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
plugins: [],
|
|
53
|
+
resolve: {
|
|
54
|
+
fallback: {
|
|
55
|
+
path: require.resolve('path-browserify'),
|
|
56
|
+
fs: false,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
if (process.env.WEBPACK_ANALYZE === 'true') {
|
|
62
|
+
config.plugins.push(new BundleAnalyzerPlugin());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = config;
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
name: Update International Phrases
|
|
2
|
-
|
|
3
|
-
on: workflow_dispatch
|
|
4
|
-
|
|
5
|
-
jobs:
|
|
6
|
-
phrases:
|
|
7
|
-
runs-on: ubuntu-latest
|
|
8
|
-
steps:
|
|
9
|
-
- uses: actions/checkout@v3
|
|
10
|
-
- uses: actions/setup-node@v3
|
|
11
|
-
with:
|
|
12
|
-
node-version: 16
|
|
13
|
-
- name: Set commit account information
|
|
14
|
-
run: |
|
|
15
|
-
git config --global user.name "github-actions[bot]"
|
|
16
|
-
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
17
|
-
- name: Installs
|
|
18
|
-
run: |
|
|
19
|
-
npm install
|
|
20
|
-
- name: Decrypt credentials
|
|
21
|
-
run: |
|
|
22
|
-
gpg --quiet --batch --yes --passphrase="${{secrets.google_api_pw}}" \
|
|
23
|
-
--output dist/example/credentials.json \
|
|
24
|
-
--decrypt dist/example/credentials.json.gpg
|
|
25
|
-
- name: Fetch and update phrases
|
|
26
|
-
run: |
|
|
27
|
-
npm run phrases
|
|
28
|
-
- name: Remove credentials
|
|
29
|
-
run: |
|
|
30
|
-
rm dist/example/credentials.json
|
|
31
|
-
- name: Commit and push changes
|
|
32
|
-
run: |
|
|
33
|
-
git status
|
|
34
|
-
git add -A
|
|
35
|
-
git commit -m 'github action: update phrases' --no-verify
|
|
36
|
-
git remote set-url origin https://x-access-token:${{secrets.ci_token}}@github.com/EasyEyes/speaker-calibration
|
|
37
|
-
git push
|
package/makefile
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
##################################### UTILITIES ######################################
|
|
2
|
-
COM_COLOR = \033[0;34m
|
|
3
|
-
OBJ_COLOR = \033[0;36m
|
|
4
|
-
OK_COLOR = \033[0;32m
|
|
5
|
-
ERROR_COLOR = \033[0;31m
|
|
6
|
-
WARN_COLOR = \033[0;33m
|
|
7
|
-
NO_COLOR = \033[m
|
|
8
|
-
|
|
9
|
-
OK_STRING = "[OK]"
|
|
10
|
-
ERROR_STRING = "[ERROR]"
|
|
11
|
-
WARN_STRING = "[WARNING]"
|
|
12
|
-
COM_STRING = "Compiling..."
|
|
13
|
-
|
|
14
|
-
define run_and_test
|
|
15
|
-
printf "%b" "$(COM_COLOR)$(COM_STRING) $(OBJ_COLOR)$(@F)$(NO_COLOR)\r"; \
|
|
16
|
-
$(1) 2> $@.log; \
|
|
17
|
-
RESULT=$$?; \
|
|
18
|
-
if [ $$RESULT -ne 0 ]; then \
|
|
19
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $@" "$(ERROR_COLOR)$(ERROR_STRING)$(NO_COLOR)\n" ; \
|
|
20
|
-
elif [ -s $@.log ]; then \
|
|
21
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $@" "$(WARN_COLOR)$(WARN_STRING)$(NO_COLOR)\n" ; \
|
|
22
|
-
else \
|
|
23
|
-
printf "%-60b%b" "$(COM_COLOR)$(COM_STRING)$(OBJ_COLOR) $(@F)" "$(OK_COLOR)$(OK_STRING)$(NO_COLOR)\n" ; \
|
|
24
|
-
fi; \
|
|
25
|
-
cat $@.log; \
|
|
26
|
-
rm -f $@.log; \
|
|
27
|
-
exit $$RESULT
|
|
28
|
-
endef
|
|
29
|
-
|
|
30
|
-
##################################### WASM ########################################
|
|
31
|
-
PROJECT_NAME = mlsGen
|
|
32
|
-
|
|
33
|
-
# directories
|
|
34
|
-
DIST_DIR = ./dist/
|
|
35
|
-
SRC_DIR = $(addprefix ./src/tasks/impulse-response/,$(PROJECT_NAME)/)
|
|
36
|
-
|
|
37
|
-
# WASM files
|
|
38
|
-
SRC_FILE := $(addprefix $(SRC_DIR),$(PROJECT_NAME).cpp) # SRC_DIR + PROJECT_NAME + .cpp
|
|
39
|
-
OBJ_FILE := $(addprefix $(SRC_DIR),$(PROJECT_NAME).o)
|
|
40
|
-
OUTPUT_WASM_JS := $(addprefix $(DIST_DIR),$(PROJECT_NAME).js) # DIST_DIR + PROJECT_NAME + .js
|
|
41
|
-
OUTPUT_WASM := $(addprefix $(DIST_DIR),$(PROJECT_NAME).wasm) # DIST_DIR + PROJECT_NAME + .wasm
|
|
42
|
-
OUTPUT := $(addprefix $(DIST_DIR),$(PROJECT_NAME).*) # DIST_DIR + PROJECT_NAME + .*
|
|
43
|
-
|
|
44
|
-
# emcc compiler options
|
|
45
|
-
EMCC = em++ # emcc compiler front end
|
|
46
|
-
STD = --std=c++17 # C++ standard
|
|
47
|
-
OPTIMIZE = -O3 # Optimization level O0 ~ 28.8 kB, O1 ~ 20.3 kB, O2 ~ 20.3 kB, O3 ~ 19.7 kB
|
|
48
|
-
ENV = -s ENVIRONMENT='web' # environment
|
|
49
|
-
NOENTRY = --no-entry # no entry point (no main function)
|
|
50
|
-
MODULARIZE = -s MODULARIZE=1 -s 'EXPORT_NAME="createMLSGenModule"' # puts all of the generated JavaScript into a factory function
|
|
51
|
-
BIND = -lembind # links against embind library
|
|
52
|
-
MEMORY_CHECKS = -s ASSERTIONS=1 -fsanitize=address -g2
|
|
53
|
-
|
|
54
|
-
# gcc compiler options
|
|
55
|
-
GCC = gcc # gcc compiler front end
|
|
56
|
-
|
|
57
|
-
# KISSFFT Library
|
|
58
|
-
KISS_LIB= /Users/hugo/Desktop/dev/easyeyes/speaker-calibration/src/tasks/impulse-response/kissfft/libkissfft-float.a
|
|
59
|
-
KISS_H= -I /Users/hugo/Desktop/dev/easyeyes/speaker-calibration/src/tasks/impulse-response/kissfft/
|
|
60
|
-
|
|
61
|
-
# build the WASM + JS glue module, linked with embind
|
|
62
|
-
$(PROJECT_NAME)_bind: # $(OBJ_FILE)
|
|
63
|
-
@mkdir -p $(@D)
|
|
64
|
-
@$(call run_and_test, $(EMCC) $(STD) $(BIND) $(SRC_FILE) -o $(OUTPUT_WASM_JS) $(MODULARIZE) $(OPTIMIZE) $(ENV) $(MEMORY_CHECKS) $(KISS_H) $(KISS_LIB))
|
|
65
|
-
|
|
66
|
-
# clean the WASM + JS files
|
|
67
|
-
.PHONY: clean
|
|
68
|
-
clean:
|
|
69
|
-
@mkdir -p $(@D)
|
|
70
|
-
@$(call run_and_test, rm -f $(OUTPUT))
|
|
71
|
-
|
|
72
|
-
.PHONY: rebuild
|
|
73
|
-
rebuild:
|
|
74
|
-
@make clean; make $(PROJECT_NAME)_bind
|