speaker-calibration 2.0.0 → 2.1.1

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.
Files changed (126) hide show
  1. package/.eslintignore +72 -0
  2. package/.eslintrc.json +40 -0
  3. package/.gitignore +78 -0
  4. package/.prettierignore +70 -0
  5. package/.prettierrc +15 -0
  6. package/LICENSE +20 -20
  7. package/README.md +133 -133
  8. package/__mocks__/fileMock.js +1 -0
  9. package/__mocks__/styleMock.js +1 -0
  10. package/babel.config.js +3 -0
  11. package/coverage/clover.xml +71 -0
  12. package/coverage/coverage-final.json +224 -0
  13. package/coverage/lcov-report/PythonServerInterface.js.html +265 -0
  14. package/coverage/lcov-report/base.css +354 -0
  15. package/coverage/lcov-report/block-navigation.js +82 -0
  16. package/coverage/lcov-report/favicon.png +0 -0
  17. package/coverage/lcov-report/index.html +123 -0
  18. package/coverage/lcov-report/prettify.css +101 -0
  19. package/coverage/lcov-report/prettify.js +937 -0
  20. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  21. package/coverage/lcov-report/sorter.js +189 -0
  22. package/coverage/lcov-report/src/index.html +121 -0
  23. package/coverage/lcov-report/src/server/PythonServerInterface.js.html +268 -0
  24. package/coverage/lcov-report/src/server/index.html +123 -0
  25. package/coverage/lcov-report/src/tasks/audioCalibrator.js.html +499 -0
  26. package/coverage/lcov-report/src/tasks/audioRecorder.js.html +412 -0
  27. package/coverage/lcov-report/src/tasks/index.html +143 -0
  28. package/coverage/lcov-report/src/tasks/volume/index.html +123 -0
  29. package/coverage/lcov-report/src/tasks/volume/volume.js.html +409 -0
  30. package/coverage/lcov-report/src/utils.js.html +172 -0
  31. package/coverage/lcov.info +91 -0
  32. package/dist/example/Queen-Bohemian_Rhapsody.wav +0 -0
  33. package/dist/example/Queen-Bohemian_Rhapsody_g_filtered.wav +0 -0
  34. package/dist/example/index.html +47 -0
  35. package/dist/example/listener.html +89 -0
  36. package/dist/example/server.js +49 -0
  37. package/dist/example/speaker.html +126 -0
  38. package/dist/example/speakerUI.js +217 -0
  39. package/dist/example/styles.css +40 -0
  40. package/dist/main.js +913 -1
  41. package/dist/mlsGen.js +6814 -6814
  42. package/dist/mlsGen.wasm +0 -0
  43. package/doc/AudioCalibrator.html +417 -0
  44. package/doc/AudioPeer.html +251 -0
  45. package/doc/AudioRecorder.html +195 -0
  46. package/doc/ImpulseResponse.html +215 -0
  47. package/doc/Listener.html +308 -0
  48. package/doc/MlsGenInterface.html +226 -0
  49. package/doc/MyEventEmitter.html +274 -0
  50. package/doc/PythonServerAPI.html +109 -0
  51. package/doc/Speaker-Calibration-UML-Diagram.png +0 -0
  52. package/doc/Speaker.html +276 -0
  53. package/doc/Takes%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +128 -0
  54. package/doc/Takes%20the%20url%20of%20the%20current%20site%0Aand%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +138 -0
  55. package/doc/Takes%20the%20url%20of%20the%20current%20site%20and%20a%20target%20element%20where%20html%20elements%20will%20be%20appended..html +137 -0
  56. package/doc/Volume.html +88 -0
  57. package/doc/audioCalibrator.js.html +179 -0
  58. package/doc/audioPeer.js.html +175 -0
  59. package/doc/audioRecorder.js.html +163 -0
  60. package/doc/creates%20a%20new%20AudioRecorder%20instance.%20%0ASets%20up%20the%20audio%20context%20and%20file%20reader..html +114 -0
  61. package/doc/fonts/OpenSans-Bold-webfont.eot +0 -0
  62. package/doc/fonts/OpenSans-Bold-webfont.svg +1830 -0
  63. package/doc/fonts/OpenSans-Bold-webfont.woff +0 -0
  64. package/doc/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  65. package/doc/fonts/OpenSans-BoldItalic-webfont.svg +1830 -0
  66. package/doc/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  67. package/doc/fonts/OpenSans-Italic-webfont.eot +0 -0
  68. package/doc/fonts/OpenSans-Italic-webfont.svg +1830 -0
  69. package/doc/fonts/OpenSans-Italic-webfont.woff +0 -0
  70. package/doc/fonts/OpenSans-Light-webfont.eot +0 -0
  71. package/doc/fonts/OpenSans-Light-webfont.svg +1831 -0
  72. package/doc/fonts/OpenSans-Light-webfont.woff +0 -0
  73. package/doc/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  74. package/doc/fonts/OpenSans-LightItalic-webfont.svg +1835 -0
  75. package/doc/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  76. package/doc/fonts/OpenSans-Regular-webfont.eot +0 -0
  77. package/doc/fonts/OpenSans-Regular-webfont.svg +1831 -0
  78. package/doc/fonts/OpenSans-Regular-webfont.woff +0 -0
  79. package/doc/global.html +308 -0
  80. package/doc/index.html +58 -0
  81. package/doc/listener.js.html +170 -0
  82. package/doc/mlsGen_mlsGenInterface.js.html +117 -0
  83. package/doc/myEventEmitter.js.html +124 -0
  84. package/doc/peer-connection_audioPeer.js.html +188 -0
  85. package/doc/peer-connection_listener.js.html +311 -0
  86. package/doc/peer-connection_speaker.js.html +381 -0
  87. package/doc/sc-activity-diagram.png +0 -0
  88. package/doc/scripts/linenumber.js +25 -0
  89. package/doc/scripts/prettify/Apache-License-2.0.txt +202 -0
  90. package/doc/scripts/prettify/lang-css.js +24 -0
  91. package/doc/scripts/prettify/prettify.js +640 -0
  92. package/doc/server_PythonServerAPI.js.html +160 -0
  93. package/doc/speaker.js.html +248 -0
  94. package/doc/styles/jsdoc-default.css +371 -0
  95. package/doc/styles/prettify-jsdoc.css +111 -0
  96. package/doc/styles/prettify-tomorrow.css +163 -0
  97. package/doc/tasks_audioCalibrator.js.html +207 -0
  98. package/doc/tasks_audioRecorder.js.html +190 -0
  99. package/doc/tasks_impulse-response_impulseResponse.js.html +442 -0
  100. package/doc/tasks_impulse-response_mlsGen_mlsGenInterface.js.html +175 -0
  101. package/doc/tasks_volume_volume.js.html +185 -0
  102. package/doc/utils.js.html +105 -0
  103. package/jest.config.js +173 -0
  104. package/netlify.toml +27 -0
  105. package/package.json +67 -66
  106. package/src/index.html +21 -0
  107. package/src/main.js +21 -0
  108. package/src/myEventEmitter.js +83 -0
  109. package/src/peer-connection/audioPeer.js +151 -0
  110. package/src/peer-connection/listener.js +251 -0
  111. package/src/peer-connection/peerErrors.js +25 -0
  112. package/src/peer-connection/speaker.js +346 -0
  113. package/src/server/PythonServerAPI.js +155 -0
  114. package/src/tasks/audioCalibrator.js +218 -0
  115. package/src/tasks/audioRecorder.js +148 -0
  116. package/src/tasks/impulse-response/impulseResponse.js +436 -0
  117. package/src/tasks/impulse-response/mlsGen/mlsGen.cpp +99 -0
  118. package/src/tasks/impulse-response/mlsGen/mlsGen.hpp +304 -0
  119. package/src/tasks/impulse-response/mlsGen/mlsGenInterface.js +131 -0
  120. package/src/tasks/impulse-response/mlsGen/mlsGenTest.cpp +181 -0
  121. package/src/tasks/volume/volume.cpp +3 -0
  122. package/src/tasks/volume/volume.hpp +23 -0
  123. package/src/tasks/volume/volume.js +174 -0
  124. package/src/utils.js +55 -0
  125. package/webpack.config.js +37 -0
  126. package/README +0 -3
