wavesurfer.js 6.2.0 → 6.4.0
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/LICENSE +1 -1
- package/README.md +1 -10
- package/dist/plugin/wavesurfer.cursor.js +29 -49
- package/dist/plugin/wavesurfer.cursor.js.map +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +2 -2
- package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.js +19 -49
- package/dist/plugin/wavesurfer.elan.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +1 -1
- package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.js +87 -67
- package/dist/plugin/wavesurfer.markers.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.min.js +2 -2
- package/dist/plugin/wavesurfer.markers.min.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.js +5 -15
- package/dist/plugin/wavesurfer.mediasession.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.js +44 -62
- package/dist/plugin/wavesurfer.microphone.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.js +16 -68
- package/dist/plugin/wavesurfer.minimap.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.js +2 -29
- package/dist/plugin/wavesurfer.playhead.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.js +99 -253
- package/dist/plugin/wavesurfer.regions.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.min.js +2 -2
- package/dist/plugin/wavesurfer.regions.min.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.js +52 -147
- package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
- package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.js +42 -85
- package/dist/plugin/wavesurfer.timeline.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +31 -53
- package/dist/wavesurfer-html-init.js.map +1 -1
- package/dist/wavesurfer-html-init.min.js +1 -1
- package/dist/wavesurfer-html-init.min.js.map +1 -1
- package/dist/wavesurfer.js +448 -1008
- package/dist/wavesurfer.js.map +1 -1
- package/dist/wavesurfer.min.js +2 -2
- package/dist/wavesurfer.min.js.map +1 -1
- package/package.json +18 -19
- package/src/drawer.multicanvas.js +4 -4
- package/src/plugin/cursor/index.js +15 -3
- package/src/plugin/markers/index.js +70 -5
- package/src/plugin/regions/index.js +1 -1
- package/src/plugin/spectrogram/index.js +1 -1
- package/src/wavesurfer.js +12 -9
- package/CHANGES.md +0 -474
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js microphone plugin 6.
|
|
2
|
+
* wavesurfer.js microphone plugin 6.4.0 (2022-11-05)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
@@ -29,13 +29,9 @@ Object.defineProperty(exports, "__esModule", ({
|
|
|
29
29
|
value: true
|
|
30
30
|
}));
|
|
31
31
|
exports["default"] = void 0;
|
|
32
|
-
|
|
33
32
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
34
|
-
|
|
35
33
|
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
|
36
|
-
|
|
37
34
|
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
38
|
-
|
|
39
35
|
/**
|
|
40
36
|
* @typedef {Object} MicrophonePluginParams
|
|
41
37
|
* @property {MediaStreamConstraints} constraints The constraints parameter is a
|
|
@@ -51,7 +47,6 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
|
|
51
47
|
* @property {?boolean} deferInit Set to true to manually call
|
|
52
48
|
* `initPlugin('microphone')`
|
|
53
49
|
*/
|
|
54
|
-
|
|
55
50
|
/**
|
|
56
51
|
* Visualize microphone input in a wavesurfer instance.
|
|
57
52
|
*
|
|
@@ -80,50 +75,43 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
|
|
80
75
|
var MicrophonePlugin = /*#__PURE__*/function () {
|
|
81
76
|
function MicrophonePlugin(params, ws) {
|
|
82
77
|
var _this = this;
|
|
83
|
-
|
|
84
78
|
_classCallCheck(this, MicrophonePlugin);
|
|
85
|
-
|
|
86
79
|
this.params = params;
|
|
87
80
|
this.wavesurfer = ws;
|
|
88
81
|
this.active = false;
|
|
89
82
|
this.paused = false;
|
|
90
83
|
this.browser = this.detectBrowser();
|
|
91
|
-
|
|
92
84
|
this.reloadBufferFunction = function (e) {
|
|
93
85
|
return _this.reloadBuffer(e);
|
|
94
|
-
};
|
|
95
|
-
|
|
86
|
+
};
|
|
96
87
|
|
|
88
|
+
// cross-browser getUserMedia
|
|
97
89
|
var promisifiedOldGUM = function promisifiedOldGUM(constraints, successCallback, errorCallback) {
|
|
98
90
|
// get a hold of getUserMedia, if present
|
|
99
|
-
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
|
|
91
|
+
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
|
|
92
|
+
// Some browsers just don't implement it - return a rejected
|
|
100
93
|
// promise with an error to keep a consistent interface
|
|
101
|
-
|
|
102
94
|
if (!getUserMedia) {
|
|
103
95
|
return Promise.reject(new Error('getUserMedia is not implemented in this browser'));
|
|
104
|
-
}
|
|
96
|
+
}
|
|
97
|
+
// otherwise, wrap the call to the old navigator.getUserMedia with
|
|
105
98
|
// a Promise
|
|
106
|
-
|
|
107
|
-
|
|
108
99
|
return new Promise(function (successCallback, errorCallback) {
|
|
109
100
|
getUserMedia.call(navigator, constraints, successCallback, errorCallback);
|
|
110
101
|
});
|
|
111
|
-
};
|
|
102
|
+
};
|
|
103
|
+
// Older browsers might not implement mediaDevices at all, so we set an
|
|
112
104
|
// empty object first
|
|
113
|
-
|
|
114
|
-
|
|
115
105
|
if (navigator.mediaDevices === undefined) {
|
|
116
106
|
navigator.mediaDevices = {};
|
|
117
|
-
}
|
|
107
|
+
}
|
|
108
|
+
// Some browsers partially implement mediaDevices. We can't just assign
|
|
118
109
|
// an object with getUserMedia as it would overwrite existing
|
|
119
110
|
// properties. Here, we will just add the getUserMedia property if it's
|
|
120
111
|
// missing.
|
|
121
|
-
|
|
122
|
-
|
|
123
112
|
if (navigator.mediaDevices.getUserMedia === undefined) {
|
|
124
113
|
navigator.mediaDevices.getUserMedia = promisifiedOldGUM;
|
|
125
114
|
}
|
|
126
|
-
|
|
127
115
|
this.constraints = this.params.constraints || {
|
|
128
116
|
video: false,
|
|
129
117
|
audio: true
|
|
@@ -131,26 +119,23 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
131
119
|
this.bufferSize = this.params.bufferSize || 4096;
|
|
132
120
|
this.numberOfInputChannels = this.params.numberOfInputChannels || 1;
|
|
133
121
|
this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;
|
|
134
|
-
|
|
135
122
|
this._onBackendCreated = function () {
|
|
136
123
|
// wavesurfer's AudioContext where we'll route the mic signal to
|
|
137
124
|
_this.micContext = _this.wavesurfer.backend.getAudioContext();
|
|
138
125
|
};
|
|
139
126
|
}
|
|
140
|
-
|
|
141
127
|
_createClass(MicrophonePlugin, [{
|
|
142
128
|
key: "init",
|
|
143
129
|
value: function init() {
|
|
144
130
|
this.wavesurfer.on('backend-created', this._onBackendCreated);
|
|
145
|
-
|
|
146
131
|
if (this.wavesurfer.backend) {
|
|
147
132
|
this._onBackendCreated();
|
|
148
133
|
}
|
|
149
134
|
}
|
|
135
|
+
|
|
150
136
|
/**
|
|
151
137
|
* Destroy the microphone plugin.
|
|
152
138
|
*/
|
|
153
|
-
|
|
154
139
|
}, {
|
|
155
140
|
key: "destroy",
|
|
156
141
|
value: function destroy() {
|
|
@@ -160,26 +145,25 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
160
145
|
this.wavesurfer.un('backend-created', this._onBackendCreated);
|
|
161
146
|
this.stop();
|
|
162
147
|
}
|
|
148
|
+
|
|
163
149
|
/**
|
|
164
150
|
* Allow user to select audio input device, e.g. microphone, and
|
|
165
151
|
* start the visualization.
|
|
166
152
|
*/
|
|
167
|
-
|
|
168
153
|
}, {
|
|
169
154
|
key: "start",
|
|
170
155
|
value: function start() {
|
|
171
156
|
var _this2 = this;
|
|
172
|
-
|
|
173
157
|
navigator.mediaDevices.getUserMedia(this.constraints).then(function (data) {
|
|
174
158
|
return _this2.gotStream(data);
|
|
175
159
|
}).catch(function (data) {
|
|
176
160
|
return _this2.deviceError(data);
|
|
177
161
|
});
|
|
178
162
|
}
|
|
163
|
+
|
|
179
164
|
/**
|
|
180
165
|
* Pause/resume visualization.
|
|
181
166
|
*/
|
|
182
|
-
|
|
183
167
|
}, {
|
|
184
168
|
key: "togglePlay",
|
|
185
169
|
value: function togglePlay() {
|
|
@@ -189,7 +173,6 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
189
173
|
} else {
|
|
190
174
|
// toggle paused
|
|
191
175
|
this.paused = !this.paused;
|
|
192
|
-
|
|
193
176
|
if (this.paused) {
|
|
194
177
|
this.pause();
|
|
195
178
|
} else {
|
|
@@ -197,64 +180,68 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
197
180
|
}
|
|
198
181
|
}
|
|
199
182
|
}
|
|
183
|
+
|
|
200
184
|
/**
|
|
201
185
|
* Play visualization.
|
|
202
186
|
*/
|
|
203
|
-
|
|
204
187
|
}, {
|
|
205
188
|
key: "play",
|
|
206
189
|
value: function play() {
|
|
207
190
|
this.paused = false;
|
|
208
191
|
this.connect();
|
|
209
192
|
}
|
|
193
|
+
|
|
210
194
|
/**
|
|
211
195
|
* Pause visualization.
|
|
212
196
|
*/
|
|
213
|
-
|
|
214
197
|
}, {
|
|
215
198
|
key: "pause",
|
|
216
199
|
value: function pause() {
|
|
217
|
-
this.paused = true;
|
|
218
|
-
// (eg. during audio playback)
|
|
200
|
+
this.paused = true;
|
|
219
201
|
|
|
202
|
+
// disconnect sources so they can be used elsewhere
|
|
203
|
+
// (eg. during audio playback)
|
|
220
204
|
this.disconnect();
|
|
221
205
|
}
|
|
206
|
+
|
|
222
207
|
/**
|
|
223
208
|
* Stop the device stream and remove any remaining waveform drawing from
|
|
224
209
|
* the wavesurfer canvas.
|
|
225
210
|
*/
|
|
226
|
-
|
|
227
211
|
}, {
|
|
228
212
|
key: "stop",
|
|
229
213
|
value: function stop() {
|
|
230
214
|
if (this.active) {
|
|
231
215
|
// stop visualization and device
|
|
232
|
-
this.stopDevice();
|
|
216
|
+
this.stopDevice();
|
|
233
217
|
|
|
218
|
+
// empty last frame
|
|
234
219
|
this.wavesurfer.empty();
|
|
235
220
|
}
|
|
236
221
|
}
|
|
222
|
+
|
|
237
223
|
/**
|
|
238
224
|
* Stop the device and the visualization.
|
|
239
225
|
*/
|
|
240
|
-
|
|
241
226
|
}, {
|
|
242
227
|
key: "stopDevice",
|
|
243
228
|
value: function stopDevice() {
|
|
244
|
-
this.active = false;
|
|
229
|
+
this.active = false;
|
|
245
230
|
|
|
246
|
-
|
|
231
|
+
// stop visualization
|
|
232
|
+
this.disconnect();
|
|
247
233
|
|
|
234
|
+
// stop stream from device
|
|
248
235
|
if (this.stream && this.stream.getTracks) {
|
|
249
236
|
this.stream.getTracks().forEach(function (stream) {
|
|
250
237
|
return stream.stop();
|
|
251
238
|
});
|
|
252
239
|
}
|
|
253
240
|
}
|
|
241
|
+
|
|
254
242
|
/**
|
|
255
243
|
* Connect the media sources that feed the visualization.
|
|
256
244
|
*/
|
|
257
|
-
|
|
258
245
|
}, {
|
|
259
246
|
key: "connect",
|
|
260
247
|
value: function connect() {
|
|
@@ -262,9 +249,9 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
262
249
|
// Create a local buffer for data to be copied to the Wavesurfer buffer for Edge
|
|
263
250
|
if (this.browser.browser === 'edge') {
|
|
264
251
|
this.localAudioBuffer = this.micContext.createBuffer(this.numberOfInputChannels, this.bufferSize, this.micContext.sampleRate);
|
|
265
|
-
}
|
|
266
|
-
|
|
252
|
+
}
|
|
267
253
|
|
|
254
|
+
// Create an AudioNode from the stream.
|
|
268
255
|
this.mediaStreamSource = this.micContext.createMediaStreamSource(this.stream);
|
|
269
256
|
this.levelChecker = this.micContext.createScriptProcessor(this.bufferSize, this.numberOfInputChannels, this.numberOfOutputChannels);
|
|
270
257
|
this.mediaStreamSource.connect(this.levelChecker);
|
|
@@ -272,81 +259,79 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
272
259
|
this.levelChecker.onaudioprocess = this.reloadBufferFunction;
|
|
273
260
|
}
|
|
274
261
|
}
|
|
262
|
+
|
|
275
263
|
/**
|
|
276
264
|
* Disconnect the media sources that feed the visualization.
|
|
277
265
|
*/
|
|
278
|
-
|
|
279
266
|
}, {
|
|
280
267
|
key: "disconnect",
|
|
281
268
|
value: function disconnect() {
|
|
282
269
|
if (this.mediaStreamSource !== undefined) {
|
|
283
270
|
this.mediaStreamSource.disconnect();
|
|
284
271
|
}
|
|
285
|
-
|
|
286
272
|
if (this.levelChecker !== undefined) {
|
|
287
273
|
this.levelChecker.disconnect();
|
|
288
274
|
this.levelChecker.onaudioprocess = undefined;
|
|
289
275
|
}
|
|
290
|
-
|
|
291
276
|
if (this.localAudioBuffer !== undefined) {
|
|
292
277
|
this.localAudioBuffer = undefined;
|
|
293
278
|
}
|
|
294
279
|
}
|
|
280
|
+
|
|
295
281
|
/**
|
|
296
282
|
* Redraw the waveform.
|
|
297
283
|
*
|
|
298
284
|
* @param {object} event Audioprocess event
|
|
299
285
|
*/
|
|
300
|
-
|
|
301
286
|
}, {
|
|
302
287
|
key: "reloadBuffer",
|
|
303
288
|
value: function reloadBuffer(event) {
|
|
304
289
|
if (!this.paused) {
|
|
305
290
|
this.wavesurfer.empty();
|
|
306
|
-
|
|
307
291
|
if (this.browser.browser === 'edge') {
|
|
308
292
|
// copy audio data to a local audio buffer,
|
|
309
293
|
// from https://github.com/audiojs/audio-buffer-utils
|
|
310
294
|
var channel, l;
|
|
311
|
-
|
|
312
295
|
for (channel = 0, l = Math.min(this.localAudioBuffer.numberOfChannels, event.inputBuffer.numberOfChannels); channel < l; channel++) {
|
|
313
296
|
this.localAudioBuffer.getChannelData(channel).set(event.inputBuffer.getChannelData(channel));
|
|
314
297
|
}
|
|
315
|
-
|
|
316
298
|
this.wavesurfer.loadDecodedBuffer(this.localAudioBuffer);
|
|
317
299
|
} else {
|
|
318
300
|
this.wavesurfer.loadDecodedBuffer(event.inputBuffer);
|
|
319
301
|
}
|
|
320
302
|
}
|
|
321
303
|
}
|
|
304
|
+
|
|
322
305
|
/**
|
|
323
306
|
* Audio input device is ready.
|
|
324
307
|
*
|
|
325
308
|
* @param {MediaStream} stream The microphone's media stream.
|
|
326
309
|
*/
|
|
327
|
-
|
|
328
310
|
}, {
|
|
329
311
|
key: "gotStream",
|
|
330
312
|
value: function gotStream(stream) {
|
|
331
313
|
this.stream = stream;
|
|
332
|
-
this.active = true;
|
|
314
|
+
this.active = true;
|
|
333
315
|
|
|
334
|
-
|
|
316
|
+
// start visualization
|
|
317
|
+
this.play();
|
|
335
318
|
|
|
319
|
+
// notify listeners
|
|
336
320
|
this.fireEvent('deviceReady', stream);
|
|
337
321
|
}
|
|
322
|
+
|
|
338
323
|
/**
|
|
339
324
|
* Device error callback.
|
|
340
325
|
*
|
|
341
326
|
* @param {string} code Error message
|
|
342
327
|
*/
|
|
343
|
-
|
|
344
328
|
}, {
|
|
345
329
|
key: "deviceError",
|
|
346
330
|
value: function deviceError(code) {
|
|
347
331
|
// notify listeners
|
|
348
332
|
this.fireEvent('deviceError', code);
|
|
349
333
|
}
|
|
334
|
+
|
|
350
335
|
/**
|
|
351
336
|
* Extract browser version out of the provided user agent string.
|
|
352
337
|
* @param {!string} uastring userAgent string.
|
|
@@ -354,19 +339,18 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
354
339
|
* @param {!number} pos position in the version string to be returned.
|
|
355
340
|
* @return {!number} browser version.
|
|
356
341
|
*/
|
|
357
|
-
|
|
358
342
|
}, {
|
|
359
343
|
key: "extractVersion",
|
|
360
344
|
value: function extractVersion(uastring, expr, pos) {
|
|
361
345
|
var match = uastring.match(expr);
|
|
362
346
|
return match && match.length >= pos && parseInt(match[pos], 10);
|
|
363
347
|
}
|
|
348
|
+
|
|
364
349
|
/**
|
|
365
350
|
* Browser detector.
|
|
366
351
|
* @return {object} result containing browser, version and minVersion
|
|
367
352
|
* properties.
|
|
368
353
|
*/
|
|
369
|
-
|
|
370
354
|
}, {
|
|
371
355
|
key: "detectBrowser",
|
|
372
356
|
value: function detectBrowser() {
|
|
@@ -374,13 +358,13 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
374
358
|
var result = {};
|
|
375
359
|
result.browser = null;
|
|
376
360
|
result.version = null;
|
|
377
|
-
result.minVersion = null;
|
|
361
|
+
result.minVersion = null;
|
|
378
362
|
|
|
363
|
+
// Non supported browser.
|
|
379
364
|
if (typeof window === 'undefined' || !window.navigator) {
|
|
380
365
|
result.browser = 'Not a supported browser.';
|
|
381
366
|
return result;
|
|
382
367
|
}
|
|
383
|
-
|
|
384
368
|
if (navigator.mozGetUserMedia) {
|
|
385
369
|
// Firefox
|
|
386
370
|
result.browser = 'firefox';
|
|
@@ -405,9 +389,9 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
405
389
|
result.minVersion = 11;
|
|
406
390
|
result.version = this.extractVersion(navigator.userAgent, /AppleWebKit\/(\d+)\./, 1);
|
|
407
391
|
return result;
|
|
408
|
-
}
|
|
409
|
-
|
|
392
|
+
}
|
|
410
393
|
|
|
394
|
+
// Non supported browser default.
|
|
411
395
|
result.browser = 'Not a supported browser.';
|
|
412
396
|
return result;
|
|
413
397
|
}
|
|
@@ -432,10 +416,8 @@ var MicrophonePlugin = /*#__PURE__*/function () {
|
|
|
432
416
|
};
|
|
433
417
|
}
|
|
434
418
|
}]);
|
|
435
|
-
|
|
436
419
|
return MicrophonePlugin;
|
|
437
420
|
}();
|
|
438
|
-
|
|
439
421
|
exports["default"] = MicrophonePlugin;
|
|
440
422
|
module.exports = exports.default;
|
|
441
423
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.microphone.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/microphone/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"microphone\"] = factory();\n})(self, () => {\nreturn ","/**\n * @typedef {Object} MicrophonePluginParams\n * @property {MediaStreamConstraints} constraints The constraints parameter is a\n * MediaStreamConstaints object with two members: video and audio, describing\n * the media types requested. Either or both must be specified.\n * @property {number} bufferSize=4096 The buffer size in units of sample-frames.\n * If specified, the bufferSize must be one of the following values: `256`,\n * `512`, `1024`, `2048`, `4096`, `8192`, `16384`\n * @property {number} numberOfInputChannels=1 Integer specifying the number of\n * channels for this node's input. Values of up to 32 are supported.\n * @property {number} numberOfOutputChannels=1 Integer specifying the number of\n * channels for this node's output.\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('microphone')`\n */\n\n/**\n * Visualize microphone input in a wavesurfer instance.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import MicrophonePlugin from 'wavesurfer.microphone.js';\n *\n * // commonjs\n * var MicrophonePlugin = require('wavesurfer.microphone.js');\n *\n * // if you are using <script> tags\n * var MicrophonePlugin = window.WaveSurfer.microphone;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * MicrophonePlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class MicrophonePlugin {\n /**\n * Microphone plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {MicrophonePluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'microphone',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n instance: MicrophonePlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n\n this.active = false;\n this.paused = false;\n this.browser = this.detectBrowser();\n this.reloadBufferFunction = e => this.reloadBuffer(e);\n\n // cross-browser getUserMedia\n const promisifiedOldGUM = (\n constraints,\n successCallback,\n errorCallback\n ) => {\n // get a hold of getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n // Some browsers just don't implement it - return a rejected\n // promise with an error to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n );\n }\n // otherwise, wrap the call to the old navigator.getUserMedia with\n // a Promise\n return new Promise((successCallback, errorCallback) => {\n getUserMedia.call(\n navigator,\n constraints,\n successCallback,\n errorCallback\n );\n });\n };\n // Older browsers might not implement mediaDevices at all, so we set an\n // empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {};\n }\n // Some browsers partially implement mediaDevices. We can't just assign\n // an object with getUserMedia as it would overwrite existing\n // properties. Here, we will just add the getUserMedia property if it's\n // missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = promisifiedOldGUM;\n }\n this.constraints = this.params.constraints || {\n video: false,\n audio: true\n };\n this.bufferSize = this.params.bufferSize || 4096;\n this.numberOfInputChannels = this.params.numberOfInputChannels || 1;\n this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;\n\n this._onBackendCreated = () => {\n // wavesurfer's AudioContext where we'll route the mic signal to\n this.micContext = this.wavesurfer.backend.getAudioContext();\n };\n }\n\n init() {\n this.wavesurfer.on('backend-created', this._onBackendCreated);\n if (this.wavesurfer.backend) {\n this._onBackendCreated();\n }\n }\n\n /**\n * Destroy the microphone plugin.\n */\n destroy() {\n // make sure the buffer is not redrawn during\n // cleanup and demolition of this plugin.\n this.paused = true;\n\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n this.stop();\n }\n\n /**\n * Allow user to select audio input device, e.g. microphone, and\n * start the visualization.\n */\n start() {\n navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(data => this.gotStream(data))\n .catch(data => this.deviceError(data));\n }\n\n /**\n * Pause/resume visualization.\n */\n togglePlay() {\n if (!this.active) {\n // start it first\n this.start();\n } else {\n // toggle paused\n this.paused = !this.paused;\n\n if (this.paused) {\n this.pause();\n } else {\n this.play();\n }\n }\n }\n\n /**\n * Play visualization.\n */\n play() {\n this.paused = false;\n\n this.connect();\n }\n\n /**\n * Pause visualization.\n */\n pause() {\n this.paused = true;\n\n // disconnect sources so they can be used elsewhere\n // (eg. during audio playback)\n this.disconnect();\n }\n\n /**\n * Stop the device stream and remove any remaining waveform drawing from\n * the wavesurfer canvas.\n */\n stop() {\n if (this.active) {\n // stop visualization and device\n this.stopDevice();\n\n // empty last frame\n this.wavesurfer.empty();\n }\n }\n\n /**\n * Stop the device and the visualization.\n */\n stopDevice() {\n this.active = false;\n\n // stop visualization\n this.disconnect();\n\n // stop stream from device\n if (this.stream && this.stream.getTracks) {\n this.stream.getTracks().forEach(stream => stream.stop());\n }\n }\n\n /**\n * Connect the media sources that feed the visualization.\n */\n connect() {\n if (this.stream !== undefined) {\n // Create a local buffer for data to be copied to the Wavesurfer buffer for Edge\n if (this.browser.browser === 'edge') {\n this.localAudioBuffer = this.micContext.createBuffer(\n this.numberOfInputChannels,\n this.bufferSize,\n this.micContext.sampleRate\n );\n }\n\n // Create an AudioNode from the stream.\n this.mediaStreamSource = this.micContext.createMediaStreamSource(\n this.stream\n );\n\n this.levelChecker = this.micContext.createScriptProcessor(\n this.bufferSize,\n this.numberOfInputChannels,\n this.numberOfOutputChannels\n );\n this.mediaStreamSource.connect(this.levelChecker);\n\n this.levelChecker.connect(this.micContext.destination);\n this.levelChecker.onaudioprocess = this.reloadBufferFunction;\n }\n }\n\n /**\n * Disconnect the media sources that feed the visualization.\n */\n disconnect() {\n if (this.mediaStreamSource !== undefined) {\n this.mediaStreamSource.disconnect();\n }\n\n if (this.levelChecker !== undefined) {\n this.levelChecker.disconnect();\n this.levelChecker.onaudioprocess = undefined;\n }\n\n if (this.localAudioBuffer !== undefined) {\n this.localAudioBuffer = undefined;\n }\n }\n\n /**\n * Redraw the waveform.\n *\n * @param {object} event Audioprocess event\n */\n reloadBuffer(event) {\n if (!this.paused) {\n this.wavesurfer.empty();\n\n if (this.browser.browser === 'edge') {\n // copy audio data to a local audio buffer,\n // from https://github.com/audiojs/audio-buffer-utils\n let channel, l;\n for (\n channel = 0,\n l = Math.min(\n this.localAudioBuffer.numberOfChannels,\n event.inputBuffer.numberOfChannels\n );\n channel < l;\n channel++\n ) {\n this.localAudioBuffer\n .getChannelData(channel)\n .set(event.inputBuffer.getChannelData(channel));\n }\n\n this.wavesurfer.loadDecodedBuffer(this.localAudioBuffer);\n } else {\n this.wavesurfer.loadDecodedBuffer(event.inputBuffer);\n }\n }\n }\n\n /**\n * Audio input device is ready.\n *\n * @param {MediaStream} stream The microphone's media stream.\n */\n gotStream(stream) {\n this.stream = stream;\n this.active = true;\n\n // start visualization\n this.play();\n\n // notify listeners\n this.fireEvent('deviceReady', stream);\n }\n\n /**\n * Device error callback.\n *\n * @param {string} code Error message\n */\n deviceError(code) {\n // notify listeners\n this.fireEvent('deviceError', code);\n }\n\n /**\n * Extract browser version out of the provided user agent string.\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\n extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n }\n\n /**\n * Browser detector.\n * @return {object} result containing browser, version and minVersion\n * properties.\n */\n detectBrowser() {\n // Returned result object.\n const result = {};\n result.browser = null;\n result.version = null;\n result.minVersion = null;\n\n // Non supported browser.\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox\n result.browser = 'firefox';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Firefox\\/(\\d+)\\./,\n 1\n );\n result.minVersion = 31;\n return result;\n } else if (navigator.webkitGetUserMedia) {\n // Chrome/Chromium/Webview/Opera\n result.browser = 'chrome';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./,\n 2\n );\n result.minVersion = 38;\n return result;\n } else if (\n navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)\n ) {\n // Edge\n result.browser = 'edge';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/,\n 2\n );\n result.minVersion = 10547;\n return result;\n } else if (\n window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)\n ) {\n // Safari\n result.browser = 'safari';\n result.minVersion = 11;\n result.version = this.extractVersion(\n navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./,\n 1\n );\n return result;\n }\n\n // Non supported browser default.\n result.browser = 'Not a supported browser.';\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/microphone/index.js\");\n",""],"names":["MicrophonePlugin","params","ws","wavesurfer","active","paused","browser","detectBrowser","reloadBufferFunction","e","reloadBuffer","promisifiedOldGUM","constraints","successCallback","errorCallback","getUserMedia","navigator","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Promise","reject","Error","call","mediaDevices","undefined","video","audio","bufferSize","numberOfInputChannels","numberOfOutputChannels","_onBackendCreated","micContext","backend","getAudioContext","on","un","stop","then","data","gotStream","catch","deviceError","start","pause","play","connect","disconnect","stopDevice","empty","stream","getTracks","forEach","localAudioBuffer","createBuffer","sampleRate","mediaStreamSource","createMediaStreamSource","levelChecker","createScriptProcessor","destination","onaudioprocess","event","channel","l","Math","min","numberOfChannels","inputBuffer","getChannelData","set","loadDecodedBuffer","fireEvent","code","uastring","expr","pos","match","length","parseInt","result","version","minVersion","window","extractVersion","userAgent","RTCPeerConnection","name","deferInit","instance"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.microphone.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/microphone/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"microphone\"] = factory();\n})(self, () => {\nreturn ","/**\n * @typedef {Object} MicrophonePluginParams\n * @property {MediaStreamConstraints} constraints The constraints parameter is a\n * MediaStreamConstaints object with two members: video and audio, describing\n * the media types requested. Either or both must be specified.\n * @property {number} bufferSize=4096 The buffer size in units of sample-frames.\n * If specified, the bufferSize must be one of the following values: `256`,\n * `512`, `1024`, `2048`, `4096`, `8192`, `16384`\n * @property {number} numberOfInputChannels=1 Integer specifying the number of\n * channels for this node's input. Values of up to 32 are supported.\n * @property {number} numberOfOutputChannels=1 Integer specifying the number of\n * channels for this node's output.\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('microphone')`\n */\n\n/**\n * Visualize microphone input in a wavesurfer instance.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import MicrophonePlugin from 'wavesurfer.microphone.js';\n *\n * // commonjs\n * var MicrophonePlugin = require('wavesurfer.microphone.js');\n *\n * // if you are using <script> tags\n * var MicrophonePlugin = window.WaveSurfer.microphone;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * MicrophonePlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class MicrophonePlugin {\n /**\n * Microphone plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {MicrophonePluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'microphone',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n instance: MicrophonePlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n\n this.active = false;\n this.paused = false;\n this.browser = this.detectBrowser();\n this.reloadBufferFunction = e => this.reloadBuffer(e);\n\n // cross-browser getUserMedia\n const promisifiedOldGUM = (\n constraints,\n successCallback,\n errorCallback\n ) => {\n // get a hold of getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n // Some browsers just don't implement it - return a rejected\n // promise with an error to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n );\n }\n // otherwise, wrap the call to the old navigator.getUserMedia with\n // a Promise\n return new Promise((successCallback, errorCallback) => {\n getUserMedia.call(\n navigator,\n constraints,\n successCallback,\n errorCallback\n );\n });\n };\n // Older browsers might not implement mediaDevices at all, so we set an\n // empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {};\n }\n // Some browsers partially implement mediaDevices. We can't just assign\n // an object with getUserMedia as it would overwrite existing\n // properties. Here, we will just add the getUserMedia property if it's\n // missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = promisifiedOldGUM;\n }\n this.constraints = this.params.constraints || {\n video: false,\n audio: true\n };\n this.bufferSize = this.params.bufferSize || 4096;\n this.numberOfInputChannels = this.params.numberOfInputChannels || 1;\n this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;\n\n this._onBackendCreated = () => {\n // wavesurfer's AudioContext where we'll route the mic signal to\n this.micContext = this.wavesurfer.backend.getAudioContext();\n };\n }\n\n init() {\n this.wavesurfer.on('backend-created', this._onBackendCreated);\n if (this.wavesurfer.backend) {\n this._onBackendCreated();\n }\n }\n\n /**\n * Destroy the microphone plugin.\n */\n destroy() {\n // make sure the buffer is not redrawn during\n // cleanup and demolition of this plugin.\n this.paused = true;\n\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n this.stop();\n }\n\n /**\n * Allow user to select audio input device, e.g. microphone, and\n * start the visualization.\n */\n start() {\n navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(data => this.gotStream(data))\n .catch(data => this.deviceError(data));\n }\n\n /**\n * Pause/resume visualization.\n */\n togglePlay() {\n if (!this.active) {\n // start it first\n this.start();\n } else {\n // toggle paused\n this.paused = !this.paused;\n\n if (this.paused) {\n this.pause();\n } else {\n this.play();\n }\n }\n }\n\n /**\n * Play visualization.\n */\n play() {\n this.paused = false;\n\n this.connect();\n }\n\n /**\n * Pause visualization.\n */\n pause() {\n this.paused = true;\n\n // disconnect sources so they can be used elsewhere\n // (eg. during audio playback)\n this.disconnect();\n }\n\n /**\n * Stop the device stream and remove any remaining waveform drawing from\n * the wavesurfer canvas.\n */\n stop() {\n if (this.active) {\n // stop visualization and device\n this.stopDevice();\n\n // empty last frame\n this.wavesurfer.empty();\n }\n }\n\n /**\n * Stop the device and the visualization.\n */\n stopDevice() {\n this.active = false;\n\n // stop visualization\n this.disconnect();\n\n // stop stream from device\n if (this.stream && this.stream.getTracks) {\n this.stream.getTracks().forEach(stream => stream.stop());\n }\n }\n\n /**\n * Connect the media sources that feed the visualization.\n */\n connect() {\n if (this.stream !== undefined) {\n // Create a local buffer for data to be copied to the Wavesurfer buffer for Edge\n if (this.browser.browser === 'edge') {\n this.localAudioBuffer = this.micContext.createBuffer(\n this.numberOfInputChannels,\n this.bufferSize,\n this.micContext.sampleRate\n );\n }\n\n // Create an AudioNode from the stream.\n this.mediaStreamSource = this.micContext.createMediaStreamSource(\n this.stream\n );\n\n this.levelChecker = this.micContext.createScriptProcessor(\n this.bufferSize,\n this.numberOfInputChannels,\n this.numberOfOutputChannels\n );\n this.mediaStreamSource.connect(this.levelChecker);\n\n this.levelChecker.connect(this.micContext.destination);\n this.levelChecker.onaudioprocess = this.reloadBufferFunction;\n }\n }\n\n /**\n * Disconnect the media sources that feed the visualization.\n */\n disconnect() {\n if (this.mediaStreamSource !== undefined) {\n this.mediaStreamSource.disconnect();\n }\n\n if (this.levelChecker !== undefined) {\n this.levelChecker.disconnect();\n this.levelChecker.onaudioprocess = undefined;\n }\n\n if (this.localAudioBuffer !== undefined) {\n this.localAudioBuffer = undefined;\n }\n }\n\n /**\n * Redraw the waveform.\n *\n * @param {object} event Audioprocess event\n */\n reloadBuffer(event) {\n if (!this.paused) {\n this.wavesurfer.empty();\n\n if (this.browser.browser === 'edge') {\n // copy audio data to a local audio buffer,\n // from https://github.com/audiojs/audio-buffer-utils\n let channel, l;\n for (\n channel = 0,\n l = Math.min(\n this.localAudioBuffer.numberOfChannels,\n event.inputBuffer.numberOfChannels\n );\n channel < l;\n channel++\n ) {\n this.localAudioBuffer\n .getChannelData(channel)\n .set(event.inputBuffer.getChannelData(channel));\n }\n\n this.wavesurfer.loadDecodedBuffer(this.localAudioBuffer);\n } else {\n this.wavesurfer.loadDecodedBuffer(event.inputBuffer);\n }\n }\n }\n\n /**\n * Audio input device is ready.\n *\n * @param {MediaStream} stream The microphone's media stream.\n */\n gotStream(stream) {\n this.stream = stream;\n this.active = true;\n\n // start visualization\n this.play();\n\n // notify listeners\n this.fireEvent('deviceReady', stream);\n }\n\n /**\n * Device error callback.\n *\n * @param {string} code Error message\n */\n deviceError(code) {\n // notify listeners\n this.fireEvent('deviceError', code);\n }\n\n /**\n * Extract browser version out of the provided user agent string.\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\n extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n }\n\n /**\n * Browser detector.\n * @return {object} result containing browser, version and minVersion\n * properties.\n */\n detectBrowser() {\n // Returned result object.\n const result = {};\n result.browser = null;\n result.version = null;\n result.minVersion = null;\n\n // Non supported browser.\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox\n result.browser = 'firefox';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Firefox\\/(\\d+)\\./,\n 1\n );\n result.minVersion = 31;\n return result;\n } else if (navigator.webkitGetUserMedia) {\n // Chrome/Chromium/Webview/Opera\n result.browser = 'chrome';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./,\n 2\n );\n result.minVersion = 38;\n return result;\n } else if (\n navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)\n ) {\n // Edge\n result.browser = 'edge';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/,\n 2\n );\n result.minVersion = 10547;\n return result;\n } else if (\n window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)\n ) {\n // Safari\n result.browser = 'safari';\n result.minVersion = 11;\n result.version = this.extractVersion(\n navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./,\n 1\n );\n return result;\n }\n\n // Non supported browser default.\n result.browser = 'Not a supported browser.';\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/microphone/index.js\");\n",""],"names":["MicrophonePlugin","params","ws","wavesurfer","active","paused","browser","detectBrowser","reloadBufferFunction","e","reloadBuffer","promisifiedOldGUM","constraints","successCallback","errorCallback","getUserMedia","navigator","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Promise","reject","Error","call","mediaDevices","undefined","video","audio","bufferSize","numberOfInputChannels","numberOfOutputChannels","_onBackendCreated","micContext","backend","getAudioContext","on","un","stop","then","data","gotStream","catch","deviceError","start","pause","play","connect","disconnect","stopDevice","empty","stream","getTracks","forEach","localAudioBuffer","createBuffer","sampleRate","mediaStreamSource","createMediaStreamSource","levelChecker","createScriptProcessor","destination","onaudioprocess","event","channel","l","Math","min","numberOfChannels","inputBuffer","getChannelData","set","loadDecodedBuffer","fireEvent","code","uastring","expr","pos","match","length","parseInt","result","version","minVersion","window","extractVersion","userAgent","RTCPeerConnection","name","deferInit","instance"],"sourceRoot":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.microphone.min.js","mappings":";;;;;CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,aAAc,GAAIH,GACC,iBAAZC,QACdA,QAAoB,WAAID,KAExBD,EAAiB,WAAIA,EAAiB,YAAK,GAAIA,EAAiB,WAAc,WAAIC,KARpF,CASGK,MAAM,IACT,M,4QC+BqBC,EAAAA,WAmBjB,WAAYC,EAAQC,GAAI,Y,4FAAA,SACpBC,KAAKF,OAASA,EACdE,KAAKC,WAAaF,EAElBC,KAAKE,QAAS,EACdF,KAAKG,QAAS,EACdH,KAAKI,QAAUJ,KAAKK,gBACpBL,KAAKM,qBAAuB,SAAAC,GAAC,OAAI,EAAKC,aAAaD,SAkCpBE,IAA3BC,UAAUC,eACVD,UAAUC,aAAe,SAMeF,IAAxCC,UAAUC,aAAaC,eACvBF,UAAUC,aAAaC,aAvCD,SACtBC,EACAC,EACAC,GAGA,IAAMH,EACFF,UAAUE,cACVF,UAAUM,oBACVN,UAAUO,iBACVP,UAAUQ,eAGd,OAAKN,EAOE,IAAIO,SAAQ,SAACL,EAAiBC,GACjCH,EAAaQ,KACTV,UACAG,EACAC,EACAC,MAXGI,QAAQE,OACX,IAAIC,MAAM,sDA0BtBtB,KAAKa,YAAcb,KAAKF,OAAOe,aAAe,CAC1CU,OAAO,EACPC,OAAO,GAEXxB,KAAKyB,WAAazB,KAAKF,OAAO2B,YAAc,KAC5CzB,KAAK0B,sBAAwB1B,KAAKF,OAAO4B,uBAAyB,EAClE1B,KAAK2B,uBAAyB3B,KAAKF,OAAO6B,wBAA0B,EAEpE3B,KAAK4B,kBAAoB,WAErB,EAAKC,WAAa,EAAK5B,WAAW6B,QAAQC,mB,4CAtElD,SAAcjC,GACV,MAAO,CACHkC,KAAM,aACNC,aAAWnC,IAAUA,EAAOmC,YAAYnC,EAAOmC,UAC/CnC,OAAQA,EACRoC,SAAUrC,O,qBAqElB,WACIG,KAAKC,WAAWkC,GAAG,kBAAmBnC,KAAK4B,mBACvC5B,KAAKC,WAAW6B,SAChB9B,KAAK4B,sB,qBAOb,WAGI5B,KAAKG,QAAS,EAEdH,KAAKC,WAAWmC,GAAG,kBAAmBpC,KAAK4B,mBAC3C5B,KAAKqC,S,mBAOT,WAAQ,WACJ3B,UAAUC,aACLC,aAAaZ,KAAKa,aAClByB,MAAK,SAAAC,GAAI,OAAI,EAAKC,UAAUD,MAC5BE,OAAM,SAAAF,GAAI,OAAI,EAAKG,YAAYH,Q,wBAMxC,WACSvC,KAAKE,QAKNF,KAAKG,QAAUH,KAAKG,OAEhBH,KAAKG,OACLH,KAAK2C,QAEL3C,KAAK4C,QART5C,KAAK6C,U,kBAgBb,WACI7C,KAAKG,QAAS,EAEdH,KAAK8C,Y,mBAMT,WACI9C,KAAKG,QAAS,EAIdH,KAAK+C,e,kBAOT,WACQ/C,KAAKE,SAELF,KAAKgD,aAGLhD,KAAKC,WAAWgD,W,wBAOxB,WACIjD,KAAKE,QAAS,EAGdF,KAAK+C,aAGD/C,KAAKkD,QAAUlD,KAAKkD,OAAOC,WAC3BnD,KAAKkD,OAAOC,YAAYC,SAAQ,SAAAF,GAAM,OAAIA,EAAOb,Y,qBAOzD,gBACwB5B,IAAhBT,KAAKkD,SAEwB,SAAzBlD,KAAKI,QAAQA,UACbJ,KAAKqD,iBAAmBrD,KAAK6B,WAAWyB,aACpCtD,KAAK0B,sBACL1B,KAAKyB,WACLzB,KAAK6B,WAAW0B,aAKxBvD,KAAKwD,kBAAoBxD,KAAK6B,WAAW4B,wBACrCzD,KAAKkD,QAGTlD,KAAK0D,aAAe1D,KAAK6B,WAAW8B,sBAChC3D,KAAKyB,WACLzB,KAAK0B,sBACL1B,KAAK2B,wBAET3B,KAAKwD,kBAAkBV,QAAQ9C,KAAK0D,cAEpC1D,KAAK0D,aAAaZ,QAAQ9C,KAAK6B,WAAW+B,aAC1C5D,KAAK0D,aAAaG,eAAiB7D,KAAKM,wB,wBAOhD,gBACmCG,IAA3BT,KAAKwD,mBACLxD,KAAKwD,kBAAkBT,kBAGDtC,IAAtBT,KAAK0D,eACL1D,KAAK0D,aAAaX,aAClB/C,KAAK0D,aAAaG,oBAAiBpD,QAGTA,IAA1BT,KAAKqD,mBACLrD,KAAKqD,sBAAmB5C,K,0BAShC,SAAaqD,GACT,IAAK9D,KAAKG,OAGN,GAFAH,KAAKC,WAAWgD,QAEa,SAAzBjD,KAAKI,QAAQA,QAAoB,CAGjC,IAAI2D,EAASC,EACb,IACID,EAAU,EACVC,EAAIC,KAAKC,IACLlE,KAAKqD,iBAAiBc,iBACtBL,EAAMM,YAAYD,kBAEtBJ,EAAUC,EACVD,IAEA/D,KAAKqD,iBACAgB,eAAeN,GACfO,IAAIR,EAAMM,YAAYC,eAAeN,IAG9C/D,KAAKC,WAAWsE,kBAAkBvE,KAAKqD,uBAEvCrD,KAAKC,WAAWsE,kBAAkBT,EAAMM,e,uBAUpD,SAAUlB,GACNlD,KAAKkD,OAASA,EACdlD,KAAKE,QAAS,EAGdF,KAAK4C,OAGL5C,KAAKwE,UAAU,cAAetB,K,yBAQlC,SAAYuB,GAERzE,KAAKwE,UAAU,cAAeC,K,4BAUlC,SAAeC,EAAUC,EAAMC,GAC3B,IAAMC,EAAQH,EAASG,MAAMF,GAC7B,OAAOE,GAASA,EAAMC,QAAUF,GAAOG,SAASF,EAAMD,GAAM,M,2BAQhE,WAEI,IAAMI,EAAS,CACfA,QAAiB,KACjBA,QAAiB,KACjBA,WAAoB,MAGpB,MAAsB,oBAAXC,QAA2BA,OAAOvE,UAKzCA,UAAUO,iBAEV+D,EAAO5E,QAAU,UACjB4E,EAAOE,QAAUlF,KAAKmF,eAClBzE,UAAU0E,UACV,mBACA,GAEJJ,EAAOK,WAAa,GACbL,GACAtE,UAAUM,oBAEjBgE,EAAO5E,QAAU,SACjB4E,EAAOE,QAAUlF,KAAKmF,eAClBzE,UAAU0E,UACV,wBACA,GAEJJ,EAAOK,WAAa,GACbL,GAEPtE,UAAUC,cACVD,UAAU0E,UAAUP,MAAM,uBAG1BG,EAAO5E,QAAU,OACjB4E,EAAOE,QAAUlF,KAAKmF,eAClBzE,UAAU0E,UACV,qBACA,GAEJJ,EAAOK,WAAa,MACbL,GAEPC,OAAOK,mBACP5E,UAAU0E,UAAUP,MAAM,yBAG1BG,EAAO5E,QAAU,SACjB4E,EAAOK,WAAa,GACpBL,EAAOE,QAAUlF,KAAKmF,eAClBzE,UAAU0E,UACV,uBACA,GAEGJ,IAIXA,EAAO5E,QAAU,2BACV4E,IAtDHA,EAAO5E,QAAU,2BACV4E,Q,gFA9TEnF,G,kCCxCjB0F,EAA2B,GCE/B,IAAIC,EDCJ,SAASC,EAAoBC,GAE5B,IAAIC,EAAeJ,EAAyBG,GAC5C,QAAqBjF,IAAjBkF,EACH,OAAOA,EAAanG,QAGrB,IAAIC,EAAS8F,EAAyBG,GAAY,CAGjDlG,QAAS,IAOV,OAHAoG,EAAoBF,GAAUjG,EAAQA,EAAOD,QAASiG,GAG/ChG,EAAOD,QClBWiG,CAAoB,K,UHO9C","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/microphone/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"microphone\"] = factory();\n})(self, () => {\nreturn ","/**\n * @typedef {Object} MicrophonePluginParams\n * @property {MediaStreamConstraints} constraints The constraints parameter is a\n * MediaStreamConstaints object with two members: video and audio, describing\n * the media types requested. Either or both must be specified.\n * @property {number} bufferSize=4096 The buffer size in units of sample-frames.\n * If specified, the bufferSize must be one of the following values: `256`,\n * `512`, `1024`, `2048`, `4096`, `8192`, `16384`\n * @property {number} numberOfInputChannels=1 Integer specifying the number of\n * channels for this node's input. Values of up to 32 are supported.\n * @property {number} numberOfOutputChannels=1 Integer specifying the number of\n * channels for this node's output.\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('microphone')`\n */\n\n/**\n * Visualize microphone input in a wavesurfer instance.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import MicrophonePlugin from 'wavesurfer.microphone.js';\n *\n * // commonjs\n * var MicrophonePlugin = require('wavesurfer.microphone.js');\n *\n * // if you are using <script> tags\n * var MicrophonePlugin = window.WaveSurfer.microphone;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * MicrophonePlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class MicrophonePlugin {\n /**\n * Microphone plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {MicrophonePluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'microphone',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n instance: MicrophonePlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n\n this.active = false;\n this.paused = false;\n this.browser = this.detectBrowser();\n this.reloadBufferFunction = e => this.reloadBuffer(e);\n\n // cross-browser getUserMedia\n const promisifiedOldGUM = (\n constraints,\n successCallback,\n errorCallback\n ) => {\n // get a hold of getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n // Some browsers just don't implement it - return a rejected\n // promise with an error to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n );\n }\n // otherwise, wrap the call to the old navigator.getUserMedia with\n // a Promise\n return new Promise((successCallback, errorCallback) => {\n getUserMedia.call(\n navigator,\n constraints,\n successCallback,\n errorCallback\n );\n });\n };\n // Older browsers might not implement mediaDevices at all, so we set an\n // empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {};\n }\n // Some browsers partially implement mediaDevices. We can't just assign\n // an object with getUserMedia as it would overwrite existing\n // properties. Here, we will just add the getUserMedia property if it's\n // missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = promisifiedOldGUM;\n }\n this.constraints = this.params.constraints || {\n video: false,\n audio: true\n };\n this.bufferSize = this.params.bufferSize || 4096;\n this.numberOfInputChannels = this.params.numberOfInputChannels || 1;\n this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;\n\n this._onBackendCreated = () => {\n // wavesurfer's AudioContext where we'll route the mic signal to\n this.micContext = this.wavesurfer.backend.getAudioContext();\n };\n }\n\n init() {\n this.wavesurfer.on('backend-created', this._onBackendCreated);\n if (this.wavesurfer.backend) {\n this._onBackendCreated();\n }\n }\n\n /**\n * Destroy the microphone plugin.\n */\n destroy() {\n // make sure the buffer is not redrawn during\n // cleanup and demolition of this plugin.\n this.paused = true;\n\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n this.stop();\n }\n\n /**\n * Allow user to select audio input device, e.g. microphone, and\n * start the visualization.\n */\n start() {\n navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(data => this.gotStream(data))\n .catch(data => this.deviceError(data));\n }\n\n /**\n * Pause/resume visualization.\n */\n togglePlay() {\n if (!this.active) {\n // start it first\n this.start();\n } else {\n // toggle paused\n this.paused = !this.paused;\n\n if (this.paused) {\n this.pause();\n } else {\n this.play();\n }\n }\n }\n\n /**\n * Play visualization.\n */\n play() {\n this.paused = false;\n\n this.connect();\n }\n\n /**\n * Pause visualization.\n */\n pause() {\n this.paused = true;\n\n // disconnect sources so they can be used elsewhere\n // (eg. during audio playback)\n this.disconnect();\n }\n\n /**\n * Stop the device stream and remove any remaining waveform drawing from\n * the wavesurfer canvas.\n */\n stop() {\n if (this.active) {\n // stop visualization and device\n this.stopDevice();\n\n // empty last frame\n this.wavesurfer.empty();\n }\n }\n\n /**\n * Stop the device and the visualization.\n */\n stopDevice() {\n this.active = false;\n\n // stop visualization\n this.disconnect();\n\n // stop stream from device\n if (this.stream && this.stream.getTracks) {\n this.stream.getTracks().forEach(stream => stream.stop());\n }\n }\n\n /**\n * Connect the media sources that feed the visualization.\n */\n connect() {\n if (this.stream !== undefined) {\n // Create a local buffer for data to be copied to the Wavesurfer buffer for Edge\n if (this.browser.browser === 'edge') {\n this.localAudioBuffer = this.micContext.createBuffer(\n this.numberOfInputChannels,\n this.bufferSize,\n this.micContext.sampleRate\n );\n }\n\n // Create an AudioNode from the stream.\n this.mediaStreamSource = this.micContext.createMediaStreamSource(\n this.stream\n );\n\n this.levelChecker = this.micContext.createScriptProcessor(\n this.bufferSize,\n this.numberOfInputChannels,\n this.numberOfOutputChannels\n );\n this.mediaStreamSource.connect(this.levelChecker);\n\n this.levelChecker.connect(this.micContext.destination);\n this.levelChecker.onaudioprocess = this.reloadBufferFunction;\n }\n }\n\n /**\n * Disconnect the media sources that feed the visualization.\n */\n disconnect() {\n if (this.mediaStreamSource !== undefined) {\n this.mediaStreamSource.disconnect();\n }\n\n if (this.levelChecker !== undefined) {\n this.levelChecker.disconnect();\n this.levelChecker.onaudioprocess = undefined;\n }\n\n if (this.localAudioBuffer !== undefined) {\n this.localAudioBuffer = undefined;\n }\n }\n\n /**\n * Redraw the waveform.\n *\n * @param {object} event Audioprocess event\n */\n reloadBuffer(event) {\n if (!this.paused) {\n this.wavesurfer.empty();\n\n if (this.browser.browser === 'edge') {\n // copy audio data to a local audio buffer,\n // from https://github.com/audiojs/audio-buffer-utils\n let channel, l;\n for (\n channel = 0,\n l = Math.min(\n this.localAudioBuffer.numberOfChannels,\n event.inputBuffer.numberOfChannels\n );\n channel < l;\n channel++\n ) {\n this.localAudioBuffer\n .getChannelData(channel)\n .set(event.inputBuffer.getChannelData(channel));\n }\n\n this.wavesurfer.loadDecodedBuffer(this.localAudioBuffer);\n } else {\n this.wavesurfer.loadDecodedBuffer(event.inputBuffer);\n }\n }\n }\n\n /**\n * Audio input device is ready.\n *\n * @param {MediaStream} stream The microphone's media stream.\n */\n gotStream(stream) {\n this.stream = stream;\n this.active = true;\n\n // start visualization\n this.play();\n\n // notify listeners\n this.fireEvent('deviceReady', stream);\n }\n\n /**\n * Device error callback.\n *\n * @param {string} code Error message\n */\n deviceError(code) {\n // notify listeners\n this.fireEvent('deviceError', code);\n }\n\n /**\n * Extract browser version out of the provided user agent string.\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\n extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n }\n\n /**\n * Browser detector.\n * @return {object} result containing browser, version and minVersion\n * properties.\n */\n detectBrowser() {\n // Returned result object.\n const result = {};\n result.browser = null;\n result.version = null;\n result.minVersion = null;\n\n // Non supported browser.\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox\n result.browser = 'firefox';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Firefox\\/(\\d+)\\./,\n 1\n );\n result.minVersion = 31;\n return result;\n } else if (navigator.webkitGetUserMedia) {\n // Chrome/Chromium/Webview/Opera\n result.browser = 'chrome';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./,\n 2\n );\n result.minVersion = 38;\n return result;\n } else if (\n navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)\n ) {\n // Edge\n result.browser = 'edge';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/,\n 2\n );\n result.minVersion = 10547;\n return result;\n } else if (\n window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)\n ) {\n // Safari\n result.browser = 'safari';\n result.minVersion = 11;\n result.version = this.extractVersion(\n navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./,\n 1\n );\n return result;\n }\n\n // Non supported browser default.\n result.browser = 'Not a supported browser.';\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(872);\n"],"names":["root","factory","exports","module","define","amd","self","MicrophonePlugin","params","ws","this","wavesurfer","active","paused","browser","detectBrowser","reloadBufferFunction","e","reloadBuffer","undefined","navigator","mediaDevices","getUserMedia","constraints","successCallback","errorCallback","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Promise","call","reject","Error","video","audio","bufferSize","numberOfInputChannels","numberOfOutputChannels","_onBackendCreated","micContext","backend","getAudioContext","name","deferInit","instance","on","un","stop","then","data","gotStream","catch","deviceError","pause","play","start","connect","disconnect","stopDevice","empty","stream","getTracks","forEach","localAudioBuffer","createBuffer","sampleRate","mediaStreamSource","createMediaStreamSource","levelChecker","createScriptProcessor","destination","onaudioprocess","event","channel","l","Math","min","numberOfChannels","inputBuffer","getChannelData","set","loadDecodedBuffer","fireEvent","code","uastring","expr","pos","match","length","parseInt","result","window","version","extractVersion","userAgent","minVersion","RTCPeerConnection","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"wavesurfer.microphone.min.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/microphone/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"microphone\"] = factory();\n})(self, () => {\nreturn ","/**\n * @typedef {Object} MicrophonePluginParams\n * @property {MediaStreamConstraints} constraints The constraints parameter is a\n * MediaStreamConstaints object with two members: video and audio, describing\n * the media types requested. Either or both must be specified.\n * @property {number} bufferSize=4096 The buffer size in units of sample-frames.\n * If specified, the bufferSize must be one of the following values: `256`,\n * `512`, `1024`, `2048`, `4096`, `8192`, `16384`\n * @property {number} numberOfInputChannels=1 Integer specifying the number of\n * channels for this node's input. Values of up to 32 are supported.\n * @property {number} numberOfOutputChannels=1 Integer specifying the number of\n * channels for this node's output.\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('microphone')`\n */\n\n/**\n * Visualize microphone input in a wavesurfer instance.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import MicrophonePlugin from 'wavesurfer.microphone.js';\n *\n * // commonjs\n * var MicrophonePlugin = require('wavesurfer.microphone.js');\n *\n * // if you are using <script> tags\n * var MicrophonePlugin = window.WaveSurfer.microphone;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * MicrophonePlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class MicrophonePlugin {\n /**\n * Microphone plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {MicrophonePluginParams} params parameters use to initialise the plugin\n * @return {PluginDefinition} an object representing the plugin\n */\n static create(params) {\n return {\n name: 'microphone',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n instance: MicrophonePlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n\n this.active = false;\n this.paused = false;\n this.browser = this.detectBrowser();\n this.reloadBufferFunction = e => this.reloadBuffer(e);\n\n // cross-browser getUserMedia\n const promisifiedOldGUM = (\n constraints,\n successCallback,\n errorCallback\n ) => {\n // get a hold of getUserMedia, if present\n const getUserMedia =\n navigator.getUserMedia ||\n navigator.webkitGetUserMedia ||\n navigator.mozGetUserMedia ||\n navigator.msGetUserMedia;\n // Some browsers just don't implement it - return a rejected\n // promise with an error to keep a consistent interface\n if (!getUserMedia) {\n return Promise.reject(\n new Error('getUserMedia is not implemented in this browser')\n );\n }\n // otherwise, wrap the call to the old navigator.getUserMedia with\n // a Promise\n return new Promise((successCallback, errorCallback) => {\n getUserMedia.call(\n navigator,\n constraints,\n successCallback,\n errorCallback\n );\n });\n };\n // Older browsers might not implement mediaDevices at all, so we set an\n // empty object first\n if (navigator.mediaDevices === undefined) {\n navigator.mediaDevices = {};\n }\n // Some browsers partially implement mediaDevices. We can't just assign\n // an object with getUserMedia as it would overwrite existing\n // properties. Here, we will just add the getUserMedia property if it's\n // missing.\n if (navigator.mediaDevices.getUserMedia === undefined) {\n navigator.mediaDevices.getUserMedia = promisifiedOldGUM;\n }\n this.constraints = this.params.constraints || {\n video: false,\n audio: true\n };\n this.bufferSize = this.params.bufferSize || 4096;\n this.numberOfInputChannels = this.params.numberOfInputChannels || 1;\n this.numberOfOutputChannels = this.params.numberOfOutputChannels || 1;\n\n this._onBackendCreated = () => {\n // wavesurfer's AudioContext where we'll route the mic signal to\n this.micContext = this.wavesurfer.backend.getAudioContext();\n };\n }\n\n init() {\n this.wavesurfer.on('backend-created', this._onBackendCreated);\n if (this.wavesurfer.backend) {\n this._onBackendCreated();\n }\n }\n\n /**\n * Destroy the microphone plugin.\n */\n destroy() {\n // make sure the buffer is not redrawn during\n // cleanup and demolition of this plugin.\n this.paused = true;\n\n this.wavesurfer.un('backend-created', this._onBackendCreated);\n this.stop();\n }\n\n /**\n * Allow user to select audio input device, e.g. microphone, and\n * start the visualization.\n */\n start() {\n navigator.mediaDevices\n .getUserMedia(this.constraints)\n .then(data => this.gotStream(data))\n .catch(data => this.deviceError(data));\n }\n\n /**\n * Pause/resume visualization.\n */\n togglePlay() {\n if (!this.active) {\n // start it first\n this.start();\n } else {\n // toggle paused\n this.paused = !this.paused;\n\n if (this.paused) {\n this.pause();\n } else {\n this.play();\n }\n }\n }\n\n /**\n * Play visualization.\n */\n play() {\n this.paused = false;\n\n this.connect();\n }\n\n /**\n * Pause visualization.\n */\n pause() {\n this.paused = true;\n\n // disconnect sources so they can be used elsewhere\n // (eg. during audio playback)\n this.disconnect();\n }\n\n /**\n * Stop the device stream and remove any remaining waveform drawing from\n * the wavesurfer canvas.\n */\n stop() {\n if (this.active) {\n // stop visualization and device\n this.stopDevice();\n\n // empty last frame\n this.wavesurfer.empty();\n }\n }\n\n /**\n * Stop the device and the visualization.\n */\n stopDevice() {\n this.active = false;\n\n // stop visualization\n this.disconnect();\n\n // stop stream from device\n if (this.stream && this.stream.getTracks) {\n this.stream.getTracks().forEach(stream => stream.stop());\n }\n }\n\n /**\n * Connect the media sources that feed the visualization.\n */\n connect() {\n if (this.stream !== undefined) {\n // Create a local buffer for data to be copied to the Wavesurfer buffer for Edge\n if (this.browser.browser === 'edge') {\n this.localAudioBuffer = this.micContext.createBuffer(\n this.numberOfInputChannels,\n this.bufferSize,\n this.micContext.sampleRate\n );\n }\n\n // Create an AudioNode from the stream.\n this.mediaStreamSource = this.micContext.createMediaStreamSource(\n this.stream\n );\n\n this.levelChecker = this.micContext.createScriptProcessor(\n this.bufferSize,\n this.numberOfInputChannels,\n this.numberOfOutputChannels\n );\n this.mediaStreamSource.connect(this.levelChecker);\n\n this.levelChecker.connect(this.micContext.destination);\n this.levelChecker.onaudioprocess = this.reloadBufferFunction;\n }\n }\n\n /**\n * Disconnect the media sources that feed the visualization.\n */\n disconnect() {\n if (this.mediaStreamSource !== undefined) {\n this.mediaStreamSource.disconnect();\n }\n\n if (this.levelChecker !== undefined) {\n this.levelChecker.disconnect();\n this.levelChecker.onaudioprocess = undefined;\n }\n\n if (this.localAudioBuffer !== undefined) {\n this.localAudioBuffer = undefined;\n }\n }\n\n /**\n * Redraw the waveform.\n *\n * @param {object} event Audioprocess event\n */\n reloadBuffer(event) {\n if (!this.paused) {\n this.wavesurfer.empty();\n\n if (this.browser.browser === 'edge') {\n // copy audio data to a local audio buffer,\n // from https://github.com/audiojs/audio-buffer-utils\n let channel, l;\n for (\n channel = 0,\n l = Math.min(\n this.localAudioBuffer.numberOfChannels,\n event.inputBuffer.numberOfChannels\n );\n channel < l;\n channel++\n ) {\n this.localAudioBuffer\n .getChannelData(channel)\n .set(event.inputBuffer.getChannelData(channel));\n }\n\n this.wavesurfer.loadDecodedBuffer(this.localAudioBuffer);\n } else {\n this.wavesurfer.loadDecodedBuffer(event.inputBuffer);\n }\n }\n }\n\n /**\n * Audio input device is ready.\n *\n * @param {MediaStream} stream The microphone's media stream.\n */\n gotStream(stream) {\n this.stream = stream;\n this.active = true;\n\n // start visualization\n this.play();\n\n // notify listeners\n this.fireEvent('deviceReady', stream);\n }\n\n /**\n * Device error callback.\n *\n * @param {string} code Error message\n */\n deviceError(code) {\n // notify listeners\n this.fireEvent('deviceError', code);\n }\n\n /**\n * Extract browser version out of the provided user agent string.\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\n extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n }\n\n /**\n * Browser detector.\n * @return {object} result containing browser, version and minVersion\n * properties.\n */\n detectBrowser() {\n // Returned result object.\n const result = {};\n result.browser = null;\n result.version = null;\n result.minVersion = null;\n\n // Non supported browser.\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n if (navigator.mozGetUserMedia) {\n // Firefox\n result.browser = 'firefox';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Firefox\\/(\\d+)\\./,\n 1\n );\n result.minVersion = 31;\n return result;\n } else if (navigator.webkitGetUserMedia) {\n // Chrome/Chromium/Webview/Opera\n result.browser = 'chrome';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./,\n 2\n );\n result.minVersion = 38;\n return result;\n } else if (\n navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)\n ) {\n // Edge\n result.browser = 'edge';\n result.version = this.extractVersion(\n navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/,\n 2\n );\n result.minVersion = 10547;\n return result;\n } else if (\n window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)\n ) {\n // Safari\n result.browser = 'safari';\n result.minVersion = 11;\n result.version = this.extractVersion(\n navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./,\n 1\n );\n return result;\n }\n\n // Non supported browser default.\n result.browser = 'Not a supported browser.';\n return result;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(872);\n"],"names":["root","factory","exports","module","define","amd","self","MicrophonePlugin","params","ws","this","wavesurfer","active","paused","browser","detectBrowser","reloadBufferFunction","e","reloadBuffer","undefined","navigator","mediaDevices","getUserMedia","constraints","successCallback","errorCallback","webkitGetUserMedia","mozGetUserMedia","msGetUserMedia","Promise","call","reject","Error","video","audio","bufferSize","numberOfInputChannels","numberOfOutputChannels","_onBackendCreated","micContext","backend","getAudioContext","name","deferInit","instance","on","un","stop","then","data","gotStream","catch","deviceError","pause","play","start","connect","disconnect","stopDevice","empty","stream","getTracks","forEach","localAudioBuffer","createBuffer","sampleRate","mediaStreamSource","createMediaStreamSource","levelChecker","createScriptProcessor","destination","onaudioprocess","event","channel","l","Math","min","numberOfChannels","inputBuffer","getChannelData","set","loadDecodedBuffer","fireEvent","code","uastring","expr","pos","match","length","parseInt","result","window","version","extractVersion","userAgent","minVersion","RTCPeerConnection","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
|