/*! * wavesurfer.js 5.1.0 (2021-08-06) * https://wavesurfer-js.org * @license BSD-3-Clause */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("WaveSurfer", [], factory); else if(typeof exports === 'object') exports["WaveSurfer"] = factory(); else root["WaveSurfer"] = factory(); })(this, function() { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./src/drawer.canvasentry.js": /*!***********************************!*\ !*** ./src/drawer.canvasentry.js ***! \***********************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.default = void 0; var _style = _interopRequireDefault(__webpack_require__(/*! ./util/style */ "./src/util/style.js")); var _getId = _interopRequireDefault(__webpack_require__(/*! ./util/get-id */ "./src/util/get-id.js")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * The `CanvasEntry` class represents an element consisting of a wave `canvas` * and an (optional) progress wave `canvas`. * * The `MultiCanvas` renderer uses one or more `CanvasEntry` instances to * render a waveform, depending on the zoom level. */ var CanvasEntry = /*#__PURE__*/function () { function CanvasEntry() { _classCallCheck(this, CanvasEntry); /** * The wave node * * @type {HTMLCanvasElement} */ this.wave = null; /** * The wave canvas rendering context * * @type {CanvasRenderingContext2D} */ this.waveCtx = null; /** * The (optional) progress wave node * * @type {HTMLCanvasElement} */ this.progress = null; /** * The (optional) progress wave canvas rendering context * * @type {CanvasRenderingContext2D} */ this.progressCtx = null; /** * Start of the area the canvas should render, between 0 and 1 * * @type {number} */ this.start = 0; /** * End of the area the canvas should render, between 0 and 1 * * @type {number} */ this.end = 1; /** * Unique identifier for this entry * * @type {string} */ this.id = (0, _getId.default)(typeof this.constructor.name !== 'undefined' ? this.constructor.name.toLowerCase() + '_' : 'canvasentry_'); /** * Canvas 2d context attributes * * @type {object} */ this.canvasContextAttributes = {}; } /** * Store the wave canvas element and create the 2D rendering context * * @param {HTMLCanvasElement} element The wave `canvas` element. */ _createClass(CanvasEntry, [{ key: "initWave", value: function initWave(element) { this.wave = element; this.waveCtx = this.wave.getContext('2d', this.canvasContextAttributes); } /** * Store the progress wave canvas element and create the 2D rendering * context * * @param {HTMLCanvasElement} element The progress wave `canvas` element. */ }, { key: "initProgress", value: function initProgress(element) { this.progress = element; this.progressCtx = this.progress.getContext('2d', this.canvasContextAttributes); } /** * Update the dimensions * * @param {number} elementWidth Width of the entry * @param {number} totalWidth Total width of the multi canvas renderer * @param {number} width The new width of the element * @param {number} height The new height of the element */ }, { key: "updateDimensions", value: function updateDimensions(elementWidth, totalWidth, width, height) { // where the canvas starts and ends in the waveform, represented as a // decimal between 0 and 1 this.start = this.wave.offsetLeft / totalWidth || 0; this.end = this.start + elementWidth / totalWidth; // set wave canvas dimensions this.wave.width = width; this.wave.height = height; var elementSize = { width: elementWidth + 'px' }; (0, _style.default)(this.wave, elementSize); if (this.hasProgressCanvas) { // set progress canvas dimensions this.progress.width = width; this.progress.height = height; (0, _style.default)(this.progress, elementSize); } } /** * Clear the wave and progress rendering contexts */ }, { key: "clearWave", value: function clearWave() { // wave this.waveCtx.clearRect(0, 0, this.waveCtx.canvas.width, this.waveCtx.canvas.height); // progress if (this.hasProgressCanvas) { this.progressCtx.clearRect(0, 0, this.progressCtx.canvas.width, this.progressCtx.canvas.height); } } /** * Set the fill styles for wave and progress * * @param {string} waveColor Fill color for the wave canvas * @param {?string} progressColor Fill color for the progress canvas */ }, { key: "setFillStyles", value: function setFillStyles(waveColor, progressColor) { this.waveCtx.fillStyle = waveColor; if (this.hasProgressCanvas) { this.progressCtx.fillStyle = progressColor; } } /** * Set the canvas transforms for wave and progress * * @param {boolean} vertical Whether to render vertically */ }, { key: "applyCanvasTransforms", value: function applyCanvasTransforms(vertical) { if (vertical) { // Reflect the waveform across the line y = -x this.waveCtx.setTransform(0, 1, 1, 0, 0, 0); if (this.hasProgressCanvas) { this.progressCtx.setTransform(0, 1, 1, 0, 0, 0); } } } /** * Draw a rectangle for wave and progress * * @param {number} x X start position * @param {number} y Y start position * @param {number} width Width of the rectangle * @param {number} height Height of the rectangle * @param {number} radius Radius of the rectangle */ }, { key: "fillRects", value: function fillRects(x, y, width, height, radius) { this.fillRectToContext(this.waveCtx, x, y, width, height, radius); if (this.hasProgressCanvas) { this.fillRectToContext(this.progressCtx, x, y, width, height, radius); } } /** * Draw the actual rectangle on a `canvas` element * * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas * @param {number} x X start position * @param {number} y Y start position * @param {number} width Width of the rectangle * @param {number} height Height of the rectangle * @param {number} radius Radius of the rectangle */ }, { key: "fillRectToContext", value: function fillRectToContext(ctx, x, y, width, height, radius) { if (!ctx) { return; } if (radius) { this.drawRoundedRect(ctx, x, y, width, height, radius); } else { ctx.fillRect(x, y, width, height); } } /** * Draw a rounded rectangle on Canvas * * @param {CanvasRenderingContext2D} ctx Canvas context * @param {number} x X-position of the rectangle * @param {number} y Y-position of the rectangle * @param {number} width Width of the rectangle * @param {number} height Height of the rectangle * @param {number} radius Radius of the rectangle * * @return {void} * @example drawRoundedRect(ctx, 50, 50, 5, 10, 3) */ }, { key: "drawRoundedRect", value: function drawRoundedRect(ctx, x, y, width, height, radius) { if (height === 0) { return; } // peaks are float values from -1 to 1. Use absolute height values in // order to correctly calculate rounded rectangle coordinates if (height < 0) { height *= -1; y -= height; } ctx.beginPath(); ctx.moveTo(x + radius, y); ctx.lineTo(x + width - radius, y); ctx.quadraticCurveTo(x + width, y, x + width, y + radius); ctx.lineTo(x + width, y + height - radius); ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); ctx.lineTo(x + radius, y + height); ctx.quadraticCurveTo(x, y + height, x, y + height - radius); ctx.lineTo(x, y + radius); ctx.quadraticCurveTo(x, y, x + radius, y); ctx.closePath(); ctx.fill(); } /** * Render the actual wave and progress lines * * @param {number[]} peaks Array with peaks data * @param {number} absmax Maximum peak value (absolute) * @param {number} halfH Half the height of the waveform * @param {number} offsetY Offset to the top * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that * should be rendered */ }, { key: "drawLines", value: function drawLines(peaks, absmax, halfH, offsetY, start, end) { this.drawLineToContext(this.waveCtx, peaks, absmax, halfH, offsetY, start, end); if (this.hasProgressCanvas) { this.drawLineToContext(this.progressCtx, peaks, absmax, halfH, offsetY, start, end); } } /** * Render the actual waveform line on a `canvas` element * * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas * @param {number[]} peaks Array with peaks data * @param {number} absmax Maximum peak value (absolute) * @param {number} halfH Half the height of the waveform * @param {number} offsetY Offset to the top * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that * should be rendered */ }, { key: "drawLineToContext", value: function drawLineToContext(ctx, peaks, absmax, halfH, offsetY, start, end) { if (!ctx) { return; } var length = peaks.length / 2; var first = Math.round(length * this.start); // use one more peak value to make sure we join peaks at ends -- unless, // of course, this is the last canvas var last = Math.round(length * this.end) + 1; var canvasStart = first; var canvasEnd = last; var scale = this.wave.width / (canvasEnd - canvasStart - 1); // optimization var halfOffset = halfH + offsetY; var absmaxHalf = absmax / halfH; ctx.beginPath(); ctx.moveTo((canvasStart - first) * scale, halfOffset); ctx.lineTo((canvasStart - first) * scale, halfOffset - Math.round((peaks[2 * canvasStart] || 0) / absmaxHalf)); var i, peak, h; for (i = canvasStart; i < canvasEnd; i++) { peak = peaks[2 * i] || 0; h = Math.round(peak / absmaxHalf); ctx.lineTo((i - first) * scale + this.halfPixel, halfOffset - h); } // draw the bottom edge going backwards, to make a single // closed hull to fill var j = canvasEnd - 1; for (j; j >= canvasStart; j--) { peak = peaks[2 * j + 1] || 0; h = Math.round(peak / absmaxHalf); ctx.lineTo((j - first) * scale + this.halfPixel, halfOffset - h); } ctx.lineTo((canvasStart - first) * scale, halfOffset - Math.round((peaks[2 * canvasStart + 1] || 0) / absmaxHalf)); ctx.closePath(); ctx.fill(); } /** * Destroys this entry */ }, { key: "destroy", value: function destroy() { this.waveCtx = null; this.wave = null; this.progressCtx = null; this.progress = null; } /** * Return image data of the wave `canvas` element * * When using a `type` of `'blob'`, this will return a `Promise` that * resolves with a `Blob` instance. * * @param {string} format='image/png' An optional value of a format type. * @param {number} quality=0.92 An optional value between 0 and 1. * @param {string} type='dataURL' Either 'dataURL' or 'blob'. * @return {string|Promise} When using the default `'dataURL'` `type` this * returns a data URL. When using the `'blob'` `type` this returns a * `Promise` that resolves with a `Blob` instance. */ }, { key: "getImage", value: function getImage(format, quality, type) { var _this = this; if (type === 'blob') { return new Promise(function (resolve) { _this.wave.toBlob(resolve, format, quality); }); } else if (type === 'dataURL') { return this.wave.toDataURL(format, quality); } } }]); return CanvasEntry; }(); exports.default = CanvasEntry; module.exports = exports.default; /***/ }), /***/ "./src/drawer.js": /*!***********************!*\ !*** ./src/drawer.js ***! \***********************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", ({ value: true })); exports.default = void 0; var util = _interopRequireWildcard(__webpack_require__(/*! ./util */ "./src/util/index.js")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } /** * Parent class for renderers * * @extends {Observer} */ var Drawer = /*#__PURE__*/function (_util$Observer) { _inherits(Drawer, _util$Observer); var _super = _createSuper(Drawer); /** * @param {HTMLElement} container The container node of the wavesurfer instance * @param {WavesurferParams} params The wavesurfer initialisation options */ function Drawer(container, params) { var _this; _classCallCheck(this, Drawer); _this = _super.call(this); _this.container = util.withOrientation(container, params.vertical); /** * @type {WavesurferParams} */ _this.params = params; /** * The width of the renderer * @type {number} */ _this.width = 0; /** * The height of the renderer * @type {number} */ _this.height = params.height * _this.params.pixelRatio; _this.lastPos = 0; /** * The `` element which is added to the container * @type {HTMLElement} */ _this.wrapper = null; return _this; } /** * Alias of `util.style` * * @param {HTMLElement} el The element that the styles will be applied to * @param {Object} styles The map of propName: attribute, both are used as-is * @return {HTMLElement} el */ _createClass(Drawer, [{ key: "style", value: function style(el, styles) { return util.style(el, styles); } /** * Create the wrapper `` element, style it and set up the events for * interaction */ }, { key: "createWrapper", value: function createWrapper() { this.wrapper = util.withOrientation(this.container.appendChild(document.createElement('wave')), this.params.vertical); this.style(this.wrapper, { display: 'block', position: 'relative', userSelect: 'none', webkitUserSelect: 'none', height: this.params.height + 'px' }); if (this.params.fillParent || this.params.scrollParent) { this.style(this.wrapper, { width: '100%', overflowX: this.params.hideScrollbar ? 'hidden' : 'auto', overflowY: 'hidden' }); } this.setupWrapperEvents(); } /** * Handle click event * * @param {Event} e Click event * @param {?boolean} noPrevent Set to true to not call `e.preventDefault()` * @return {number} Playback position from 0 to 1 */ }, { key: "handleEvent", value: function handleEvent(e, noPrevent) { !noPrevent && e.preventDefault(); var clientX = util.withOrientation(e.targetTouches ? e.targetTouches[0] : e, this.params.vertical).clientX; var bbox = this.wrapper.getBoundingClientRect(); var nominalWidth = this.width; var parentWidth = this.getWidth(); var progressPixels = this.getProgressPixels(bbox, clientX); var progress; if (!this.params.fillParent && nominalWidth < parentWidth) { progress = progressPixels * (this.params.pixelRatio / nominalWidth) || 0; } else { progress = (progressPixels + this.wrapper.scrollLeft) / this.wrapper.scrollWidth || 0; } return util.clamp(progress, 0, 1); } }, { key: "getProgressPixels", value: function getProgressPixels(wrapperBbox, clientX) { if (this.params.rtl) { return wrapperBbox.right - clientX; } else { return clientX - wrapperBbox.left; } } }, { key: "setupWrapperEvents", value: function setupWrapperEvents() { var _this2 = this; this.wrapper.addEventListener('click', function (e) { var orientedEvent = util.withOrientation(e, _this2.params.vertical); var scrollbarHeight = _this2.wrapper.offsetHeight - _this2.wrapper.clientHeight; if (scrollbarHeight !== 0) { // scrollbar is visible. Check if click was on it var bbox = _this2.wrapper.getBoundingClientRect(); if (orientedEvent.clientY >= bbox.bottom - scrollbarHeight) { // ignore mousedown as it was on the scrollbar return; } } if (_this2.params.interact) { _this2.fireEvent('click', e, _this2.handleEvent(e)); } }); this.wrapper.addEventListener('dblclick', function (e) { if (_this2.params.interact) { _this2.fireEvent('dblclick', e, _this2.handleEvent(e)); } }); this.wrapper.addEventListener('scroll', function (e) { return _this2.fireEvent('scroll', e); }); } /** * Draw peaks on the canvas * * @param {number[]|Number.} peaks Can also be an array of arrays * for split channel rendering * @param {number} length The width of the area that should be drawn * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that should be * rendered */ }, { key: "drawPeaks", value: function drawPeaks(peaks, length, start, end) { if (!this.setWidth(length)) { this.clearWave(); } this.params.barWidth ? this.drawBars(peaks, 0, start, end) : this.drawWave(peaks, 0, start, end); } /** * Scroll to the beginning */ }, { key: "resetScroll", value: function resetScroll() { if (this.wrapper !== null) { this.wrapper.scrollLeft = 0; } } /** * Recenter the view-port at a certain percent of the waveform * * @param {number} percent Value from 0 to 1 on the waveform */ }, { key: "recenter", value: function recenter(percent) { var position = this.wrapper.scrollWidth * percent; this.recenterOnPosition(position, true); } /** * Recenter the view-port on a position, either scroll there immediately or * in steps of 5 pixels * * @param {number} position X-offset in pixels * @param {boolean} immediate Set to true to immediately scroll somewhere */ }, { key: "recenterOnPosition", value: function recenterOnPosition(position, immediate) { var scrollLeft = this.wrapper.scrollLeft; var half = ~~(this.wrapper.clientWidth / 2); var maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth; var target = position - half; var offset = target - scrollLeft; if (maxScroll == 0) { // no need to continue if scrollbar is not there return; } // if the cursor is currently visible... if (!immediate && -half <= offset && offset < half) { // set rate at which waveform is centered var rate = this.params.autoCenterRate; // make rate depend on width of view and length of waveform rate /= half; rate *= maxScroll; offset = Math.max(-rate, Math.min(rate, offset)); target = scrollLeft + offset; } // limit target to valid range (0 to maxScroll) target = Math.max(0, Math.min(maxScroll, target)); // no use attempting to scroll if we're not moving if (target != scrollLeft) { this.wrapper.scrollLeft = target; } } /** * Get the current scroll position in pixels * * @return {number} Horizontal scroll position in pixels */ }, { key: "getScrollX", value: function getScrollX() { var x = 0; if (this.wrapper) { var pixelRatio = this.params.pixelRatio; x = Math.round(this.wrapper.scrollLeft * pixelRatio); // In cases of elastic scroll (safari with mouse wheel) you can // scroll beyond the limits of the container // Calculate and floor the scrollable extent to make sure an out // of bounds value is not returned // Ticket #1312 if (this.params.scrollParent) { var maxScroll = ~~(this.wrapper.scrollWidth * pixelRatio - this.getWidth()); x = Math.min(maxScroll, Math.max(0, x)); } } return x; } /** * Get the width of the container * * @return {number} The width of the container */ }, { key: "getWidth", value: function getWidth() { return Math.round(this.container.clientWidth * this.params.pixelRatio); } /** * Set the width of the container * * @param {number} width The new width of the container * @return {boolean} Whether the width of the container was updated or not */ }, { key: "setWidth", value: function setWidth(width) { if (this.width == width) { return false; } this.width = width; if (this.params.fillParent || this.params.scrollParent) { this.style(this.wrapper, { width: '' }); } else { var newWidth = ~~(this.width / this.params.pixelRatio) + 'px'; this.style(this.wrapper, { width: newWidth }); } this.updateSize(); return true; } /** * Set the height of the container * * @param {number} height The new height of the container. * @return {boolean} Whether the height of the container was updated or not */ }, { key: "setHeight", value: function setHeight(height) { if (height == this.height) { return false; } this.height = height; this.style(this.wrapper, { height: ~~(this.height / this.params.pixelRatio) + 'px' }); this.updateSize(); return true; } /** * Called by wavesurfer when progress should be rendered * * @param {number} progress From 0 to 1 */ }, { key: "progress", value: function progress(_progress) { var minPxDelta = 1 / this.params.pixelRatio; var pos = Math.round(_progress * this.width) * minPxDelta; if (pos < this.lastPos || pos - this.lastPos >= minPxDelta) { this.lastPos = pos; if (this.params.scrollParent && this.params.autoCenter) { var newPos = ~~(this.wrapper.scrollWidth * _progress); this.recenterOnPosition(newPos, this.params.autoCenterImmediately); } this.updateProgress(pos); } } /** * This is called when wavesurfer is destroyed */ }, { key: "destroy", value: function destroy() { this.unAll(); if (this.wrapper) { if (this.wrapper.parentNode == this.container.domElement) { this.container.removeChild(this.wrapper.domElement); } this.wrapper = null; } } /* Renderer-specific methods */ /** * Called after cursor related params have changed. * * @abstract */ }, { key: "updateCursor", value: function updateCursor() {} /** * Called when the size of the container changes so the renderer can adjust * * @abstract */ }, { key: "updateSize", value: function updateSize() {} /** * Draw a waveform with bars * * @abstract * @param {number[]|Number.} peaks Can also be an array of arrays for split channel * rendering * @param {number} channelIndex The index of the current channel. Normally * should be 0 * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that should be * rendered */ }, { key: "drawBars", value: function drawBars(peaks, channelIndex, start, end) {} /** * Draw a waveform * * @abstract * @param {number[]|Number.} peaks Can also be an array of arrays for split channel * rendering * @param {number} channelIndex The index of the current channel. Normally * should be 0 * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that should be * rendered */ }, { key: "drawWave", value: function drawWave(peaks, channelIndex, start, end) {} /** * Clear the waveform * * @abstract */ }, { key: "clearWave", value: function clearWave() {} /** * Render the new progress * * @abstract * @param {number} position X-Offset of progress position in pixels */ }, { key: "updateProgress", value: function updateProgress(position) {} }]); return Drawer; }(util.Observer); exports.default = Drawer; module.exports = exports.default; /***/ }), /***/ "./src/drawer.multicanvas.js": /*!***********************************!*\ !*** ./src/drawer.multicanvas.js ***! \***********************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", ({ value: true })); exports.default = void 0; var _drawer = _interopRequireDefault(__webpack_require__(/*! ./drawer */ "./src/drawer.js")); var util = _interopRequireWildcard(__webpack_require__(/*! ./util */ "./src/util/index.js")); var _drawer2 = _interopRequireDefault(__webpack_require__(/*! ./drawer.canvasentry */ "./src/drawer.canvasentry.js")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } /** * MultiCanvas renderer for wavesurfer. Is currently the default and sole * builtin renderer. * * A `MultiCanvas` consists of one or more `CanvasEntry` instances, depending * on the zoom level. */ var MultiCanvas = /*#__PURE__*/function (_Drawer) { _inherits(MultiCanvas, _Drawer); var _super = _createSuper(MultiCanvas); /** * @param {HTMLElement} container The container node of the wavesurfer instance * @param {WavesurferParams} params The wavesurfer initialisation options */ function MultiCanvas(container, params) { var _this; _classCallCheck(this, MultiCanvas); _this = _super.call(this, container, params); /** * @type {number} */ _this.maxCanvasWidth = params.maxCanvasWidth; /** * @type {number} */ _this.maxCanvasElementWidth = Math.round(params.maxCanvasWidth / params.pixelRatio); /** * Whether or not the progress wave is rendered. If the `waveColor` * and `progressColor` are the same color it is not. * * @type {boolean} */ _this.hasProgressCanvas = params.waveColor != params.progressColor; /** * @type {number} */ _this.halfPixel = 0.5 / params.pixelRatio; /** * List of `CanvasEntry` instances. * * @type {Array} */ _this.canvases = []; /** * @type {HTMLElement} */ _this.progressWave = null; /** * Class used to generate entries. * * @type {function} */ _this.EntryClass = _drawer2.default; /** * Canvas 2d context attributes. * * @type {object} */ _this.canvasContextAttributes = params.drawingContextAttributes; /** * Overlap added between entries to prevent vertical white stripes * between `canvas` elements. * * @type {number} */ _this.overlap = 2 * Math.ceil(params.pixelRatio / 2); /** * The radius of the wave bars. Makes bars rounded * * @type {number} */ _this.barRadius = params.barRadius || 0; /** * Whether to render the waveform vertically. Defaults to false. * * @type {boolean} */ _this.vertical = params.vertical; return _this; } /** * Initialize the drawer */ _createClass(MultiCanvas, [{ key: "init", value: function init() { this.createWrapper(); this.createElements(); } /** * Create the canvas elements and style them * */ }, { key: "createElements", value: function createElements() { this.progressWave = util.withOrientation(this.wrapper.appendChild(document.createElement('wave')), this.params.vertical); this.style(this.progressWave, { position: 'absolute', zIndex: 3, left: 0, top: 0, bottom: 0, overflow: 'hidden', width: '0', display: 'none', boxSizing: 'border-box', borderRightStyle: 'solid', pointerEvents: 'none' }); this.addCanvas(); this.updateCursor(); } /** * Update cursor style */ }, { key: "updateCursor", value: function updateCursor() { this.style(this.progressWave, { borderRightWidth: this.params.cursorWidth + 'px', borderRightColor: this.params.cursorColor }); } /** * Adjust to the updated size by adding or removing canvases */ }, { key: "updateSize", value: function updateSize() { var _this2 = this; var totalWidth = Math.round(this.width / this.params.pixelRatio); var requiredCanvases = Math.ceil(totalWidth / (this.maxCanvasElementWidth + this.overlap)); // add required canvases while (this.canvases.length < requiredCanvases) { this.addCanvas(); } // remove older existing canvases, if any while (this.canvases.length > requiredCanvases) { this.removeCanvas(); } var canvasWidth = this.maxCanvasWidth + this.overlap; var lastCanvas = this.canvases.length - 1; this.canvases.forEach(function (entry, i) { if (i == lastCanvas) { canvasWidth = _this2.width - _this2.maxCanvasWidth * lastCanvas; } _this2.updateDimensions(entry, canvasWidth, _this2.height); entry.clearWave(); }); } /** * Add a canvas to the canvas list * */ }, { key: "addCanvas", value: function addCanvas() { var entry = new this.EntryClass(); entry.canvasContextAttributes = this.canvasContextAttributes; entry.hasProgressCanvas = this.hasProgressCanvas; entry.halfPixel = this.halfPixel; var leftOffset = this.maxCanvasElementWidth * this.canvases.length; // wave var wave = util.withOrientation(this.wrapper.appendChild(document.createElement('canvas')), this.params.vertical); this.style(wave, { position: 'absolute', zIndex: 2, left: leftOffset + 'px', top: 0, bottom: 0, height: '100%', pointerEvents: 'none' }); entry.initWave(wave); // progress if (this.hasProgressCanvas) { var progress = util.withOrientation(this.progressWave.appendChild(document.createElement('canvas')), this.params.vertical); this.style(progress, { position: 'absolute', left: leftOffset + 'px', top: 0, bottom: 0, height: '100%' }); entry.initProgress(progress); } this.canvases.push(entry); } /** * Pop single canvas from the list * */ }, { key: "removeCanvas", value: function removeCanvas() { var lastEntry = this.canvases[this.canvases.length - 1]; // wave lastEntry.wave.parentElement.removeChild(lastEntry.wave.domElement); // progress if (this.hasProgressCanvas) { lastEntry.progress.parentElement.removeChild(lastEntry.progress.domElement); } // cleanup if (lastEntry) { lastEntry.destroy(); lastEntry = null; } this.canvases.pop(); } /** * Update the dimensions of a canvas element * * @param {CanvasEntry} entry Target entry * @param {number} width The new width of the element * @param {number} height The new height of the element */ }, { key: "updateDimensions", value: function updateDimensions(entry, width, height) { var elementWidth = Math.round(width / this.params.pixelRatio); var totalWidth = Math.round(this.width / this.params.pixelRatio); // update canvas dimensions entry.updateDimensions(elementWidth, totalWidth, width, height); // style element this.style(this.progressWave, { display: 'block' }); } /** * Clear the whole multi-canvas */ }, { key: "clearWave", value: function clearWave() { var _this3 = this; util.frame(function () { _this3.canvases.forEach(function (entry) { return entry.clearWave(); }); })(); } /** * Draw a waveform with bars * * @param {number[]|Number.} peaks Can also be an array of arrays * for split channel rendering * @param {number} channelIndex The index of the current channel. Normally * should be 0. Must be an integer. * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that should be * rendered * @returns {void} */ }, { key: "drawBars", value: function drawBars(peaks, channelIndex, start, end) { var _this4 = this; return this.prepareDraw(peaks, channelIndex, start, end, function (_ref) { var absmax = _ref.absmax, hasMinVals = _ref.hasMinVals, height = _ref.height, offsetY = _ref.offsetY, halfH = _ref.halfH, peaks = _ref.peaks, ch = _ref.channelIndex; // if drawBars was called within ws.empty we don't pass a start and // don't want anything to happen if (start === undefined) { return; } // Skip every other value if there are negatives. var peakIndexScale = hasMinVals ? 2 : 1; var length = peaks.length / peakIndexScale; var bar = _this4.params.barWidth * _this4.params.pixelRatio; var gap = _this4.params.barGap === null ? Math.max(_this4.params.pixelRatio, ~~(bar / 2)) : Math.max(_this4.params.pixelRatio, _this4.params.barGap * _this4.params.pixelRatio); var step = bar + gap; var scale = length / _this4.width; var first = start; var last = end; var i = first; for (i; i < last; i += step) { var peak = peaks[Math.floor(i * scale * peakIndexScale)] || 0; var h = Math.round(peak / absmax * halfH); /* in case of silences, allow the user to specify that we * always draw *something* (normally a 1px high bar) */ if (h == 0 && _this4.params.barMinHeight) { h = _this4.params.barMinHeight; } _this4.fillRect(i + _this4.halfPixel, halfH - h + offsetY, bar + _this4.halfPixel, h * 2, _this4.barRadius, ch); } }); } /** * Draw a waveform * * @param {number[]|Number.} peaks Can also be an array of arrays * for split channel rendering * @param {number} channelIndex The index of the current channel. Normally * should be 0 * @param {number?} start The x-offset of the beginning of the area that * should be rendered (If this isn't set only a flat line is rendered) * @param {number?} end The x-offset of the end of the area that should be * rendered * @returns {void} */ }, { key: "drawWave", value: function drawWave(peaks, channelIndex, start, end) { var _this5 = this; return this.prepareDraw(peaks, channelIndex, start, end, function (_ref2) { var absmax = _ref2.absmax, hasMinVals = _ref2.hasMinVals, height = _ref2.height, offsetY = _ref2.offsetY, halfH = _ref2.halfH, peaks = _ref2.peaks, channelIndex = _ref2.channelIndex; if (!hasMinVals) { var reflectedPeaks = []; var len = peaks.length; var i = 0; for (i; i < len; i++) { reflectedPeaks[2 * i] = peaks[i]; reflectedPeaks[2 * i + 1] = -peaks[i]; } peaks = reflectedPeaks; } // if drawWave was called within ws.empty we don't pass a start and // end and simply want a flat line if (start !== undefined) { _this5.drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex); } // always draw a median line _this5.fillRect(0, halfH + offsetY - _this5.halfPixel, _this5.width, _this5.halfPixel, _this5.barRadius, channelIndex); }); } /** * Tell the canvas entries to render their portion of the waveform * * @param {number[]} peaks Peaks data * @param {number} absmax Maximum peak value (absolute) * @param {number} halfH Half the height of the waveform * @param {number} offsetY Offset to the top * @param {number} start The x-offset of the beginning of the area that * should be rendered * @param {number} end The x-offset of the end of the area that * should be rendered * @param {channelIndex} channelIndex The channel index of the line drawn */ }, { key: "drawLine", value: function drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex) { var _this6 = this; var _ref3 = this.params.splitChannelsOptions.channelColors[channelIndex] || {}, waveColor = _ref3.waveColor, progressColor = _ref3.progressColor; this.canvases.forEach(function (entry, i) { _this6.setFillStyles(entry, waveColor, progressColor); _this6.applyCanvasTransforms(entry, _this6.params.vertical); entry.drawLines(peaks, absmax, halfH, offsetY, start, end); }); } /** * Draw a rectangle on the multi-canvas * * @param {number} x X-position of the rectangle * @param {number} y Y-position of the rectangle * @param {number} width Width of the rectangle * @param {number} height Height of the rectangle * @param {number} radius Radius of the rectangle * @param {channelIndex} channelIndex The channel index of the bar drawn */ }, { key: "fillRect", value: function fillRect(x, y, width, height, radius, channelIndex) { var startCanvas = Math.floor(x / this.maxCanvasWidth); var endCanvas = Math.min(Math.ceil((x + width) / this.maxCanvasWidth) + 1, this.canvases.length); var i = startCanvas; for (i; i < endCanvas; i++) { var entry = this.canvases[i]; var leftOffset = i * this.maxCanvasWidth; var intersection = { x1: Math.max(x, i * this.maxCanvasWidth), y1: y, x2: Math.min(x + width, i * this.maxCanvasWidth + entry.wave.width), y2: y + height }; if (intersection.x1 < intersection.x2) { var _ref4 = this.params.splitChannelsOptions.channelColors[channelIndex] || {}, waveColor = _ref4.waveColor, progressColor = _ref4.progressColor; this.setFillStyles(entry, waveColor, progressColor); this.applyCanvasTransforms(entry, this.params.vertical); entry.fillRects(intersection.x1 - leftOffset, intersection.y1, intersection.x2 - intersection.x1, intersection.y2 - intersection.y1, radius); } } } /** * Returns whether to hide the channel from being drawn based on params. * * @param {number} channelIndex The index of the current channel. * @returns {bool} True to hide the channel, false to draw. */ }, { key: "hideChannel", value: function hideChannel(channelIndex) { return this.params.splitChannels && this.params.splitChannelsOptions.filterChannels.includes(channelIndex); } /** * Performs preparation tasks and calculations which are shared by `drawBars` * and `drawWave` * * @param {number[]|Number.} peaks Can also be an array of arrays for * split channel rendering * @param {number} channelIndex The index of the current channel. Normally * should be 0 * @param {number?} start The x-offset of the beginning of the area that * should be rendered. If this isn't set only a flat line is rendered * @param {number?} end The x-offset of the end of the area that should be * rendered * @param {function} fn The render function to call, e.g. `drawWave` * @param {number} drawIndex The index of the current channel after filtering. * @param {number?} normalizedMax Maximum modulation value across channels for use with relativeNormalization. Ignored when undefined * @returns {void} */ }, { key: "prepareDraw", value: function prepareDraw(peaks, channelIndex, start, end, fn, drawIndex, normalizedMax) { var _this7 = this; return util.frame(function () { // Split channels and call this function with the channelIndex set if (peaks[0] instanceof Array) { var channels = peaks; if (_this7.params.splitChannels) { var filteredChannels = channels.filter(function (c, i) { return !_this7.hideChannel(i); }); if (!_this7.params.splitChannelsOptions.overlay) { _this7.setHeight(Math.max(filteredChannels.length, 1) * _this7.params.height * _this7.params.pixelRatio); } var overallAbsMax; if (_this7.params.splitChannelsOptions && _this7.params.splitChannelsOptions.relativeNormalization) { // calculate maximum peak across channels to use for normalization overallAbsMax = util.max(channels.map(function (channelPeaks) { return util.absMax(channelPeaks); })); } return channels.forEach(function (channelPeaks, i) { return _this7.prepareDraw(channelPeaks, i, start, end, fn, filteredChannels.indexOf(channelPeaks), overallAbsMax); }); } peaks = channels[0]; } // Return and do not draw channel peaks if hidden. if (_this7.hideChannel(channelIndex)) { return; } // calculate maximum modulation value, either from the barHeight // parameter or if normalize=true from the largest value in the peak // set var absmax = 1 / _this7.params.barHeight; if (_this7.params.normalize) { absmax = normalizedMax === undefined ? util.absMax(peaks) : normalizedMax; } // Bar wave draws the bottom only as a reflection of the top, // so we don't need negative values var hasMinVals = [].some.call(peaks, function (val) { return val < 0; }); var height = _this7.params.height * _this7.params.pixelRatio; var halfH = height / 2; var offsetY = height * drawIndex || 0; // Override offsetY if overlay is true if (_this7.params.splitChannelsOptions && _this7.params.splitChannelsOptions.overlay) { offsetY = 0; } return fn({ absmax: absmax, hasMinVals: hasMinVals, height: height, offsetY: offsetY, halfH: halfH, peaks: peaks, channelIndex: channelIndex }); })(); } /** * Set the fill styles for a certain entry (wave and progress) * * @param {CanvasEntry} entry Target entry * @param {string} waveColor Wave color to draw this entry * @param {string} progressColor Progress color to draw this entry */ }, { key: "setFillStyles", value: function setFillStyles(entry) { var waveColor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.params.waveColor; var progressColor = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.params.progressColor; entry.setFillStyles(waveColor, progressColor); } /** * Set the canvas transforms for a certain entry (wave and progress) * * @param {CanvasEntry} entry Target entry * @param {boolean} vertical Whether to render the waveform vertically */ }, { key: "applyCanvasTransforms", value: function applyCanvasTransforms(entry) { var vertical = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; entry.applyCanvasTransforms(vertical); } /** * Return image data of the multi-canvas * * When using a `type` of `'blob'`, this will return a `Promise`. * * @param {string} format='image/png' An optional value of a format type. * @param {number} quality=0.92 An optional value between 0 and 1. * @param {string} type='dataURL' Either 'dataURL' or 'blob'. * @return {string|string[]|Promise} When using the default `'dataURL'` * `type` this returns a single data URL or an array of data URLs, * one for each canvas. When using the `'blob'` `type` this returns a * `Promise` that resolves with an array of `Blob` instances, one for each * canvas. */ }, { key: "getImage", value: function getImage(format, quality, type) { if (type === 'blob') { return Promise.all(this.canvases.map(function (entry) { return entry.getImage(format, quality, type); })); } else if (type === 'dataURL') { var images = this.canvases.map(function (entry) { return entry.getImage(format, quality, type); }); return images.length > 1 ? images : images[0]; } } /** * Render the new progress * * @param {number} position X-offset of progress position in pixels */ }, { key: "updateProgress", value: function updateProgress(position) { this.style(this.progressWave, { width: position + 'px' }); } }]); return MultiCanvas; }(_drawer.default); exports.default = MultiCanvas; module.exports = exports.default; /***/ }), /***/ "./src/mediaelement-webaudio.js": /*!**************************************!*\ !*** ./src/mediaelement-webaudio.js ***! \**************************************/ /***/ ((module, exports, __webpack_require__) => { "use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", ({ value: true })); exports.default = void 0; var _mediaelement = _interopRequireDefault(__webpack_require__(/*! ./mediaelement */ "./src/mediaelement.js")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } /** * MediaElementWebAudio backend: load audio via an HTML5 audio tag, but playback with the WebAudio API. * The advantage here is that the html5