@@ -0,0 +1,175 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>JSDoc: Source: audioPeer.js</title>
6
+
7
+ <script src="scripts/prettify/prettify.js"></script>
8
+ <script src="scripts/prettify/lang-css.js"></script>
9
+ <!--[if lt IE 9]>
10
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
11
+ <![endif]-->
12
+ <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css" />
13
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css" />
14
+ </head>
15
+
16
+ <body>
17
+ <div id="main">
18
+ <h1 class="page-title">Source: audioPeer.js</h1>
19
+
20
+ <section>
21
+ <article>
22
+ <pre class="prettyprint source linenums"><code>import Peer from 'peerjs';
23
+
24
+ // TODO: this was already here before, but appears to be unused
25
+ const pressFeedbackURI =
26
+ 'data:audio/mpeg;base64,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VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV//uSZIIP9BFGHYksMlIAAA0gAAABAAABpAAAACAAADSAAAAEVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVQ==';
27
+
28
+ /**
29
+ * @typedef initParameters - Parameters for initializing the AudioPeer
30
+ * @type {object}
31
+ * @property {string} targetElementId - target element where new elements will be appended
32
+ * @property {string} siteUrl: the url of the current site
33
+ */
34
+ const initParameters = {
35
+ targetElementId: null,
36
+ siteUrl: null,
37
+ };
38
+
39
+ /**
40
+ * @class The first layer of abstraction on the PeerJS library.
41
+ * It meant to be extended by the two seperate client classes, Speaker and Listener.
42
+ * It implements the shared methods and properties of both classes.
43
+ */
44
+ class AudioPeer {
45
+ /**
46
+ * Creates an instance of AudioPeer
47
+ * Takes the url of the current site and a target element where html elements will be appended.
48
+ * @param {initParameters} params - see type definition for initParameters
49
+ */
50
+ constructor(param = initParameters) {
51
+ // PeerJS
52
+ /* Create the Peer object for our end of the connection. */
53
+ this.peer = new Peer(null, {debug: 2});
54
+ this.conn = null;
55
+ this.lastPeerId = null;
56
+
57
+ // Display information to HTML elem with given id
58
+ this.targetElement = param.targetElementId;
59
+
60
+ this.siteUrl = param.siteUrl;
61
+
62
+ // Store for all incoming data
63
+ this.dataStore = [];
64
+
65
+ // Create and play sounds using this audio context
66
+ this.sourceAudioContext = new (window.AudioContext ||
67
+ window.webkitAudioContext ||
68
+ window.audioContext)();
69
+ }
70
+
71
+ /**
72
+ * Helper method to display information to DOM element
73
+ * @param {string} message
74
+ * @param {boolean} append
75
+ */
76
+ displayUpdate = (message, append = false) => {
77
+ // If the specified elem exists, update that elem
78
+ if (document.getElementById(this.targetElement)) {
79
+ const displayElement = document.getElementById(this.targetElement);
80
+ if (append) {
81
+ displayElement.innerText += `\n${message}`;
82
+ } else {
83
+ displayElement.innerText = message;
84
+ }
85
+ } else {
86
+ console.log('MESSAGE: ', message);
87
+ }
88
+ };
89
+
90
+ /**
91
+ * Callback method for when a peer connection is lost
92
+ * saves the last peer id, last server id, and attempts to reconnect
93
+ */
94
+ onPeerDisconnected = () => {
95
+ this.displayUpdate('Connection lost. Please reconnect');
96
+
97
+ // Workaround for peer.reconnect deleting previous id
98
+ this.peer.id = this.lastPeerId;
99
+ // eslint-disable-next-line no-underscore-dangle
100
+ this.peer._lastServerId = this.lastPeerId;
101
+ this.peer.reconnect();
102
+ };
103
+
104
+ /**
105
+ * Callback method that cleans up after peer connection is closed
106
+ */
107
+ onPeerClose = () => {
108
+ this.displayUpdate('Connection closed');
109
+ this.conn = null;
110
+ };
111
+
112
+ /**
113
+ * Helper method for when an error occurs
114
+ * @param {*} err
115
+ */
116
+ onPeerError = err => {
117
+ this.displayUpdate(err);
118
+ console.log(`${err}`);
119
+ };
120
+
121
+ /**
122
+ * Helper method that converts url paramters to an object
123
+ * @returns {object}
124
+ */
125
+ parseURLSearchParams = () =>
126
+ // SOURCE: chickens, https://stackoverflow.com/questions/8648892/how-to-convert-url-parameters-to-a-javascript-object
127
+ // eslint-disable-next-line no-restricted-globals
128
+ Object.fromEntries(new URLSearchParams(location.search));
129
+
130
+ /**
131
+ * Helper method that converts an object to a query string
132
+ * @param {object} params
133
+ * @returns {string}
134
+ */
135
+ queryStringFromObject = params =>
136
+ Object.keys(params)
137
+ .map(key => `${key}=${params[key]}`)
138
+ .join('&amp;');
139
+
140
+ static keypressFeedbackSound = pressFeedbackURI;
141
+ }
142
+
143
+ export default AudioPeer;
144
+ </code></pre>
145
+ </article>
146
+ </section>
147
+ </div>
148
+
149
+ <nav>
150
+ <h2><a href="index.html">Home</a></h2>
151
+ <h3>Classes</h3>
152
+ <ul>
153
+ <li><a href="AudioCalibrator.html">AudioCalibrator</a></li>
154
+ <li><a href="AudioPeer.html">AudioPeer</a></li>
155
+ <li><a href="AudioRecorder.html">AudioRecorder</a></li>
156
+ <li><a href="Listener.html">Listener</a></li>
157
+ <li><a href="MlsGenInterface.html">MlsGenInterface</a></li>
158
+ <li><a href="Speaker.html">Speaker</a></li>
159
+ </ul>
160
+ <h3><a href="global.html">Global</a></h3>
161
+ </nav>
162
+
163
+ <br class="clear" />
164
+
165
+ <footer>
166
+ Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.10</a> on Tue
167
+ Mar 01 2022 12:39:42 GMT-0500 (Eastern Standard Time)
168
+ </footer>
169
+
170
+ <script>
171
+ prettyPrint();
172
+ </script>
173
+ <script src="scripts/linenumber.js"></script>
174
+ </body>
175
+ </html>
@@ -0,0 +1,163 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>JSDoc: Source: audioRecorder.js</title>
6
+
7
+ <script src="scripts/prettify/prettify.js"></script>
8
+ <script src="scripts/prettify/lang-css.js"></script>
9
+ <!--[if lt IE 9]>
10
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
11
+ <![endif]-->
12
+ <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css" />
13
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css" />
14
+ </head>
15
+
16
+ <body>
17
+ <div id="main">
18
+ <h1 class="page-title">Source: audioRecorder.js</h1>
19
+
20
+ <section>
21
+ <article>
22
+ <pre class="prettyprint source linenums"><code>/**
23
+ * @class provides a simple interface for recording audio from a microphone
24
+ * using the Media Recorder API.
25
+ */
26
+ class AudioRecorder {
27
+ /** @private */
28
+ #mediaRecorder;
29
+
30
+ /** @private */
31
+ #recordedChunks = [];
32
+
33
+ /** @private */
34
+ #audioBlob;
35
+
36
+ /** @private */
37
+ #audioContext;
38
+
39
+ /** @private */
40
+ #fileReader;
41
+
42
+ /** @private */
43
+ #arrayBuffer;
44
+
45
+ /**
46
+ * creates a new AudioRecorder instance.
47
+ * Sets up the audio context and file reader.
48
+ */
49
+ constructor() {
50
+ this.#audioContext = new (window.AudioContext ||
51
+ window.webkitAudioContext ||
52
+ window.audioContext)();
53
+ this.#fileReader = new FileReader();
54
+ }
55
+
56
+ /**
57
+ * Event listener triggered when the file reader is done loading
58
+ * @private
59
+ */
60
+ #onFileReaderLoad = () => {
61
+ // read the file as an array buffer
62
+ this.#arrayBuffer = this.#fileReader.result;
63
+
64
+ // Convert array buffer into audio buffer
65
+ this.#audioContext.decodeAudioData(this.#arrayBuffer, (audioBuffer) => {
66
+ // Do something with audioBuffer
67
+ console.log(audioBuffer.getChannelData(0));
68
+ });
69
+ };
70
+
71
+ /**
72
+ * Event listener triggered when data is available in the media recorder.
73
+ * @private
74
+ * @param {*} e - The event object.
75
+ */
76
+ #onRecorderDataAvailable = (e) => {
77
+ if (e.data.size > 0) this.#recordedChunks.push(e.data);
78
+ };
79
+
80
+ /**
81
+ * Event listener triggered when the media recorder stops recording.
82
+ * @private
83
+ */
84
+ #onRecorderStop = () => {
85
+ // Create a blob from the recorded audio chunks
86
+ this.#audioBlob = new Blob(this.#recordedChunks, {
87
+ type: "audio/wav; codecs=MS_PCM",
88
+ });
89
+
90
+ // Set up file reader on loaded end event
91
+ this.#fileReader.onloadend = this.#onFileReaderLoad;
92
+
93
+ // Load blob
94
+ this.#fileReader.readAsArrayBuffer(this.#audioBlob);
95
+ };
96
+
97
+ /**
98
+ * Method to create a media recorder object and set up event listeners.
99
+ * @private
100
+ * @param {MediaStream} stream - The stream of audio from the Listener.
101
+ */
102
+ #setMediaRecorder = (stream) => {
103
+ // Create a new MediaRecorder object
104
+ this.#mediaRecorder = new MediaRecorder(stream, { mimeType: "audio/webm" });
105
+
106
+ // Add event listeners
107
+ this.#mediaRecorder.ondataavailable = (e) =>
108
+ this.#onRecorderDataAvailable(e);
109
+ this.#mediaRecorder.onstop = () => this.#onRecorderStop();
110
+ };
111
+
112
+ /**
113
+ * Public method to start the recording process.
114
+ * @param {MediaStream} stream - The stream of audio from the Listener.
115
+ */
116
+ startRecording = (stream) => {
117
+ // Set up media recorder if needed
118
+ if (!this.#mediaRecorder) this.#setMediaRecorder(stream);
119
+ this.#mediaRecorder.start();
120
+ };
121
+
122
+ /**
123
+ * Method to stop the recording process.
124
+ * @public
125
+ */
126
+ stopRecording = () => {
127
+ this.#mediaRecorder.stop();
128
+ };
129
+ }
130
+
131
+ export default AudioRecorder;
132
+ </code></pre>
133
+ </article>
134
+ </section>
135
+ </div>
136
+
137
+ <nav>
138
+ <h2><a href="index.html">Home</a></h2>
139
+ <h3>Classes</h3>
140
+ <ul>
141
+ <li><a href="AudioCalibrator.html">AudioCalibrator</a></li>
142
+ <li><a href="AudioPeer.html">AudioPeer</a></li>
143
+ <li><a href="AudioRecorder.html">AudioRecorder</a></li>
144
+ <li><a href="Listener.html">Listener</a></li>
145
+ <li><a href="MlsGenInterface.html">MlsGenInterface</a></li>
146
+ <li><a href="Speaker.html">Speaker</a></li>
147
+ </ul>
148
+ <h3><a href="global.html">Global</a></h3>
149
+ </nav>
150
+
151
+ <br class="clear" />
152
+
153
+ <footer>
154
+ Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.10</a> on Tue
155
+ Mar 01 2022 12:39:42 GMT-0500 (Eastern Standard Time)
156
+ </footer>
157
+
158
+ <script>
159
+ prettyPrint();
160
+ </script>
161
+ <script src="scripts/linenumber.js"></script>
162
+ </body>
163
+ </html>
@@ -0,0 +1,114 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <title>
6
+ JSDoc: Class: creates a new AudioRecorder instance. Sets up the audio context and file reader.
7
+ </title>
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css" />
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css" />
16
+ </head>
17
+
18
+ <body>
19
+ <div id="main">
20
+ <h1 class="page-title">
21
+ Class: creates a new AudioRecorder instance. Sets up the audio context and file reader.
22
+ </h1>
23
+
24
+ <section>
25
+ <header>
26
+ <h2>
27
+ <span class="attribs"><span class="type-signature"></span></span>creates a new
28
+ AudioRecorder instance. Sets up the audio context and file reader.<span
29
+ class="signature"
30
+ >()</span
31
+ ><span class="type-signature"></span>
32
+ </h2>
33
+ </header>
34
+
35
+ <article>
36
+ <div class="container-overview">
37
+ <h4
38
+ class="name"
39
+ id="creates a new AudioRecorder instance.
40
+ Sets up the audio context and file reader."
41
+ >
42
+ <span class="type-signature"></span>new creates a new AudioRecorder instance. Sets up
43
+ the audio context and file reader.<span class="signature">()</span
44
+ ><span class="type-signature"></span>
45
+ </h4>
46
+
47
+ <dl class="details">
48
+ <dt class="tag-source">Source:</dt>
49
+ <dd class="tag-source">
50
+ <ul class="dummy">
51
+ <li>
52
+ <a href="audioRecorder.js.html">audioRecorder.js</a>,
53
+ <a href="audioRecorder.js.html#line24">line 24</a>
54
+ </li>
55
+ </ul>
56
+ </dd>
57
+ </dl>
58
+ </div>
59
+ </article>
60
+ </section>
61
+ </div>
62
+
63
+ <nav>
64
+ <h2><a href="index.html">Home</a></h2>
65
+ <h3>Classes</h3>
66
+ <ul>
67
+ <li><a href="AudioPeer.html">AudioPeer</a></li>
68
+ <li><a href="AudioRecorder.html">AudioRecorder</a></li>
69
+ <li>
70
+ <a
71
+ href="creates%2520a%2520new%2520AudioRecorder%2520instance.%2520%250ASets%2520up%2520the%2520audio%2520context%2520and%2520file%2520reader..html"
72
+ >creates a new AudioRecorder instance. Sets up the audio context and file reader.</a
73
+ >
74
+ </li>
75
+ <li><a href="Listener.html">Listener</a></li>
76
+ <li><a href="MlsGenInterface.html">MlsGenInterface</a></li>
77
+ <li><a href="Speaker.html">Speaker</a></li>
78
+ <li>
79
+ <a
80
+ href="Takes%2520a%2520target%2520element%2520where%2520html%2520elements%2520will%2520be%2520appended..html"
81
+ >Takes a target element where html elements will be appended.</a
82
+ >
83
+ </li>
84
+ <li>
85
+ <a
86
+ href="Takes%2520the%2520url%2520of%2520the%2520current%2520site%250Aand%2520a%2520target%2520element%2520where%2520html%2520elements%2520will%2520be%2520appended..html"
87
+ >Takes the url of the current site and a target element where html elements will be
88
+ appended.</a
89
+ >
90
+ </li>
91
+ <li>
92
+ <a
93
+ href="Takes%2520the%2520url%2520of%2520the%2520current%2520site%2520and%2520a%2520target%2520element%2520where%2520html%2520elements%2520will%2520be%2520appended..html"
94
+ >Takes the url of the current site and a target element where html elements will be
95
+ appended.</a
96
+ >
97
+ </li>
98
+ </ul>
99
+ <h3><a href="global.html">Global</a></h3>
100
+ </nav>
101
+
102
+ <br class="clear" />
103
+
104
+ <footer>
105
+ Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 3.6.10</a> on Tue
106
+ Mar 01 2022 11:13:23 GMT-0500 (Eastern Standard Time)
107
+ </footer>
108
+
109
+ <script>
110
+ prettyPrint();
111
+ </script>
112
+ <script src="scripts/linenumber.js"></script>
113
+ </body>
114
+ </html>