libreavous-audio-reader/js/wavesurfer.js.map

1 line
268 KiB
Plaintext

{"version":3,"file":"wavesurfer.js","mappings":"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EAAf,EAAmBC,MAAnB,EAA2B;AACtCgN,EAAAA,MAAM,CAACC,IAAP,CAAYjN,MAAZ,EAAoBuG,OAApB,CAA4B,UAAA0O,IAAI,EAAI;AAChC,QAAIlV,EAAE,CAACE,KAAH,CAASgV,IAAT,MAAmBjV,MAAM,CAACiV,IAAD,CAA7B,EAAqC;AACjClV,MAAAA,EAAE,CAACE,KAAH,CAASgV,IAAT,IAAiBjV,MAAM,CAACiV,IAAD,CAAvB;AACH;AACJ,GAJD;AAKA,SAAOlV,EAAP;AACH;;;;;;;;;;;;;;;;;;;;;;ACfD;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;AACA;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/drawer.canvasentry.js","webpack://WaveSurfer/./src/drawer.js","webpack://WaveSurfer/./src/drawer.multicanvas.js","webpack://WaveSurfer/./src/mediaelement-webaudio.js","webpack://WaveSurfer/./src/mediaelement.js","webpack://WaveSurfer/./src/peakcache.js","webpack://WaveSurfer/./src/util/absMax.js","webpack://WaveSurfer/./src/util/clamp.js","webpack://WaveSurfer/./src/util/fetch.js","webpack://WaveSurfer/./src/util/frame.js","webpack://WaveSurfer/./src/util/get-id.js","webpack://WaveSurfer/./src/util/index.js","webpack://WaveSurfer/./src/util/max.js","webpack://WaveSurfer/./src/util/min.js","webpack://WaveSurfer/./src/util/observer.js","webpack://WaveSurfer/./src/util/orientation.js","webpack://WaveSurfer/./src/util/prevent-click.js","webpack://WaveSurfer/./src/util/request-animation-frame.js","webpack://WaveSurfer/./src/util/style.js","webpack://WaveSurfer/./src/wavesurfer.js","webpack://WaveSurfer/./src/webaudio.js","webpack://WaveSurfer/./node_modules/debounce/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\"] = factory();\n})(this, function() {\nreturn ","/**\n * @since 3.0.0\n */\n\nimport style from './util/style';\nimport getId from './util/get-id';\n\n/**\n * The `CanvasEntry` class represents an element consisting of a wave `canvas`\n * and an (optional) progress wave `canvas`.\n *\n * The `MultiCanvas` renderer uses one or more `CanvasEntry` instances to\n * render a waveform, depending on the zoom level.\n */\nexport default class CanvasEntry {\n constructor() {\n /**\n * The wave node\n *\n * @type {HTMLCanvasElement}\n */\n this.wave = null;\n /**\n * The wave canvas rendering context\n *\n * @type {CanvasRenderingContext2D}\n */\n this.waveCtx = null;\n /**\n * The (optional) progress wave node\n *\n * @type {HTMLCanvasElement}\n */\n this.progress = null;\n /**\n * The (optional) progress wave canvas rendering context\n *\n * @type {CanvasRenderingContext2D}\n */\n this.progressCtx = null;\n /**\n * Start of the area the canvas should render, between 0 and 1\n *\n * @type {number}\n */\n this.start = 0;\n /**\n * End of the area the canvas should render, between 0 and 1\n *\n * @type {number}\n */\n this.end = 1;\n /**\n * Unique identifier for this entry\n *\n * @type {string}\n */\n this.id = getId(\n typeof this.constructor.name !== 'undefined'\n ? this.constructor.name.toLowerCase() + '_'\n : 'canvasentry_'\n );\n /**\n * Canvas 2d context attributes\n *\n * @type {object}\n */\n this.canvasContextAttributes = {};\n }\n\n /**\n * Store the wave canvas element and create the 2D rendering context\n *\n * @param {HTMLCanvasElement} element The wave `canvas` element.\n */\n initWave(element) {\n this.wave = element;\n this.waveCtx = this.wave.getContext('2d', this.canvasContextAttributes);\n }\n\n /**\n * Store the progress wave canvas element and create the 2D rendering\n * context\n *\n * @param {HTMLCanvasElement} element The progress wave `canvas` element.\n */\n initProgress(element) {\n this.progress = element;\n this.progressCtx = this.progress.getContext(\n '2d',\n this.canvasContextAttributes\n );\n }\n\n /**\n * Update the dimensions\n *\n * @param {number} elementWidth Width of the entry\n * @param {number} totalWidth Total width of the multi canvas renderer\n * @param {number} width The new width of the element\n * @param {number} height The new height of the element\n */\n updateDimensions(elementWidth, totalWidth, width, height) {\n // where the canvas starts and ends in the waveform, represented as a\n // decimal between 0 and 1\n this.start = this.wave.offsetLeft / totalWidth || 0;\n this.end = this.start + elementWidth / totalWidth;\n\n // set wave canvas dimensions\n this.wave.width = width;\n this.wave.height = height;\n let elementSize = { width: elementWidth + 'px' };\n style(this.wave, elementSize);\n\n if (this.hasProgressCanvas) {\n // set progress canvas dimensions\n this.progress.width = width;\n this.progress.height = height;\n style(this.progress, elementSize);\n }\n }\n\n /**\n * Clear the wave and progress rendering contexts\n */\n clearWave() {\n // wave\n this.waveCtx.clearRect(\n 0,\n 0,\n this.waveCtx.canvas.width,\n this.waveCtx.canvas.height\n );\n\n // progress\n if (this.hasProgressCanvas) {\n this.progressCtx.clearRect(\n 0,\n 0,\n this.progressCtx.canvas.width,\n this.progressCtx.canvas.height\n );\n }\n }\n\n /**\n * Set the fill styles for wave and progress\n *\n * @param {string} waveColor Fill color for the wave canvas\n * @param {?string} progressColor Fill color for the progress canvas\n */\n setFillStyles(waveColor, progressColor) {\n this.waveCtx.fillStyle = waveColor;\n\n if (this.hasProgressCanvas) {\n this.progressCtx.fillStyle = progressColor;\n }\n }\n\n /**\n * Set the canvas transforms for wave and progress\n *\n * @param {boolean} vertical Whether to render vertically\n */\n applyCanvasTransforms(vertical) {\n if (vertical) {\n // Reflect the waveform across the line y = -x\n this.waveCtx.setTransform(0, 1, 1, 0, 0, 0);\n\n if (this.hasProgressCanvas) {\n this.progressCtx.setTransform(0, 1, 1, 0, 0, 0);\n }\n }\n }\n\n /**\n * Draw a rectangle for wave and progress\n *\n * @param {number} x X start position\n * @param {number} y Y start position\n * @param {number} width Width of the rectangle\n * @param {number} height Height of the rectangle\n * @param {number} radius Radius of the rectangle\n */\n fillRects(x, y, width, height, radius) {\n this.fillRectToContext(this.waveCtx, x, y, width, height, radius);\n\n if (this.hasProgressCanvas) {\n this.fillRectToContext(\n this.progressCtx,\n x,\n y,\n width,\n height,\n radius\n );\n }\n }\n\n /**\n * Draw the actual rectangle on a `canvas` element\n *\n * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas\n * @param {number} x X start position\n * @param {number} y Y start position\n * @param {number} width Width of the rectangle\n * @param {number} height Height of the rectangle\n * @param {number} radius Radius of the rectangle\n */\n fillRectToContext(ctx, x, y, width, height, radius) {\n if (!ctx) {\n return;\n }\n\n if (radius) {\n this.drawRoundedRect(ctx, x, y, width, height, radius);\n } else {\n ctx.fillRect(x, y, width, height);\n }\n }\n\n /**\n * Draw a rounded rectangle on Canvas\n *\n * @param {CanvasRenderingContext2D} ctx Canvas context\n * @param {number} x X-position of the rectangle\n * @param {number} y Y-position of the rectangle\n * @param {number} width Width of the rectangle\n * @param {number} height Height of the rectangle\n * @param {number} radius Radius of the rectangle\n *\n * @return {void}\n * @example drawRoundedRect(ctx, 50, 50, 5, 10, 3)\n */\n drawRoundedRect(ctx, x, y, width, height, radius) {\n if (height === 0) {\n return;\n }\n // peaks are float values from -1 to 1. Use absolute height values in\n // order to correctly calculate rounded rectangle coordinates\n if (height < 0) {\n height *= -1;\n y -= height;\n }\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(\n x + width,\n y + height,\n x + width - radius,\n y + height\n );\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Render the actual wave and progress lines\n *\n * @param {number[]} peaks Array with peaks data\n * @param {number} absmax Maximum peak value (absolute)\n * @param {number} halfH Half the height of the waveform\n * @param {number} offsetY Offset to the top\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that\n * should be rendered\n */\n drawLines(peaks, absmax, halfH, offsetY, start, end) {\n this.drawLineToContext(\n this.waveCtx,\n peaks,\n absmax,\n halfH,\n offsetY,\n start,\n end\n );\n\n if (this.hasProgressCanvas) {\n this.drawLineToContext(\n this.progressCtx,\n peaks,\n absmax,\n halfH,\n offsetY,\n start,\n end\n );\n }\n }\n\n /**\n * Render the actual waveform line on a `canvas` element\n *\n * @param {CanvasRenderingContext2D} ctx Rendering context of target canvas\n * @param {number[]} peaks Array with peaks data\n * @param {number} absmax Maximum peak value (absolute)\n * @param {number} halfH Half the height of the waveform\n * @param {number} offsetY Offset to the top\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that\n * should be rendered\n */\n drawLineToContext(ctx, peaks, absmax, halfH, offsetY, start, end) {\n if (!ctx) {\n return;\n }\n\n const length = peaks.length / 2;\n const first = Math.round(length * this.start);\n\n // use one more peak value to make sure we join peaks at ends -- unless,\n // of course, this is the last canvas\n const last = Math.round(length * this.end) + 1;\n\n const canvasStart = first;\n const canvasEnd = last;\n const scale = this.wave.width / (canvasEnd - canvasStart - 1);\n\n // optimization\n const halfOffset = halfH + offsetY;\n const absmaxHalf = absmax / halfH;\n\n ctx.beginPath();\n ctx.moveTo((canvasStart - first) * scale, halfOffset);\n\n ctx.lineTo(\n (canvasStart - first) * scale,\n halfOffset - Math.round((peaks[2 * canvasStart] || 0) / absmaxHalf)\n );\n\n let i, peak, h;\n for (i = canvasStart; i < canvasEnd; i++) {\n peak = peaks[2 * i] || 0;\n h = Math.round(peak / absmaxHalf);\n ctx.lineTo((i - first) * scale + this.halfPixel, halfOffset - h);\n }\n\n // draw the bottom edge going backwards, to make a single\n // closed hull to fill\n let j = canvasEnd - 1;\n for (j; j >= canvasStart; j--) {\n peak = peaks[2 * j + 1] || 0;\n h = Math.round(peak / absmaxHalf);\n ctx.lineTo((j - first) * scale + this.halfPixel, halfOffset - h);\n }\n\n ctx.lineTo(\n (canvasStart - first) * scale,\n halfOffset -\n Math.round((peaks[2 * canvasStart + 1] || 0) / absmaxHalf)\n );\n\n ctx.closePath();\n ctx.fill();\n }\n\n /**\n * Destroys this entry\n */\n destroy() {\n this.waveCtx = null;\n this.wave = null;\n\n this.progressCtx = null;\n this.progress = null;\n }\n\n /**\n * Return image data of the wave `canvas` element\n *\n * When using a `type` of `'blob'`, this will return a `Promise` that\n * resolves with a `Blob` instance.\n *\n * @param {string} format='image/png' An optional value of a format type.\n * @param {number} quality=0.92 An optional value between 0 and 1.\n * @param {string} type='dataURL' Either 'dataURL' or 'blob'.\n * @return {string|Promise} When using the default `'dataURL'` `type` this\n * returns a data URL. When using the `'blob'` `type` this returns a\n * `Promise` that resolves with a `Blob` instance.\n */\n getImage(format, quality, type) {\n if (type === 'blob') {\n return new Promise(resolve => {\n this.wave.toBlob(resolve, format, quality);\n });\n } else if (type === 'dataURL') {\n return this.wave.toDataURL(format, quality);\n }\n }\n}\n","import * as util from './util';\n\n/**\n * Parent class for renderers\n *\n * @extends {Observer}\n */\nexport default class Drawer extends util.Observer {\n /**\n * @param {HTMLElement} container The container node of the wavesurfer instance\n * @param {WavesurferParams} params The wavesurfer initialisation options\n */\n constructor(container, params) {\n super();\n\n this.container = util.withOrientation(container, params.vertical);\n /**\n * @type {WavesurferParams}\n */\n this.params = params;\n /**\n * The width of the renderer\n * @type {number}\n */\n this.width = 0;\n /**\n * The height of the renderer\n * @type {number}\n */\n this.height = params.height * this.params.pixelRatio;\n\n this.lastPos = 0;\n /**\n * The `<wave>` element which is added to the container\n * @type {HTMLElement}\n */\n this.wrapper = null;\n }\n\n /**\n * Alias of `util.style`\n *\n * @param {HTMLElement} el The element that the styles will be applied to\n * @param {Object} styles The map of propName: attribute, both are used as-is\n * @return {HTMLElement} el\n */\n style(el, styles) {\n return util.style(el, styles);\n }\n\n /**\n * Create the wrapper `<wave>` element, style it and set up the events for\n * interaction\n */\n createWrapper() {\n this.wrapper = util.withOrientation(\n this.container.appendChild(document.createElement('wave')),\n this.params.vertical\n );\n\n this.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: this.params.height + 'px'\n });\n\n if (this.params.fillParent || this.params.scrollParent) {\n this.style(this.wrapper, {\n width: '100%',\n overflowX: this.params.hideScrollbar ? 'hidden' : 'auto',\n overflowY: 'hidden'\n });\n }\n\n this.setupWrapperEvents();\n }\n\n /**\n * Handle click event\n *\n * @param {Event} e Click event\n * @param {?boolean} noPrevent Set to true to not call `e.preventDefault()`\n * @return {number} Playback position from 0 to 1\n */\n handleEvent(e, noPrevent) {\n !noPrevent && e.preventDefault();\n\n const clientX = util.withOrientation(\n e.targetTouches ? e.targetTouches[0] : e,\n this.params.vertical\n ).clientX;\n const bbox = this.wrapper.getBoundingClientRect();\n\n const nominalWidth = this.width;\n const parentWidth = this.getWidth();\n const progressPixels = this.getProgressPixels(bbox, clientX);\n\n let progress;\n if (!this.params.fillParent && nominalWidth < parentWidth) {\n progress = progressPixels *\n (this.params.pixelRatio / nominalWidth) || 0;\n } else {\n progress = (progressPixels + this.wrapper.scrollLeft) /\n this.wrapper.scrollWidth || 0;\n }\n\n return util.clamp(progress, 0, 1);\n }\n\n getProgressPixels(wrapperBbox, clientX) {\n if (this.params.rtl) {\n return wrapperBbox.right - clientX;\n } else {\n return clientX - wrapperBbox.left;\n }\n }\n\n setupWrapperEvents() {\n this.wrapper.addEventListener('click', e => {\n const orientedEvent = util.withOrientation(e, this.params.vertical);\n const scrollbarHeight = this.wrapper.offsetHeight -\n this.wrapper.clientHeight;\n\n if (scrollbarHeight !== 0) {\n // scrollbar is visible. Check if click was on it\n const bbox = this.wrapper.getBoundingClientRect();\n if (orientedEvent.clientY >= bbox.bottom - scrollbarHeight) {\n // ignore mousedown as it was on the scrollbar\n return;\n }\n }\n\n if (this.params.interact) {\n this.fireEvent('click', e, this.handleEvent(e));\n }\n });\n\n this.wrapper.addEventListener('dblclick', e => {\n if (this.params.interact) {\n this.fireEvent('dblclick', e, this.handleEvent(e));\n }\n });\n\n this.wrapper.addEventListener('scroll', e =>\n this.fireEvent('scroll', e)\n );\n }\n\n /**\n * Draw peaks on the canvas\n *\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n * for split channel rendering\n * @param {number} length The width of the area that should be drawn\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that should be\n * rendered\n */\n drawPeaks(peaks, length, start, end) {\n if (!this.setWidth(length)) {\n this.clearWave();\n }\n\n this.params.barWidth\n ? this.drawBars(peaks, 0, start, end)\n : this.drawWave(peaks, 0, start, end);\n }\n\n /**\n * Scroll to the beginning\n */\n resetScroll() {\n if (this.wrapper !== null) {\n this.wrapper.scrollLeft = 0;\n }\n }\n\n /**\n * Recenter the view-port at a certain percent of the waveform\n *\n * @param {number} percent Value from 0 to 1 on the waveform\n */\n recenter(percent) {\n const position = this.wrapper.scrollWidth * percent;\n this.recenterOnPosition(position, true);\n }\n\n /**\n * Recenter the view-port on a position, either scroll there immediately or\n * in steps of 5 pixels\n *\n * @param {number} position X-offset in pixels\n * @param {boolean} immediate Set to true to immediately scroll somewhere\n */\n recenterOnPosition(position, immediate) {\n const scrollLeft = this.wrapper.scrollLeft;\n const half = ~~(this.wrapper.clientWidth / 2);\n const maxScroll = this.wrapper.scrollWidth - this.wrapper.clientWidth;\n let target = position - half;\n let offset = target - scrollLeft;\n\n if (maxScroll == 0) {\n // no need to continue if scrollbar is not there\n return;\n }\n\n // if the cursor is currently visible...\n if (!immediate && -half <= offset && offset < half) {\n // set rate at which waveform is centered\n let rate = this.params.autoCenterRate;\n\n // make rate depend on width of view and length of waveform\n rate /= half;\n rate *= maxScroll;\n\n offset = Math.max(-rate, Math.min(rate, offset));\n target = scrollLeft + offset;\n }\n\n // limit target to valid range (0 to maxScroll)\n target = Math.max(0, Math.min(maxScroll, target));\n // no use attempting to scroll if we're not moving\n if (target != scrollLeft) {\n this.wrapper.scrollLeft = target;\n }\n }\n\n /**\n * Get the current scroll position in pixels\n *\n * @return {number} Horizontal scroll position in pixels\n */\n getScrollX() {\n let x = 0;\n if (this.wrapper) {\n const pixelRatio = this.params.pixelRatio;\n x = Math.round(this.wrapper.scrollLeft * pixelRatio);\n\n // In cases of elastic scroll (safari with mouse wheel) you can\n // scroll beyond the limits of the container\n // Calculate and floor the scrollable extent to make sure an out\n // of bounds value is not returned\n // Ticket #1312\n if (this.params.scrollParent) {\n const maxScroll = ~~(\n this.wrapper.scrollWidth * pixelRatio -\n this.getWidth()\n );\n x = Math.min(maxScroll, Math.max(0, x));\n }\n }\n return x;\n }\n\n /**\n * Get the width of the container\n *\n * @return {number} The width of the container\n */\n getWidth() {\n return Math.round(this.container.clientWidth * this.params.pixelRatio);\n }\n\n /**\n * Set the width of the container\n *\n * @param {number} width The new width of the container\n * @return {boolean} Whether the width of the container was updated or not\n */\n setWidth(width) {\n if (this.width == width) {\n return false;\n }\n\n this.width = width;\n\n if (this.params.fillParent || this.params.scrollParent) {\n this.style(this.wrapper, {\n width: ''\n });\n } else {\n const newWidth = ~~(this.width / this.params.pixelRatio) + 'px';\n this.style(this.wrapper, {\n width: newWidth\n });\n }\n\n this.updateSize();\n return true;\n }\n\n /**\n * Set the height of the container\n *\n * @param {number} height The new height of the container.\n * @return {boolean} Whether the height of the container was updated or not\n */\n setHeight(height) {\n if (height == this.height) {\n return false;\n }\n this.height = height;\n\n this.style(this.wrapper, {\n height: ~~(this.height / this.params.pixelRatio) + 'px'\n });\n\n this.updateSize();\n return true;\n }\n\n /**\n * Called by wavesurfer when progress should be rendered\n *\n * @param {number} progress From 0 to 1\n */\n progress(progress) {\n const minPxDelta = 1 / this.params.pixelRatio;\n const pos = Math.round(progress * this.width) * minPxDelta;\n\n if (pos < this.lastPos || pos - this.lastPos >= minPxDelta) {\n this.lastPos = pos;\n\n if (this.params.scrollParent && this.params.autoCenter) {\n const newPos = ~~(this.wrapper.scrollWidth * progress);\n this.recenterOnPosition(\n newPos,\n this.params.autoCenterImmediately\n );\n }\n\n this.updateProgress(pos);\n }\n }\n\n /**\n * This is called when wavesurfer is destroyed\n */\n destroy() {\n this.unAll();\n if (this.wrapper) {\n if (this.wrapper.parentNode == this.container.domElement) {\n this.container.removeChild(this.wrapper.domElement);\n }\n this.wrapper = null;\n }\n }\n\n /* Renderer-specific methods */\n\n /**\n * Called after cursor related params have changed.\n *\n * @abstract\n */\n updateCursor() {}\n\n /**\n * Called when the size of the container changes so the renderer can adjust\n *\n * @abstract\n */\n updateSize() {}\n\n /**\n * Draw a waveform with bars\n *\n * @abstract\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for split channel\n * rendering\n * @param {number} channelIndex The index of the current channel. Normally\n * should be 0\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that should be\n * rendered\n */\n drawBars(peaks, channelIndex, start, end) {}\n\n /**\n * Draw a waveform\n *\n * @abstract\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for split channel\n * rendering\n * @param {number} channelIndex The index of the current channel. Normally\n * should be 0\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that should be\n * rendered\n */\n drawWave(peaks, channelIndex, start, end) {}\n\n /**\n * Clear the waveform\n *\n * @abstract\n */\n clearWave() {}\n\n /**\n * Render the new progress\n *\n * @abstract\n * @param {number} position X-Offset of progress position in pixels\n */\n updateProgress(position) {}\n}\n","import Drawer from './drawer';\nimport * as util from './util';\nimport CanvasEntry from './drawer.canvasentry';\n\n/**\n * MultiCanvas renderer for wavesurfer. Is currently the default and sole\n * builtin renderer.\n *\n * A `MultiCanvas` consists of one or more `CanvasEntry` instances, depending\n * on the zoom level.\n */\nexport default class MultiCanvas extends Drawer {\n /**\n * @param {HTMLElement} container The container node of the wavesurfer instance\n * @param {WavesurferParams} params The wavesurfer initialisation options\n */\n constructor(container, params) {\n super(container, params);\n\n /**\n * @type {number}\n */\n this.maxCanvasWidth = params.maxCanvasWidth;\n\n /**\n * @type {number}\n */\n this.maxCanvasElementWidth = Math.round(\n params.maxCanvasWidth / params.pixelRatio\n );\n\n /**\n * Whether or not the progress wave is rendered. If the `waveColor`\n * and `progressColor` are the same color it is not.\n *\n * @type {boolean}\n */\n this.hasProgressCanvas = params.waveColor != params.progressColor;\n\n /**\n * @type {number}\n */\n this.halfPixel = 0.5 / params.pixelRatio;\n\n /**\n * List of `CanvasEntry` instances.\n *\n * @type {Array}\n */\n this.canvases = [];\n\n /**\n * @type {HTMLElement}\n */\n this.progressWave = null;\n\n /**\n * Class used to generate entries.\n *\n * @type {function}\n */\n this.EntryClass = CanvasEntry;\n\n /**\n * Canvas 2d context attributes.\n *\n * @type {object}\n */\n this.canvasContextAttributes = params.drawingContextAttributes;\n\n /**\n * Overlap added between entries to prevent vertical white stripes\n * between `canvas` elements.\n *\n * @type {number}\n */\n this.overlap = 2 * Math.ceil(params.pixelRatio / 2);\n\n /**\n * The radius of the wave bars. Makes bars rounded\n *\n * @type {number}\n */\n this.barRadius = params.barRadius || 0;\n\n /**\n * Whether to render the waveform vertically. Defaults to false.\n *\n * @type {boolean}\n */\n this.vertical = params.vertical;\n }\n\n /**\n * Initialize the drawer\n */\n init() {\n this.createWrapper();\n this.createElements();\n }\n\n /**\n * Create the canvas elements and style them\n *\n */\n createElements() {\n this.progressWave = util.withOrientation(\n this.wrapper.appendChild(document.createElement('wave')),\n this.params.vertical\n );\n this.style(this.progressWave, {\n position: 'absolute',\n zIndex: 3,\n left: 0,\n top: 0,\n bottom: 0,\n overflow: 'hidden',\n width: '0',\n display: 'none',\n boxSizing: 'border-box',\n borderRightStyle: 'solid',\n pointerEvents: 'none'\n });\n\n this.addCanvas();\n this.updateCursor();\n }\n\n /**\n * Update cursor style\n */\n updateCursor() {\n this.style(this.progressWave, {\n borderRightWidth: this.params.cursorWidth + 'px',\n borderRightColor: this.params.cursorColor\n });\n }\n\n /**\n * Adjust to the updated size by adding or removing canvases\n */\n updateSize() {\n const totalWidth = Math.round(this.width / this.params.pixelRatio);\n const requiredCanvases = Math.ceil(\n totalWidth / (this.maxCanvasElementWidth + this.overlap)\n );\n\n // add required canvases\n while (this.canvases.length < requiredCanvases) {\n this.addCanvas();\n }\n\n // remove older existing canvases, if any\n while (this.canvases.length > requiredCanvases) {\n this.removeCanvas();\n }\n\n let canvasWidth = this.maxCanvasWidth + this.overlap;\n const lastCanvas = this.canvases.length - 1;\n this.canvases.forEach((entry, i) => {\n if (i == lastCanvas) {\n canvasWidth = this.width - this.maxCanvasWidth * lastCanvas;\n }\n this.updateDimensions(entry, canvasWidth, this.height);\n\n entry.clearWave();\n });\n }\n\n /**\n * Add a canvas to the canvas list\n *\n */\n addCanvas() {\n const entry = new this.EntryClass();\n entry.canvasContextAttributes = this.canvasContextAttributes;\n entry.hasProgressCanvas = this.hasProgressCanvas;\n entry.halfPixel = this.halfPixel;\n const leftOffset = this.maxCanvasElementWidth * this.canvases.length;\n\n // wave\n let wave = util.withOrientation(\n this.wrapper.appendChild(document.createElement('canvas')),\n this.params.vertical\n );\n this.style(wave, {\n position: 'absolute',\n zIndex: 2,\n left: leftOffset + 'px',\n top: 0,\n bottom: 0,\n height: '100%',\n pointerEvents: 'none'\n });\n entry.initWave(wave);\n\n // progress\n if (this.hasProgressCanvas) {\n let progress = util.withOrientation(\n this.progressWave.appendChild(document.createElement('canvas')),\n this.params.vertical\n );\n this.style(progress, {\n position: 'absolute',\n left: leftOffset + 'px',\n top: 0,\n bottom: 0,\n height: '100%'\n });\n entry.initProgress(progress);\n }\n\n this.canvases.push(entry);\n }\n\n /**\n * Pop single canvas from the list\n *\n */\n removeCanvas() {\n let lastEntry = this.canvases[this.canvases.length - 1];\n\n // wave\n lastEntry.wave.parentElement.removeChild(lastEntry.wave.domElement);\n\n // progress\n if (this.hasProgressCanvas) {\n lastEntry.progress.parentElement.removeChild(lastEntry.progress.domElement);\n }\n\n // cleanup\n if (lastEntry) {\n lastEntry.destroy();\n lastEntry = null;\n }\n\n this.canvases.pop();\n }\n\n /**\n * Update the dimensions of a canvas element\n *\n * @param {CanvasEntry} entry Target entry\n * @param {number} width The new width of the element\n * @param {number} height The new height of the element\n */\n updateDimensions(entry, width, height) {\n const elementWidth = Math.round(width / this.params.pixelRatio);\n const totalWidth = Math.round(this.width / this.params.pixelRatio);\n\n // update canvas dimensions\n entry.updateDimensions(elementWidth, totalWidth, width, height);\n\n // style element\n this.style(this.progressWave, { display: 'block' });\n }\n\n /**\n * Clear the whole multi-canvas\n */\n clearWave() {\n util.frame(() => {\n this.canvases.forEach(entry => entry.clearWave());\n })();\n }\n\n /**\n * Draw a waveform with bars\n *\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n * for split channel rendering\n * @param {number} channelIndex The index of the current channel. Normally\n * should be 0. Must be an integer.\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that should be\n * rendered\n * @returns {void}\n */\n drawBars(peaks, channelIndex, start, end) {\n return this.prepareDraw(\n peaks,\n channelIndex,\n start,\n end,\n ({ absmax, hasMinVals, height, offsetY, halfH, peaks, channelIndex: ch }) => {\n // if drawBars was called within ws.empty we don't pass a start and\n // don't want anything to happen\n if (start === undefined) {\n return;\n }\n // Skip every other value if there are negatives.\n const peakIndexScale = hasMinVals ? 2 : 1;\n const length = peaks.length / peakIndexScale;\n const bar = this.params.barWidth * this.params.pixelRatio;\n const gap =\n this.params.barGap === null\n ? Math.max(this.params.pixelRatio, ~~(bar / 2))\n : Math.max(\n this.params.pixelRatio,\n this.params.barGap * this.params.pixelRatio\n );\n const step = bar + gap;\n\n const scale = length / this.width;\n const first = start;\n const last = end;\n let i = first;\n\n for (i; i < last; i += step) {\n const peak =\n peaks[Math.floor(i * scale * peakIndexScale)] || 0;\n let h = Math.round((peak / absmax) * halfH);\n\n /* in case of silences, allow the user to specify that we\n * always draw *something* (normally a 1px high bar) */\n if (h == 0 && this.params.barMinHeight) {\n h = this.params.barMinHeight;\n }\n\n this.fillRect(\n i + this.halfPixel,\n halfH - h + offsetY,\n bar + this.halfPixel,\n h * 2,\n this.barRadius,\n ch\n );\n }\n }\n );\n }\n\n /**\n * Draw a waveform\n *\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays\n * for split channel rendering\n * @param {number} channelIndex The index of the current channel. Normally\n * should be 0\n * @param {number?} start The x-offset of the beginning of the area that\n * should be rendered (If this isn't set only a flat line is rendered)\n * @param {number?} end The x-offset of the end of the area that should be\n * rendered\n * @returns {void}\n */\n drawWave(peaks, channelIndex, start, end) {\n return this.prepareDraw(\n peaks,\n channelIndex,\n start,\n end,\n ({ absmax, hasMinVals, height, offsetY, halfH, peaks, channelIndex }) => {\n if (!hasMinVals) {\n const reflectedPeaks = [];\n const len = peaks.length;\n let i = 0;\n for (i; i < len; i++) {\n reflectedPeaks[2 * i] = peaks[i];\n reflectedPeaks[2 * i + 1] = -peaks[i];\n }\n peaks = reflectedPeaks;\n }\n\n // if drawWave was called within ws.empty we don't pass a start and\n // end and simply want a flat line\n if (start !== undefined) {\n this.drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex);\n }\n\n // always draw a median line\n this.fillRect(\n 0,\n halfH + offsetY - this.halfPixel,\n this.width,\n this.halfPixel,\n this.barRadius,\n channelIndex\n );\n }\n );\n }\n\n /**\n * Tell the canvas entries to render their portion of the waveform\n *\n * @param {number[]} peaks Peaks data\n * @param {number} absmax Maximum peak value (absolute)\n * @param {number} halfH Half the height of the waveform\n * @param {number} offsetY Offset to the top\n * @param {number} start The x-offset of the beginning of the area that\n * should be rendered\n * @param {number} end The x-offset of the end of the area that\n * should be rendered\n * @param {channelIndex} channelIndex The channel index of the line drawn\n */\n drawLine(peaks, absmax, halfH, offsetY, start, end, channelIndex) {\n const { waveColor, progressColor } = this.params.splitChannelsOptions.channelColors[channelIndex] || {};\n this.canvases.forEach((entry, i) => {\n this.setFillStyles(entry, waveColor, progressColor);\n this.applyCanvasTransforms(entry, this.params.vertical);\n entry.drawLines(peaks, absmax, halfH, offsetY, start, end);\n });\n }\n\n /**\n * Draw a rectangle on the multi-canvas\n *\n * @param {number} x X-position of the rectangle\n * @param {number} y Y-position of the rectangle\n * @param {number} width Width of the rectangle\n * @param {number} height Height of the rectangle\n * @param {number} radius Radius of the rectangle\n * @param {channelIndex} channelIndex The channel index of the bar drawn\n */\n fillRect(x, y, width, height, radius, channelIndex) {\n const startCanvas = Math.floor(x / this.maxCanvasWidth);\n const endCanvas = Math.min(\n Math.ceil((x + width) / this.maxCanvasWidth) + 1,\n this.canvases.length\n );\n let i = startCanvas;\n for (i; i < endCanvas; i++) {\n const entry = this.canvases[i];\n const leftOffset = i * this.maxCanvasWidth;\n\n const intersection = {\n x1: Math.max(x, i * this.maxCanvasWidth),\n y1: y,\n x2: Math.min(\n x + width,\n i * this.maxCanvasWidth + entry.wave.width\n ),\n y2: y + height\n };\n\n if (intersection.x1 < intersection.x2) {\n const { waveColor, progressColor } = this.params.splitChannelsOptions.channelColors[channelIndex] || {};\n this.setFillStyles(entry, waveColor, progressColor);\n this.applyCanvasTransforms(entry, this.params.vertical);\n\n entry.fillRects(\n intersection.x1 - leftOffset,\n intersection.y1,\n intersection.x2 - intersection.x1,\n intersection.y2 - intersection.y1,\n radius\n );\n }\n }\n }\n\n /**\n * Returns whether to hide the channel from being drawn based on params.\n *\n * @param {number} channelIndex The index of the current channel.\n * @returns {bool} True to hide the channel, false to draw.\n */\n hideChannel(channelIndex) {\n return this.params.splitChannels && this.params.splitChannelsOptions.filterChannels.includes(channelIndex);\n }\n\n /**\n * Performs preparation tasks and calculations which are shared by `drawBars`\n * and `drawWave`\n *\n * @param {number[]|Number.<Array[]>} peaks Can also be an array of arrays for\n * split channel rendering\n * @param {number} channelIndex The index of the current channel. Normally\n * should be 0\n * @param {number?} start The x-offset of the beginning of the area that\n * should be rendered. If this isn't set only a flat line is rendered\n * @param {number?} end The x-offset of the end of the area that should be\n * rendered\n * @param {function} fn The render function to call, e.g. `drawWave`\n * @param {number} drawIndex The index of the current channel after filtering.\n * @param {number?} normalizedMax Maximum modulation value across channels for use with relativeNormalization. Ignored when undefined\n * @returns {void}\n */\n prepareDraw(peaks, channelIndex, start, end, fn, drawIndex, normalizedMax) {\n return util.frame(() => {\n // Split channels and call this function with the channelIndex set\n if (peaks[0] instanceof Array) {\n const channels = peaks;\n\n if (this.params.splitChannels) {\n const filteredChannels = channels.filter((c, i) => !this.hideChannel(i));\n if (!this.params.splitChannelsOptions.overlay) {\n this.setHeight(\n Math.max(filteredChannels.length, 1) *\n this.params.height *\n this.params.pixelRatio\n );\n }\n\n let overallAbsMax;\n if (this.params.splitChannelsOptions && this.params.splitChannelsOptions.relativeNormalization) {\n // calculate maximum peak across channels to use for normalization\n overallAbsMax = util.max(channels.map((channelPeaks => util.absMax(channelPeaks))));\n }\n\n\n return channels.forEach((channelPeaks, i) =>\n this.prepareDraw(channelPeaks, i, start, end, fn, filteredChannels.indexOf(channelPeaks), overallAbsMax)\n );\n }\n peaks = channels[0];\n }\n\n // Return and do not draw channel peaks if hidden.\n if (this.hideChannel(channelIndex)) {\n return;\n }\n\n // calculate maximum modulation value, either from the barHeight\n // parameter or if normalize=true from the largest value in the peak\n // set\n let absmax = 1 / this.params.barHeight;\n if (this.params.normalize) {\n absmax = normalizedMax === undefined ? util.absMax(peaks) : normalizedMax;\n }\n\n // Bar wave draws the bottom only as a reflection of the top,\n // so we don't need negative values\n const hasMinVals = [].some.call(peaks, val => val < 0);\n const height = this.params.height * this.params.pixelRatio;\n const halfH = height / 2;\n\n let offsetY = height * drawIndex || 0;\n\n // Override offsetY if overlay is true\n if (this.params.splitChannelsOptions && this.params.splitChannelsOptions.overlay) {\n offsetY = 0;\n }\n\n return fn({\n absmax: absmax,\n hasMinVals: hasMinVals,\n height: height,\n offsetY: offsetY,\n halfH: halfH,\n peaks: peaks,\n channelIndex: channelIndex\n });\n })();\n }\n\n /**\n * Set the fill styles for a certain entry (wave and progress)\n *\n * @param {CanvasEntry} entry Target entry\n * @param {string} waveColor Wave color to draw this entry\n * @param {string} progressColor Progress color to draw this entry\n */\n setFillStyles(entry, waveColor = this.params.waveColor, progressColor = this.params.progressColor) {\n entry.setFillStyles(waveColor, progressColor);\n }\n\n /**\n * Set the canvas transforms for a certain entry (wave and progress)\n *\n * @param {CanvasEntry} entry Target entry\n * @param {boolean} vertical Whether to render the waveform vertically\n */\n applyCanvasTransforms(entry, vertical = false) {\n entry.applyCanvasTransforms(vertical);\n }\n\n /**\n * Return image data of the multi-canvas\n *\n * When using a `type` of `'blob'`, this will return a `Promise`.\n *\n * @param {string} format='image/png' An optional value of a format type.\n * @param {number} quality=0.92 An optional value between 0 and 1.\n * @param {string} type='dataURL' Either 'dataURL' or 'blob'.\n * @return {string|string[]|Promise} When using the default `'dataURL'`\n * `type` this returns a single data URL or an array of data URLs,\n * one for each canvas. When using the `'blob'` `type` this returns a\n * `Promise` that resolves with an array of `Blob` instances, one for each\n * canvas.\n */\n getImage(format, quality, type) {\n if (type === 'blob') {\n return Promise.all(\n this.canvases.map(entry => {\n return entry.getImage(format, quality, type);\n })\n );\n } else if (type === 'dataURL') {\n let images = this.canvases.map(entry =>\n entry.getImage(format, quality, type)\n );\n return images.length > 1 ? images : images[0];\n }\n }\n\n /**\n * Render the new progress\n *\n * @param {number} position X-offset of progress position in pixels\n */\n updateProgress(position) {\n this.style(this.progressWave, { width: position + 'px' });\n }\n}\n","import MediaElement from './mediaelement';\n\n/**\n * MediaElementWebAudio backend: load audio via an HTML5 audio tag, but playback with the WebAudio API.\n * The advantage here is that the html5 <audio> tag can perform range requests on the server and not\n * buffer the entire file in one request, and you still get the filtering and scripting functionality\n * of the webaudio API.\n * Note that in order to use range requests and prevent buffering, you must provide peak data.\n *\n * @since 3.2.0\n */\nexport default class MediaElementWebAudio extends MediaElement {\n /**\n * Construct the backend\n *\n * @param {WavesurferParams} params Wavesurfer parameters\n */\n constructor(params) {\n super(params);\n /** @private */\n this.params = params;\n /** @private */\n this.sourceMediaElement = null;\n }\n\n /**\n * Initialise the backend, called in `wavesurfer.createBackend()`\n */\n init() {\n this.setPlaybackRate(this.params.audioRate);\n this.createTimer();\n this.createVolumeNode();\n this.createScriptNode();\n this.createAnalyserNode();\n }\n /**\n * Private method called by both `load` (from url)\n * and `loadElt` (existing media element) methods.\n *\n * @param {HTMLMediaElement} media HTML5 Audio or Video element\n * @param {number[]|Number.<Array[]>} peaks Array of peak data\n * @param {string} preload HTML 5 preload attribute value\n * @private\n */\n _load(media, peaks, preload) {\n super._load(media, peaks, preload);\n this.createMediaElementSource(media);\n }\n\n /**\n * Create MediaElementSource node\n *\n * @since 3.2.0\n * @param {HTMLMediaElement} mediaElement HTML5 Audio to load\n */\n createMediaElementSource(mediaElement) {\n this.sourceMediaElement = this.ac.createMediaElementSource(\n mediaElement\n );\n this.sourceMediaElement.connect(this.analyser);\n }\n\n play(start, end) {\n this.resumeAudioContext();\n return super.play(start, end);\n }\n\n /**\n * This is called when wavesurfer is destroyed\n *\n */\n destroy() {\n super.destroy();\n\n this.destroyWebAudio();\n }\n}\n","import WebAudio from './webaudio';\nimport * as util from './util';\n\n/**\n * MediaElement backend\n */\nexport default class MediaElement extends WebAudio {\n /**\n * Construct the backend\n *\n * @param {WavesurferParams} params Wavesurfer parameters\n */\n constructor(params) {\n super(params);\n /** @private */\n this.params = params;\n\n /**\n * Initially a dummy media element to catch errors. Once `_load` is\n * called, this will contain the actual `HTMLMediaElement`.\n * @private\n */\n this.media = {\n currentTime: 0,\n duration: 0,\n paused: true,\n playbackRate: 1,\n play() {},\n pause() {},\n volume: 0\n };\n\n /** @private */\n this.mediaType = params.mediaType.toLowerCase();\n /** @private */\n this.elementPosition = params.elementPosition;\n /** @private */\n this.peaks = null;\n /** @private */\n this.playbackRate = 1;\n /** @private */\n this.volume = 1;\n /** @private */\n this.isMuted = false;\n /** @private */\n this.buffer = null;\n /** @private */\n this.onPlayEnd = null;\n /** @private */\n this.mediaListeners = {};\n }\n\n /**\n * Initialise the backend, called in `wavesurfer.createBackend()`\n */\n init() {\n this.setPlaybackRate(this.params.audioRate);\n this.createTimer();\n }\n\n /**\n * Attach event listeners to media element.\n */\n _setupMediaListeners() {\n this.mediaListeners.error = () => {\n this.fireEvent('error', 'Error loading media element');\n };\n this.mediaListeners.canplay = () => {\n this.fireEvent('canplay');\n };\n this.mediaListeners.ended = () => {\n this.fireEvent('finish');\n };\n // listen to and relay play, pause and seeked events to enable\n // playback control from the external media element\n this.mediaListeners.play = () => {\n this.fireEvent('play');\n };\n this.mediaListeners.pause = () => {\n this.fireEvent('pause');\n };\n this.mediaListeners.seeked = event => {\n this.fireEvent('seek');\n };\n this.mediaListeners.volumechange = event => {\n this.isMuted = this.media.muted;\n if (this.isMuted) {\n this.volume = 0;\n } else {\n this.volume = this.media.volume;\n }\n this.fireEvent('volume');\n };\n\n // reset event listeners\n Object.keys(this.mediaListeners).forEach(id => {\n this.media.removeEventListener(id, this.mediaListeners[id]);\n this.media.addEventListener(id, this.mediaListeners[id]);\n });\n }\n\n /**\n * Create a timer to provide a more precise `audioprocess` event.\n */\n createTimer() {\n const onAudioProcess = () => {\n if (this.isPaused()) {\n return;\n }\n this.fireEvent('audioprocess', this.getCurrentTime());\n\n // Call again in the next frame\n util.frame(onAudioProcess)();\n };\n\n this.on('play', onAudioProcess);\n\n // Update the progress one more time to prevent it from being stuck in\n // case of lower framerates\n this.on('pause', () => {\n this.fireEvent('audioprocess', this.getCurrentTime());\n });\n }\n\n /**\n * Create media element with url as its source,\n * and append to container element.\n *\n * @param {string} url Path to media file\n * @param {HTMLElement} container HTML element\n * @param {number[]|Number.<Array[]>} peaks Array of peak data\n * @param {string} preload HTML 5 preload attribute value\n * @throws Will throw an error if the `url` argument is not a valid media\n * element.\n */\n load(url, container, peaks, preload) {\n const media = document.createElement(this.mediaType);\n media.controls = this.params.mediaControls;\n media.autoplay = this.params.autoplay || false;\n media.preload = preload == null ? 'auto' : preload;\n media.src = url;\n media.style.width = '100%';\n\n const prevMedia = container.querySelector(this.mediaType);\n if (prevMedia) {\n container.removeChild(prevMedia);\n }\n container.appendChild(media);\n\n this._load(media, peaks, preload);\n }\n\n /**\n * Load existing media element.\n *\n * @param {HTMLMediaElement} elt HTML5 Audio or Video element\n * @param {number[]|Number.<Array[]>} peaks Array of peak data\n */\n loadElt(elt, peaks) {\n elt.controls = this.params.mediaControls;\n elt.autoplay = this.params.autoplay || false;\n\n this._load(elt, peaks, elt.preload);\n }\n\n /**\n * Method called by both `load` (from url)\n * and `loadElt` (existing media element) methods.\n *\n * @param {HTMLMediaElement} media HTML5 Audio or Video element\n * @param {number[]|Number.<Array[]>} peaks Array of peak data\n * @param {string} preload HTML 5 preload attribute value\n * @throws Will throw an error if the `media` argument is not a valid media\n * element.\n * @private\n */\n _load(media, peaks, preload) {\n // verify media element is valid\n if (\n !(media instanceof HTMLMediaElement) ||\n typeof media.addEventListener === 'undefined'\n ) {\n throw new Error('media parameter is not a valid media element');\n }\n\n // load must be called manually on iOS, otherwise peaks won't draw\n // until a user interaction triggers load --> 'ready' event\n //\n // note that we avoid calling media.load here when given peaks and preload == 'none'\n // as this almost always triggers some browser fetch of the media.\n if (typeof media.load == 'function' && !(peaks && preload == 'none')) {\n // Resets the media element and restarts the media resource. Any\n // pending events are discarded. How much media data is fetched is\n // still affected by the preload attribute.\n media.load();\n }\n\n this.media = media;\n this._setupMediaListeners();\n this.peaks = peaks;\n this.onPlayEnd = null;\n this.buffer = null;\n this.isMuted = media.muted;\n this.setPlaybackRate(this.playbackRate);\n this.setVolume(this.volume);\n }\n\n /**\n * Used by `wavesurfer.isPlaying()` and `wavesurfer.playPause()`\n *\n * @return {boolean} Media paused or not\n */\n isPaused() {\n return !this.media || this.media.paused;\n }\n\n /**\n * Used by `wavesurfer.getDuration()`\n *\n * @return {number} Duration\n */\n getDuration() {\n if (this.explicitDuration) {\n return this.explicitDuration;\n }\n let duration = (this.buffer || this.media).duration;\n if (duration >= Infinity) {\n // streaming audio\n duration = this.media.seekable.end(0);\n }\n return duration;\n }\n\n /**\n * Returns the current time in seconds relative to the audio-clip's\n * duration.\n *\n * @return {number} Current time\n */\n getCurrentTime() {\n return this.media && this.media.currentTime;\n }\n\n /**\n * Get the position from 0 to 1\n *\n * @return {number} Current position\n */\n getPlayedPercents() {\n return this.getCurrentTime() / this.getDuration() || 0;\n }\n\n /**\n * Get the audio source playback rate.\n *\n * @return {number} Playback rate\n */\n getPlaybackRate() {\n return this.playbackRate || this.media.playbackRate;\n }\n\n /**\n * Set the audio source playback rate.\n *\n * @param {number} value Playback rate\n */\n setPlaybackRate(value) {\n this.playbackRate = value || 1;\n this.media.playbackRate = this.playbackRate;\n }\n\n /**\n * Used by `wavesurfer.seekTo()`\n *\n * @param {number} start Position to start at in seconds\n */\n seekTo(start) {\n if (start != null) {\n this.media.currentTime = start;\n }\n this.clearPlayEnd();\n }\n\n /**\n * Plays the loaded audio region.\n *\n * @param {number} start Start offset in seconds, relative to the beginning\n * of a clip.\n * @param {number} end When to stop, relative to the beginning of a clip.\n * @emits MediaElement#play\n * @return {Promise} Result\n */\n play(start, end) {\n this.seekTo(start);\n const promise = this.media.play();\n end && this.setPlayEnd(end);\n\n return promise;\n }\n\n /**\n * Pauses the loaded audio.\n *\n * @emits MediaElement#pause\n * @return {Promise} Result\n */\n pause() {\n let promise;\n\n if (this.media) {\n promise = this.media.pause();\n }\n this.clearPlayEnd();\n\n return promise;\n }\n\n /**\n * Set the play end\n *\n * @param {number} end Where to end\n */\n setPlayEnd(end) {\n this.clearPlayEnd();\n\n this._onPlayEnd = time => {\n if (time >= end) {\n this.pause();\n this.seekTo(end);\n }\n };\n this.on('audioprocess', this._onPlayEnd);\n }\n\n /** @private */\n clearPlayEnd() {\n if (this._onPlayEnd) {\n this.un('audioprocess', this._onPlayEnd);\n this._onPlayEnd = null;\n }\n }\n\n /**\n * Compute the max and min value of the waveform when broken into\n * <length> subranges.\n *\n * @param {number} length How many subranges to break the waveform into.\n * @param {number} first First sample in the required range.\n * @param {number} last Last sample in the required range.\n * @return {number[]|Number.<Array[]>} Array of 2*<length> peaks or array of\n * arrays of peaks consisting of (max, min) values for each subrange.\n */\n getPeaks(length, first, last) {\n if (this.buffer) {\n return super.getPeaks(length, first, last);\n }\n return this.peaks || [];\n }\n\n /**\n * Set the sink id for the media player\n *\n * @param {string} deviceId String value representing audio device id.\n * @returns {Promise} A Promise that resolves to `undefined` when there\n * are no errors.\n */\n setSinkId(deviceId) {\n if (deviceId) {\n if (!this.media.setSinkId) {\n return Promise.reject(\n new Error('setSinkId is not supported in your browser')\n );\n }\n return this.media.setSinkId(deviceId);\n }\n\n return Promise.reject(new Error('Invalid deviceId: ' + deviceId));\n }\n\n /**\n * Get the current volume\n *\n * @return {number} value A floating point value between 0 and 1.\n */\n getVolume() {\n return this.volume;\n }\n\n /**\n * Set the audio volume\n *\n * @param {number} value A floating point value between 0 and 1.\n */\n setVolume(value) {\n this.volume = value;\n // no need to change when it's already at that volume\n if (this.media.volume !== this.volume) {\n this.media.volume = this.volume;\n }\n }\n\n /**\n * Enable or disable muted audio\n *\n * @since 4.0.0\n * @param {boolean} muted Specify `true` to mute audio.\n */\n setMute(muted) {\n // This causes a volume change to be emitted too through the\n // volumechange event listener.\n this.isMuted = this.media.muted = muted;\n }\n\n /**\n * This is called when wavesurfer is destroyed\n *\n */\n destroy() {\n this.pause();\n this.unAll();\n this.destroyed = true;\n\n // cleanup media event listeners\n Object.keys(this.mediaListeners).forEach(id => {\n if (this.media) {\n this.media.removeEventListener(id, this.mediaListeners[id]);\n }\n });\n\n if (\n this.params.removeMediaElementOnDestroy &&\n this.media &&\n this.media.parentNode\n ) {\n this.media.parentNode.removeChild(this.media);\n }\n\n this.media = null;\n }\n}\n","/**\n * Caches the decoded peaks data to improve rendering speed for large audio\n *\n * Is used if the option parameter `partialRender` is set to `true`\n */\nexport default class PeakCache {\n /**\n * Instantiate cache\n */\n constructor() {\n this.clearPeakCache();\n }\n\n /**\n * Empty the cache\n */\n clearPeakCache() {\n /**\n * Flat array with entries that are always in pairs to mark the\n * beginning and end of each subrange. This is a convenience so we can\n * iterate over the pairs for easy set difference operations.\n * @private\n */\n this.peakCacheRanges = [];\n /**\n * Length of the entire cachable region, used for resetting the cache\n * when this changes (zoom events, for instance).\n * @private\n */\n this.peakCacheLength = -1;\n }\n\n /**\n * Add a range of peaks to the cache\n *\n * @param {number} length The length of the range\n * @param {number} start The x offset of the start of the range\n * @param {number} end The x offset of the end of the range\n * @return {Number.<Array[]>} Array with arrays of numbers\n */\n addRangeToPeakCache(length, start, end) {\n if (length != this.peakCacheLength) {\n this.clearPeakCache();\n this.peakCacheLength = length;\n }\n\n // Return ranges that weren't in the cache before the call.\n let uncachedRanges = [];\n let i = 0;\n // Skip ranges before the current start.\n while (\n i < this.peakCacheRanges.length &&\n this.peakCacheRanges[i] < start\n ) {\n i++;\n }\n // If |i| is even, |start| falls after an existing range. Otherwise,\n // |start| falls between an existing range, and the uncached region\n // starts when we encounter the next node in |peakCacheRanges| or\n // |end|, whichever comes first.\n if (i % 2 == 0) {\n uncachedRanges.push(start);\n }\n while (\n i < this.peakCacheRanges.length &&\n this.peakCacheRanges[i] <= end\n ) {\n uncachedRanges.push(this.peakCacheRanges[i]);\n i++;\n }\n // If |i| is even, |end| is after all existing ranges.\n if (i % 2 == 0) {\n uncachedRanges.push(end);\n }\n\n // Filter out the 0-length ranges.\n uncachedRanges = uncachedRanges.filter((item, pos, arr) => {\n if (pos == 0) {\n return item != arr[pos + 1];\n } else if (pos == arr.length - 1) {\n return item != arr[pos - 1];\n }\n return item != arr[pos - 1] && item != arr[pos + 1];\n });\n\n // Merge the two ranges together, uncachedRanges will either contain\n // wholly new points, or duplicates of points in peakCacheRanges. If\n // duplicates are detected, remove both and extend the range.\n this.peakCacheRanges = this.peakCacheRanges.concat(uncachedRanges);\n this.peakCacheRanges = this.peakCacheRanges\n .sort((a, b) => a - b)\n .filter((item, pos, arr) => {\n if (pos == 0) {\n return item != arr[pos + 1];\n } else if (pos == arr.length - 1) {\n return item != arr[pos - 1];\n }\n return item != arr[pos - 1] && item != arr[pos + 1];\n });\n\n // Push the uncached ranges into an array of arrays for ease of\n // iteration in the functions that call this.\n const uncachedRangePairs = [];\n for (i = 0; i < uncachedRanges.length; i += 2) {\n uncachedRangePairs.push([uncachedRanges[i], uncachedRanges[i + 1]]);\n }\n\n return uncachedRangePairs;\n }\n\n /**\n * For testing\n *\n * @return {Number.<Array[]>} Array with arrays of numbers\n */\n getCacheRanges() {\n const peakCacheRangePairs = [];\n let i;\n for (i = 0; i < this.peakCacheRanges.length; i += 2) {\n peakCacheRangePairs.push([\n this.peakCacheRanges[i],\n this.peakCacheRanges[i + 1]\n ]);\n }\n return peakCacheRangePairs;\n }\n}\n","import utilMax from './max';\r\nimport utilmin from './min';\r\n\r\n/**\r\n * Get the largest absolute value in an array\r\n *\r\n * @param {Array} values Array of numbers\r\n * @returns {Number} Largest number found\r\n * @example console.log(max([-3, 2, 1]), max([-3, 2, 4])); // logs 3 4\r\n * @since 4.3.0\r\n */\r\nexport default function absMax(values) {\r\n const max = utilMax(values);\r\n const min = utilmin(values);\r\n return -min > max ? -min : max;\r\n}\r\n","/**\n * Returns a number limited to the given range.\n *\n * @param {number} val The number to be limited to a range\n * @param {number} min The lower boundary of the limit range\n * @param {number} max The upper boundary of the limit range\n * @returns {number} A number in the range [min, max]\n */\nexport default function clamp(val, min, max) {\n return Math.min(Math.max(min, val), max);\n}\n","/**\n * @since 3.0.0\n */\n\nimport Observer from './observer';\n\nclass ProgressHandler {\n /**\n * Instantiate ProgressHandler\n *\n * @param {Observer} instance The `fetchFile` observer instance.\n * @param {Number} contentLength Content length.\n * @param {Response} response Response object.\n */\n constructor(instance, contentLength, response) {\n this.instance = instance;\n this.instance._reader = response.body.getReader();\n\n this.total = parseInt(contentLength, 10);\n this.loaded = 0;\n }\n\n /**\n * A method that is called once, immediately after the `ReadableStream``\n * is constructed.\n *\n * @param {ReadableStreamDefaultController} controller Controller instance\n * used to control the stream.\n */\n start(controller) {\n const read = () => {\n // instance._reader.read() returns a promise that resolves\n // when a value has been received\n this.instance._reader\n .read()\n .then(({ done, value }) => {\n // result objects contain two properties:\n // done - true if the stream has already given you all its data.\n // value - some data. Always undefined when done is true.\n if (done) {\n // ensure onProgress called when content-length=0\n if (this.total === 0) {\n this.instance.onProgress.call(this.instance, {\n loaded: this.loaded,\n total: this.total,\n lengthComputable: false\n });\n }\n // no more data needs to be consumed, close the stream\n controller.close();\n return;\n }\n\n this.loaded += value.byteLength;\n this.instance.onProgress.call(this.instance, {\n loaded: this.loaded,\n total: this.total,\n lengthComputable: !(this.total === 0)\n });\n // enqueue the next data chunk into our target stream\n controller.enqueue(value);\n read();\n })\n .catch(error => {\n controller.error(error);\n });\n };\n\n read();\n }\n}\n\n/**\n * Load a file using `fetch`.\n *\n * @param {object} options Request options to use. See example below.\n * @returns {Observer} Observer instance\n * @example\n * // default options\n * let options = {\n * url: undefined,\n * method: 'GET',\n * mode: 'cors',\n * credentials: 'same-origin',\n * cache: 'default',\n * responseType: 'json',\n * requestHeaders: [],\n * redirect: 'follow',\n * referrer: 'client'\n * };\n *\n * // override some options\n * options.url = '../media/demo.wav';\n\n * // available types: 'arraybuffer', 'blob', 'json' or 'text'\n * options.responseType = 'arraybuffer';\n *\n * // make fetch call\n * let request = util.fetchFile(options);\n *\n * // listen for events\n * request.on('progress', e => {\n * console.log('progress', e);\n * });\n *\n * request.on('success', data => {\n * console.log('success!', data);\n * });\n *\n * request.on('error', e => {\n * console.warn('fetchFile error: ', e);\n * });\n */\nexport default function fetchFile(options) {\n if (!options) {\n throw new Error('fetch options missing');\n } else if (!options.url) {\n throw new Error('fetch url missing');\n }\n const instance = new Observer();\n const fetchHeaders = new Headers();\n const fetchRequest = new Request(options.url);\n\n // add ability to abort\n instance.controller = new AbortController();\n\n // check if headers have to be added\n if (options && options.requestHeaders) {\n // add custom request headers\n options.requestHeaders.forEach(header => {\n fetchHeaders.append(header.key, header.value);\n });\n }\n\n // parse fetch options\n const responseType = options.responseType || 'json';\n const fetchOptions = {\n method: options.method || 'GET',\n headers: fetchHeaders,\n mode: options.mode || 'cors',\n credentials: options.credentials || 'same-origin',\n cache: options.cache || 'default',\n redirect: options.redirect || 'follow',\n referrer: options.referrer || 'client',\n signal: instance.controller.signal\n };\n\n fetch(fetchRequest, fetchOptions)\n .then(response => {\n // store response reference\n instance.response = response;\n\n let progressAvailable = true;\n if (!response.body) {\n // ReadableStream is not yet supported in this browser\n // see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream\n progressAvailable = false;\n }\n\n // Server must send CORS header \"Access-Control-Expose-Headers: content-length\"\n const contentLength = response.headers.get('content-length');\n if (contentLength === null) {\n // Content-Length server response header missing.\n // Don't evaluate download progress if we can't compare against a total size\n // see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Access-Control-Expose-Headers\n progressAvailable = false;\n }\n\n if (!progressAvailable) {\n // not able to check download progress so skip it\n return response;\n }\n\n // fire progress event when during load\n instance.onProgress = e => {\n instance.fireEvent('progress', e);\n };\n\n return new Response(\n new ReadableStream(\n new ProgressHandler(instance, contentLength, response)\n ),\n fetchOptions\n );\n })\n .then(response => {\n let errMsg;\n if (response.ok) {\n switch (responseType) {\n case 'arraybuffer':\n return response.arrayBuffer();\n\n case 'json':\n return response.json();\n\n case 'blob':\n return response.blob();\n\n case 'text':\n return response.text();\n\n default:\n errMsg = 'Unknown responseType: ' + responseType;\n break;\n }\n }\n if (!errMsg) {\n errMsg = 'HTTP error status: ' + response.status;\n }\n throw new Error(errMsg);\n })\n .then(response => {\n instance.fireEvent('success', response);\n })\n .catch(error => {\n instance.fireEvent('error', error);\n });\n\n // return the fetch request\n instance.fetchRequest = fetchRequest;\n return instance;\n}\n","import reqAnimationFrame from './request-animation-frame';\n\n/**\n * Create a function which will be called at the next requestAnimationFrame\n * cycle\n *\n * @param {function} func The function to call\n *\n * @return {func} The function wrapped within a requestAnimationFrame\n */\nexport default function frame(func) {\n return (...args) => reqAnimationFrame(() => func(...args));\n}\n","/**\n * Get a random prefixed ID\n *\n * @param {String} prefix Prefix to use. Default is `'wavesurfer_'`.\n * @returns {String} Random prefixed ID\n * @example\n * console.log(getId()); // logs 'wavesurfer_b5pors4ru6g'\n *\n * let prefix = 'foo-';\n * console.log(getId(prefix)); // logs 'foo-b5pors4ru6g'\n */\nexport default function getId(prefix) {\n if (prefix === undefined) {\n prefix = 'wavesurfer_';\n }\n return (\n prefix +\n Math.random()\n .toString(32)\n .substring(2)\n );\n}\n","export { default as getId } from './get-id';\nexport { default as max } from './max';\nexport { default as min } from './min';\nexport { default as absMax } from './absMax';\nexport { default as Observer } from './observer';\nexport { default as style } from './style';\nexport { default as requestAnimationFrame } from './request-animation-frame';\nexport { default as frame } from './frame';\nexport { default as debounce } from 'debounce';\nexport { default as preventClick } from './prevent-click';\nexport { default as fetchFile } from './fetch';\nexport { default as clamp } from './clamp';\nexport { default as withOrientation } from './orientation';\n","/**\n * Get the largest value\n *\n * @param {Array} values Array of numbers\n * @returns {Number} Largest number found\n * @example console.log(max([1, 2, 3])); // logs 3\n */\nexport default function max(values) {\n let largest = -Infinity;\n Object.keys(values).forEach(i => {\n if (values[i] > largest) {\n largest = values[i];\n }\n });\n return largest;\n}\n","/**\n * Get the smallest value\n *\n * @param {Array} values Array of numbers\n * @returns {Number} Smallest number found\n * @example console.log(min([1, 2, 3])); // logs 1\n */\nexport default function min(values) {\n let smallest = Number(Infinity);\n Object.keys(values).forEach(i => {\n if (values[i] < smallest) {\n smallest = values[i];\n }\n });\n return smallest;\n}\n","/**\n * @typedef {Object} ListenerDescriptor\n * @property {string} name The name of the event\n * @property {function} callback The callback\n * @property {function} un The function to call to remove the listener\n */\n\n/**\n * Observer class\n */\nexport default class Observer {\n /**\n * Instantiate Observer\n */\n constructor() {\n /**\n * @private\n * @todo Initialise the handlers here already and remove the conditional\n * assignment in `on()`\n */\n this._disabledEventEmissions = [];\n this.handlers = null;\n }\n /**\n * Attach a handler function for an event.\n *\n * @param {string} event Name of the event to listen to\n * @param {function} fn The callback to trigger when the event is fired\n * @return {ListenerDescriptor} The event descriptor\n */\n on(event, fn) {\n if (!this.handlers) {\n this.handlers = {};\n }\n\n let handlers = this.handlers[event];\n if (!handlers) {\n handlers = this.handlers[event] = [];\n }\n handlers.push(fn);\n\n // Return an event descriptor\n return {\n name: event,\n callback: fn,\n un: (e, fn) => this.un(e, fn)\n };\n }\n\n /**\n * Remove an event handler.\n *\n * @param {string} event Name of the event the listener that should be\n * removed listens to\n * @param {function} fn The callback that should be removed\n */\n un(event, fn) {\n if (!this.handlers) {\n return;\n }\n\n const handlers = this.handlers[event];\n let i;\n if (handlers) {\n if (fn) {\n for (i = handlers.length - 1; i >= 0; i--) {\n if (handlers[i] == fn) {\n handlers.splice(i, 1);\n }\n }\n } else {\n handlers.length = 0;\n }\n }\n }\n\n /**\n * Remove all event handlers.\n */\n unAll() {\n this.handlers = null;\n }\n\n /**\n * Attach a handler to an event. The handler is executed at most once per\n * event type.\n *\n * @param {string} event The event to listen to\n * @param {function} handler The callback that is only to be called once\n * @return {ListenerDescriptor} The event descriptor\n */\n once(event, handler) {\n const fn = (...args) => {\n /* eslint-disable no-invalid-this */\n handler.apply(this, args);\n /* eslint-enable no-invalid-this */\n setTimeout(() => {\n this.un(event, fn);\n }, 0);\n };\n return this.on(event, fn);\n }\n\n /**\n * Disable firing a list of events by name. When specified, event handlers for any event type\n * passed in here will not be called.\n *\n * @since 4.0.0\n * @param {string[]} eventNames an array of event names to disable emissions for\n * @example\n * // disable seek and interaction events\n * wavesurfer.setDisabledEventEmissions(['seek', 'interaction']);\n */\n setDisabledEventEmissions(eventNames) {\n this._disabledEventEmissions = eventNames;\n }\n\n /**\n * plugins borrow part of this class without calling the constructor,\n * so we have to be careful about _disabledEventEmissions\n */\n\n _isDisabledEventEmission(event) {\n return this._disabledEventEmissions && this._disabledEventEmissions.includes(event);\n }\n\n /**\n * Manually fire an event\n *\n * @param {string} event The event to fire manually\n * @param {...any} args The arguments with which to call the listeners\n */\n fireEvent(event, ...args) {\n if (!this.handlers || this._isDisabledEventEmission(event)) {\n return;\n }\n\n const handlers = this.handlers[event];\n handlers &&\n handlers.forEach(fn => {\n fn(...args);\n });\n }\n}\n","const verticalPropMap = {\n width: 'height',\n height: 'width',\n\n overflowX: 'overflowY',\n overflowY: 'overflowX',\n\n clientWidth: 'clientHeight',\n clientHeight: 'clientWidth',\n\n clientX: 'clientY',\n clientY: 'clientX',\n\n scrollWidth: 'scrollHeight',\n scrollLeft: 'scrollTop',\n\n offsetLeft: 'offsetTop',\n offsetTop: 'offsetLeft',\n offsetHeight: 'offsetWidth',\n offsetWidth: 'offsetHeight',\n\n left: 'top',\n right: 'bottom',\n top: 'left',\n bottom: 'right',\n\n borderRightStyle: 'borderBottomStyle',\n borderRightWidth: 'borderBottomWidth',\n borderRightColor: 'borderBottomColor'\n};\n\n/**\n * Convert a horizontally-oriented property name to a vertical one.\n *\n * @param {string} prop A property name\n * @param {bool} vertical Whether the element is oriented vertically\n * @returns {string} prop, converted appropriately\n */\nfunction mapProp(prop, vertical) {\n if (Object.prototype.hasOwnProperty.call(verticalPropMap, prop)) {\n return vertical ? verticalPropMap[prop] : prop;\n } else {\n return prop;\n }\n}\n\nconst isProxy = Symbol(\"isProxy\");\n\n/**\n * Returns an appropriately oriented object based on vertical.\n * If vertical is true, attribute getting and setting will be mapped through\n * verticalPropMap, so that e.g. getting the object's .width will give its\n * .height instead.\n * Certain methods of an oriented object will return oriented objects as well.\n * Oriented objects can't be added to the DOM directly since they are Proxy objects\n * and thus fail typechecks. Use domElement to get the actual element for this.\n *\n * @param {object} target The object to be wrapped and oriented\n * @param {bool} vertical Whether the element is oriented vertically\n * @returns {Proxy} An oriented object with attr translation via verticalAttrMap\n * @since 5.0.0\n */\nexport default function withOrientation(target, vertical) {\n if (target[isProxy]) {\n return target;\n } else {\n return new Proxy(\n target, {\n get: function(obj, prop, receiver) {\n if (prop === isProxy) {\n return true;\n } else if (prop === 'domElement') {\n return obj;\n } else if (prop === 'style') {\n return withOrientation(obj.style, vertical);\n } else if (prop === 'canvas') {\n return withOrientation(obj.canvas, vertical);\n } else if (prop === 'getBoundingClientRect') {\n return function(...args) {\n return withOrientation(obj.getBoundingClientRect(...args), vertical);\n };\n } else if (prop === 'getContext') {\n return function(...args) {\n return withOrientation(obj.getContext(...args), vertical);\n };\n } else {\n let value = obj[mapProp(prop, vertical)];\n return typeof value == 'function' ? value.bind(obj) : value;\n }\n },\n set: function(obj, prop, value) {\n obj[mapProp(prop, vertical)] = value;\n return true;\n }\n }\n );\n }\n}\n","/**\n * Stops propagation of click event and removes event listener\n *\n * @private\n * @param {object} event The click event\n */\nfunction preventClickHandler(event) {\n event.stopPropagation();\n document.body.removeEventListener('click', preventClickHandler, true);\n}\n\n/**\n * Starts listening for click event and prevent propagation\n *\n * @param {object} values Values\n */\nexport default function preventClick(values) {\n document.body.addEventListener('click', preventClickHandler, true);\n}\n","/* eslint-disable valid-jsdoc */\n/**\n * Returns the `requestAnimationFrame` function for the browser, or a shim with\n * `setTimeout` if the function is not found\n *\n * @return {function} Available `requestAnimationFrame` function for the browser\n */\nexport default (\n window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n ((callback, element) => setTimeout(callback, 1000 / 60))\n).bind(window);\n","/**\n * Apply a map of styles to an element\n *\n * @param {HTMLElement} el The element that the styles will be applied to\n * @param {Object} styles The map of propName: attribute, both are used as-is\n *\n * @return {HTMLElement} el\n */\nexport default function style(el, styles) {\n Object.keys(styles).forEach(prop => {\n if (el.style[prop] !== styles[prop]) {\n el.style[prop] = styles[prop];\n }\n });\n return el;\n}\n","import * as util from './util';\nimport MultiCanvas from './drawer.multicanvas';\nimport WebAudio from './webaudio';\nimport MediaElement from './mediaelement';\nimport PeakCache from './peakcache';\nimport MediaElementWebAudio from './mediaelement-webaudio';\n\n/*\n * This work is licensed under a BSD-3-Clause License.\n */\n\n/** @external {HTMLElement} https://developer.mozilla.org/en/docs/Web/API/HTMLElement */\n/** @external {OfflineAudioContext} https://developer.mozilla.org/en-US/docs/Web/API/OfflineAudioContext */\n/** @external {File} https://developer.mozilla.org/en-US/docs/Web/API/File */\n/** @external {Blob} https://developer.mozilla.org/en-US/docs/Web/API/Blob */\n/** @external {CanvasRenderingContext2D} https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D */\n/** @external {MediaStreamConstraints} https://developer.mozilla.org/en-US/docs/Web/API/MediaStreamConstraints */\n/** @external {AudioNode} https://developer.mozilla.org/de/docs/Web/API/AudioNode */\n\n/**\n * @typedef {Object} WavesurferParams\n * @property {AudioContext} audioContext=null Use your own previously\n * initialized AudioContext or leave blank.\n * @property {number} audioRate=1 Speed at which to play audio. Lower number is\n * slower.\n * @property {ScriptProcessorNode} audioScriptProcessor=null Use your own previously\n * initialized ScriptProcessorNode or leave blank.\n * @property {boolean} autoCenter=true If a scrollbar is present, center the\n * waveform on current progress\n * @property {number} autoCenterRate=5 If autoCenter is active, rate at which the\n * waveform is centered\n * @property {boolean} autoCenterImmediately=false If autoCenter is active, immediately\n * center waveform on current progress\n * @property {string} backend='WebAudio' `'WebAudio'|'MediaElement'|'MediaElementWebAudio'` In most cases\n * you don't have to set this manually. MediaElement is a fallback for unsupported browsers.\n * MediaElementWebAudio allows to use WebAudio API also with big audio files, loading audio like with\n * MediaElement backend (HTML5 audio tag). You have to use the same methods of MediaElement backend for loading and\n * playback, giving also peaks, so the audio data are not decoded. In this way you can use WebAudio features, like filters,\n * also with audio with big duration. For example:\n * ` wavesurfer.load(url | HTMLMediaElement, peaks, preload, duration);\n * wavesurfer.play();\n * wavesurfer.setFilter(customFilter);\n * `\n * @property {string} backgroundColor=null Change background color of the\n * waveform container.\n * @property {number} barHeight=1 The height of the wave bars.\n * @property {number} barRadius=0 The radius of the wave bars. Makes bars rounded\n * @property {number} barGap=null The optional spacing between bars of the wave,\n * if not provided will be calculated in legacy format.\n * @property {number} barWidth=null Draw the waveform using bars.\n * @property {number} barMinHeight=null If specified, draw at least a bar of this height,\n * eliminating waveform gaps\n * @property {boolean} closeAudioContext=false Close and nullify all audio\n * contexts when the destroy method is called.\n * @property {!string|HTMLElement} container CSS selector or HTML element where\n * the waveform should be drawn. This is the only required parameter.\n * @property {string} cursorColor='#333' The fill color of the cursor indicating\n * the playhead position.\n * @property {number} cursorWidth=1 Measured in pixels.\n * @property {object} drawingContextAttributes={desynchronized: false} Drawing context\n * attributes.\n * @property {number} duration=null Optional audio length so pre-rendered peaks\n * can be display immediately for example.\n * @property {boolean} fillParent=true Whether to fill the entire container or\n * draw only according to `minPxPerSec`.\n * @property {boolean} forceDecode=false Force decoding of audio using web audio\n * when zooming to get a more detailed waveform.\n * @property {number} height=128 The height of the waveform. Measured in\n * pixels.\n * @property {boolean} hideScrollbar=false Whether to hide the horizontal\n * scrollbar when one would normally be shown.\n * @property {boolean} interact=true Whether the mouse interaction will be\n * enabled at initialization. You can switch this parameter at any time later\n * on.\n * @property {boolean} loopSelection=true (Use with regions plugin) Enable\n * looping of selected regions\n * @property {number} maxCanvasWidth=4000 Maximum width of a single canvas in\n * pixels, excluding a small overlap (2 * `pixelRatio`, rounded up to the next\n * even integer). If the waveform is longer than this value, additional canvases\n * will be used to render the waveform, which is useful for very large waveforms\n * that may be too wide for browsers to draw on a single canvas.\n * @property {boolean} mediaControls=false (Use with backend `MediaElement` or `MediaElementWebAudio`)\n * this enables the native controls for the media element\n * @property {string} mediaType='audio' (Use with backend `MediaElement` or `MediaElementWebAudio`)\n * `'audio'|'video'` ('video' only for `MediaElement`)\n * @property {number} minPxPerSec=20 Minimum number of pixels per second of\n * audio.\n * @property {boolean} normalize=false If true, normalize by the maximum peak\n * instead of 1.0.\n * @property {boolean} partialRender=false Use the PeakCache to improve\n * rendering speed of large waveforms\n * @property {number} pixelRatio=window.devicePixelRatio The pixel ratio used to\n * calculate display\n * @property {PluginDefinition[]} plugins=[] An array of plugin definitions to\n * register during instantiation, they will be directly initialised unless they\n * are added with the `deferInit` property set to true.\n * @property {string} progressColor='#555' The fill color of the part of the\n * waveform behind the cursor. When `progressColor` and `waveColor` are the same\n * the progress wave is not rendered at all.\n * @property {boolean} removeMediaElementOnDestroy=true Set to false to keep the\n * media element in the DOM when the player is destroyed. This is useful when\n * reusing an existing media element via the `loadMediaElement` method.\n * @property {Object} renderer=MultiCanvas Can be used to inject a custom\n * renderer.\n * @property {boolean|number} responsive=false If set to `true` resize the\n * waveform, when the window is resized. This is debounced with a `100ms`\n * timeout by default. If this parameter is a number it represents that timeout.\n * @property {boolean} rtl=false If set to `true`, renders waveform from\n * right-to-left.\n * @property {boolean} scrollParent=false Whether to scroll the container with a\n * lengthy waveform. Otherwise the waveform is shrunk to the container width\n * (see fillParent).\n * @property {number} skipLength=2 Number of seconds to skip with the\n * skipForward() and skipBackward() methods.\n * @property {boolean} splitChannels=false Render with separate waveforms for\n * the channels of the audio\n * @property {SplitChannelOptions} splitChannelsOptions={} Options for splitChannel rendering\n * @property {boolean} vertical=false Render the waveform vertically instead of horizontally.\n * @property {string} waveColor='#999' The fill color of the waveform after the\n * cursor.\n * @property {object} xhr={} XHR options. For example:\n * `let xhr = {\n * cache: 'default',\n * mode: 'cors',\n * method: 'GET',\n * credentials: 'same-origin',\n * redirect: 'follow',\n * referrer: 'client',\n * requestHeaders: [\n * {\n * key: 'Authorization',\n * value: 'my-token'\n * }\n * ]\n * };`\n */\n\n/**\n * @typedef {Object} PluginDefinition\n * @desc The Object used to describe a plugin\n * @example wavesurfer.addPlugin(pluginDefinition);\n * @property {string} name The name of the plugin, the plugin instance will be\n * added as a property to the wavesurfer instance under this name\n * @property {?Object} staticProps The properties that should be added to the\n * wavesurfer instance as static properties\n * @property {?boolean} deferInit Don't initialise plugin\n * automatically\n * @property {Object} params={} The plugin parameters, they are the first parameter\n * passed to the plugin class constructor function\n * @property {PluginClass} instance The plugin instance factory, is called with\n * the dependency specified in extends. Returns the plugin class.\n */\n\n/**\n * @typedef {Object} SplitChannelOptions\n * @desc parameters applied when splitChannels option is true\n * @property {boolean} overlay=false determines whether channels are rendered on top of each other or on separate tracks\n * @property {object} channelColors={} object describing color for each channel. Example:\n * {\n * 0: {\n * progressColor: 'green',\n * waveColor: 'pink'\n * },\n * 1: {\n * progressColor: 'orange',\n * waveColor: 'purple'\n * }\n * }\n * @property {number[]} filterChannels=[] indexes of channels to be hidden from rendering\n * @property {boolean} relativeNormalization=false determines whether\n * normalization is done per channel or maintains proportionality between\n * channels. Only applied when normalize and splitChannels are both true.\n * @since 4.3.0\n */\n\n/**\n * @interface PluginClass\n *\n * @desc This is the interface which is implemented by all plugin classes. Note\n * that this only turns into an observer after being passed through\n * `wavesurfer.addPlugin`.\n *\n * @extends {Observer}\n */\nclass PluginClass {\n /**\n * 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 * It returns a `PluginDefinition` object representing the plugin.\n *\n * @param {Object} params={} The plugin params (specific to the plugin)\n */\n create(params) {}\n /**\n * Construct the plugin\n *\n * @param {Object} params={} The plugin params (specific to the plugin)\n * @param {Object} ws The wavesurfer instance\n */\n constructor(params, ws) {}\n /**\n * Initialise the plugin\n *\n * Start doing something. This is called by\n * `wavesurfer.initPlugin(pluginName)`\n */\n init() {}\n /**\n * Destroy the plugin instance\n *\n * Stop doing something. This is called by\n * `wavesurfer.destroyPlugin(pluginName)`\n */\n destroy() {}\n}\n\n/**\n * WaveSurfer core library class\n *\n * @extends {Observer}\n * @example\n * const params = {\n * container: '#waveform',\n * waveColor: 'violet',\n * progressColor: 'purple'\n * };\n *\n * // initialise like this\n * const wavesurfer = WaveSurfer.create(params);\n *\n * // or like this ...\n * const wavesurfer = new WaveSurfer(params);\n * wavesurfer.init();\n *\n * // load audio file\n * wavesurfer.load('example/media/demo.wav');\n */\nexport default class WaveSurfer extends util.Observer {\n /** @private */\n defaultParams = {\n audioContext: null,\n audioScriptProcessor: null,\n audioRate: 1,\n autoCenter: true,\n autoCenterRate: 5,\n autoCenterImmediately: false,\n backend: 'WebAudio',\n backgroundColor: null,\n barHeight: 1,\n barRadius: 0,\n barGap: null,\n barMinHeight: null,\n container: null,\n cursorColor: '#333',\n cursorWidth: 1,\n dragSelection: true,\n drawingContextAttributes: {\n // Boolean that hints the user agent to reduce the latency\n // by desynchronizing the canvas paint cycle from the event\n // loop\n desynchronized: false\n },\n duration: null,\n fillParent: true,\n forceDecode: false,\n height: 128,\n hideScrollbar: false,\n interact: true,\n loopSelection: true,\n maxCanvasWidth: 4000,\n mediaContainer: null,\n mediaControls: false,\n mediaType: 'audio',\n minPxPerSec: 20,\n normalize: false,\n partialRender: false,\n pixelRatio:\n window.devicePixelRatio || screen.deviceXDPI / screen.logicalXDPI,\n plugins: [],\n progressColor: '#555',\n removeMediaElementOnDestroy: true,\n renderer: MultiCanvas,\n responsive: false,\n rtl: false,\n scrollParent: false,\n skipLength: 2,\n splitChannels: false,\n splitChannelsOptions: {\n overlay: false,\n channelColors: {},\n filterChannels: [],\n relativeNormalization: false\n },\n vertical: false,\n waveColor: '#999',\n xhr: {}\n };\n\n /** @private */\n backends = {\n MediaElement,\n WebAudio,\n MediaElementWebAudio\n };\n\n /**\n * Instantiate this class, call its `init` function and returns it\n *\n * @param {WavesurferParams} params The wavesurfer parameters\n * @return {Object} WaveSurfer instance\n * @example const wavesurfer = WaveSurfer.create(params);\n */\n static create(params) {\n const wavesurfer = new WaveSurfer(params);\n return wavesurfer.init();\n }\n\n /**\n * The library version number is available as a static property of the\n * WaveSurfer class\n *\n * @type {String}\n * @example\n * console.log('Using wavesurfer.js ' + WaveSurfer.VERSION);\n */\n static VERSION = __VERSION__;\n\n /**\n * Functions in the `util` property are available as a prototype property to\n * all instances\n *\n * @type {Object}\n * @example\n * const wavesurfer = WaveSurfer.create(params);\n * wavesurfer.util.style(myElement, { background: 'blue' });\n */\n util = util;\n\n /**\n * Functions in the `util` property are available as a static property of the\n * WaveSurfer class\n *\n * @type {Object}\n * @example\n * WaveSurfer.util.style(myElement, { background: 'blue' });\n */\n static util = util;\n\n /**\n * Initialise wavesurfer instance\n *\n * @param {WavesurferParams} params Instantiation options for wavesurfer\n * @example\n * const wavesurfer = new WaveSurfer(params);\n * @returns {this} Wavesurfer instance\n */\n constructor(params) {\n super();\n /**\n * Extract relevant parameters (or defaults)\n * @private\n */\n this.params = Object.assign({}, this.defaultParams, params);\n this.params.splitChannelsOptions = Object.assign(\n {},\n this.defaultParams.splitChannelsOptions,\n params.splitChannelsOptions\n );\n /** @private */\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(this.params.container)\n : this.params.container;\n\n if (!this.container) {\n throw new Error('Container element not found');\n }\n\n if (this.params.mediaContainer == null) {\n /** @private */\n this.mediaContainer = this.container;\n } else if (typeof this.params.mediaContainer == 'string') {\n /** @private */\n this.mediaContainer = document.querySelector(\n this.params.mediaContainer\n );\n } else {\n /** @private */\n this.mediaContainer = this.params.mediaContainer;\n }\n\n if (!this.mediaContainer) {\n throw new Error('Media Container element not found');\n }\n\n if (this.params.maxCanvasWidth <= 1) {\n throw new Error('maxCanvasWidth must be greater than 1');\n } else if (this.params.maxCanvasWidth % 2 == 1) {\n throw new Error('maxCanvasWidth must be an even number');\n }\n\n if (this.params.rtl === true) {\n if (this.params.vertical === true) {\n util.style(this.container, { transform: 'rotateX(180deg)' });\n } else {\n util.style(this.container, { transform: 'rotateY(180deg)' });\n }\n }\n\n if (this.params.backgroundColor) {\n this.setBackgroundColor(this.params.backgroundColor);\n }\n\n /**\n * @private Used to save the current volume when muting so we can\n * restore once unmuted\n * @type {number}\n */\n this.savedVolume = 0;\n\n /**\n * @private The current muted state\n * @type {boolean}\n */\n this.isMuted = false;\n\n /**\n * @private Will hold a list of event descriptors that need to be\n * canceled on subsequent loads of audio\n * @type {Object[]}\n */\n this.tmpEvents = [];\n\n /**\n * @private Holds any running audio downloads\n * @type {Observer}\n */\n this.currentRequest = null;\n /** @private */\n this.arraybuffer = null;\n /** @private */\n this.drawer = null;\n /** @private */\n this.backend = null;\n /** @private */\n this.peakCache = null;\n\n // cache constructor objects\n if (typeof this.params.renderer !== 'function') {\n throw new Error('Renderer parameter is invalid');\n }\n /**\n * @private The uninitialised Drawer class\n */\n this.Drawer = this.params.renderer;\n /**\n * @private The uninitialised Backend class\n */\n // Back compat\n if (this.params.backend == 'AudioElement') {\n this.params.backend = 'MediaElement';\n }\n\n if (\n (this.params.backend == 'WebAudio' ||\n this.params.backend === 'MediaElementWebAudio') &&\n !WebAudio.prototype.supportsWebAudio.call(null)\n ) {\n this.params.backend = 'MediaElement';\n }\n this.Backend = this.backends[this.params.backend];\n\n /**\n * @private map of plugin names that are currently initialised\n */\n this.initialisedPluginList = {};\n /** @private */\n this.isDestroyed = false;\n\n /**\n * Get the current ready status.\n *\n * @example const isReady = wavesurfer.isReady;\n * @return {boolean}\n */\n this.isReady = false;\n\n // responsive debounced event listener. If this.params.responsive is not\n // set, this is never called. Use 100ms or this.params.responsive as\n // timeout for the debounce function.\n let prevWidth = 0;\n this._onResize = util.debounce(\n () => {\n if (\n prevWidth != this.drawer.wrapper.clientWidth &&\n !this.params.scrollParent\n ) {\n prevWidth = this.drawer.wrapper.clientWidth;\n this.drawer.fireEvent('redraw');\n }\n },\n typeof this.params.responsive === 'number'\n ? this.params.responsive\n : 100\n );\n\n return this;\n }\n\n /**\n * Initialise the wave\n *\n * @example\n * var wavesurfer = new WaveSurfer(params);\n * wavesurfer.init();\n * @return {this} The wavesurfer instance\n */\n init() {\n this.registerPlugins(this.params.plugins);\n this.createDrawer();\n this.createBackend();\n this.createPeakCache();\n return this;\n }\n\n /**\n * Add and initialise array of plugins (if `plugin.deferInit` is falsey),\n * this function is called in the init function of wavesurfer\n *\n * @param {PluginDefinition[]} plugins An array of plugin definitions\n * @emits {WaveSurfer#plugins-registered} Called with the array of plugin definitions\n * @return {this} The wavesurfer instance\n */\n registerPlugins(plugins) {\n // first instantiate all the plugins\n plugins.forEach(plugin => this.addPlugin(plugin));\n\n // now run the init functions\n plugins.forEach(plugin => {\n // call init function of the plugin if deferInit is falsey\n // in that case you would manually use initPlugins()\n if (!plugin.deferInit) {\n this.initPlugin(plugin.name);\n }\n });\n this.fireEvent('plugins-registered', plugins);\n return this;\n }\n\n /**\n * Get a map of plugin names that are currently initialised\n *\n * @example wavesurfer.getPlugins();\n * @return {Object} Object with plugin names\n */\n getActivePlugins() {\n return this.initialisedPluginList;\n }\n\n /**\n * Add a plugin object to wavesurfer\n *\n * @param {PluginDefinition} plugin A plugin definition\n * @emits {WaveSurfer#plugin-added} Called with the name of the plugin that was added\n * @example wavesurfer.addPlugin(WaveSurfer.minimap());\n * @return {this} The wavesurfer instance\n */\n addPlugin(plugin) {\n if (!plugin.name) {\n throw new Error('Plugin does not have a name!');\n }\n if (!plugin.instance) {\n throw new Error(\n `Plugin ${plugin.name} does not have an instance property!`\n );\n }\n\n // staticProps properties are applied to wavesurfer instance\n if (plugin.staticProps) {\n Object.keys(plugin.staticProps).forEach(pluginStaticProp => {\n /**\n * Properties defined in a plugin definition's `staticProps` property are added as\n * staticProps properties of the WaveSurfer instance\n */\n this[pluginStaticProp] = plugin.staticProps[pluginStaticProp];\n });\n }\n\n const Instance = plugin.instance;\n\n // turn the plugin instance into an observer\n const observerPrototypeKeys = Object.getOwnPropertyNames(\n util.Observer.prototype\n );\n observerPrototypeKeys.forEach(key => {\n Instance.prototype[key] = util.Observer.prototype[key];\n });\n\n /**\n * Instantiated plugin classes are added as a property of the wavesurfer\n * instance\n * @type {Object}\n */\n this[plugin.name] = new Instance(plugin.params || {}, this);\n this.fireEvent('plugin-added', plugin.name);\n return this;\n }\n\n /**\n * Initialise a plugin\n *\n * @param {string} name A plugin name\n * @emits WaveSurfer#plugin-initialised\n * @example wavesurfer.initPlugin('minimap');\n * @return {this} The wavesurfer instance\n */\n initPlugin(name) {\n if (!this[name]) {\n throw new Error(`Plugin ${name} has not been added yet!`);\n }\n if (this.initialisedPluginList[name]) {\n // destroy any already initialised plugins\n this.destroyPlugin(name);\n }\n this[name].init();\n this.initialisedPluginList[name] = true;\n this.fireEvent('plugin-initialised', name);\n return this;\n }\n\n /**\n * Destroy a plugin\n *\n * @param {string} name A plugin name\n * @emits WaveSurfer#plugin-destroyed\n * @example wavesurfer.destroyPlugin('minimap');\n * @returns {this} The wavesurfer instance\n */\n destroyPlugin(name) {\n if (!this[name]) {\n throw new Error(\n `Plugin ${name} has not been added yet and cannot be destroyed!`\n );\n }\n if (!this.initialisedPluginList[name]) {\n throw new Error(\n `Plugin ${name} is not active and cannot be destroyed!`\n );\n }\n if (typeof this[name].destroy !== 'function') {\n throw new Error(`Plugin ${name} does not have a destroy function!`);\n }\n\n this[name].destroy();\n delete this.initialisedPluginList[name];\n this.fireEvent('plugin-destroyed', name);\n return this;\n }\n\n /**\n * Destroy all initialised plugins. Convenience function to use when\n * wavesurfer is removed\n *\n * @private\n */\n destroyAllPlugins() {\n Object.keys(this.initialisedPluginList).forEach(name =>\n this.destroyPlugin(name)\n );\n }\n\n /**\n * Create the drawer and draw the waveform\n *\n * @private\n * @emits WaveSurfer#drawer-created\n */\n createDrawer() {\n this.drawer = new this.Drawer(this.container, this.params);\n this.drawer.init();\n this.fireEvent('drawer-created', this.drawer);\n\n if (this.params.responsive !== false) {\n window.addEventListener('resize', this._onResize, true);\n window.addEventListener('orientationchange', this._onResize, true);\n }\n\n this.drawer.on('redraw', () => {\n this.drawBuffer();\n this.drawer.progress(this.backend.getPlayedPercents());\n });\n\n // Click-to-seek\n this.drawer.on('click', (e, progress) => {\n setTimeout(() => this.seekTo(progress), 0);\n });\n\n // Relay the scroll event from the drawer\n this.drawer.on('scroll', e => {\n if (this.params.partialRender) {\n this.drawBuffer();\n }\n this.fireEvent('scroll', e);\n });\n }\n\n /**\n * Create the backend\n *\n * @private\n * @emits WaveSurfer#backend-created\n */\n createBackend() {\n if (this.backend) {\n this.backend.destroy();\n }\n\n this.backend = new this.Backend(this.params);\n this.backend.init();\n this.fireEvent('backend-created', this.backend);\n\n this.backend.on('finish', () => {\n this.drawer.progress(this.backend.getPlayedPercents());\n this.fireEvent('finish');\n });\n this.backend.on('play', () => this.fireEvent('play'));\n this.backend.on('pause', () => this.fireEvent('pause'));\n\n this.backend.on('audioprocess', time => {\n this.drawer.progress(this.backend.getPlayedPercents());\n this.fireEvent('audioprocess', time);\n });\n\n // only needed for MediaElement and MediaElementWebAudio backend\n if (\n this.params.backend === 'MediaElement' ||\n this.params.backend === 'MediaElementWebAudio'\n ) {\n this.backend.on('seek', () => {\n this.drawer.progress(this.backend.getPlayedPercents());\n });\n\n this.backend.on('volume', () => {\n let newVolume = this.getVolume();\n this.fireEvent('volume', newVolume);\n\n if (this.backend.isMuted !== this.isMuted) {\n this.isMuted = this.backend.isMuted;\n this.fireEvent('mute', this.isMuted);\n }\n });\n }\n }\n\n /**\n * Create the peak cache\n *\n * @private\n */\n createPeakCache() {\n if (this.params.partialRender) {\n this.peakCache = new PeakCache();\n }\n }\n\n /**\n * Get the duration of the audio clip\n *\n * @example const duration = wavesurfer.getDuration();\n * @return {number} Duration in seconds\n */\n getDuration() {\n return this.backend.getDuration();\n }\n\n /**\n * Get the current playback position\n *\n * @example const currentTime = wavesurfer.getCurrentTime();\n * @return {number} Playback position in seconds\n */\n getCurrentTime() {\n return this.backend.getCurrentTime();\n }\n\n /**\n * Set the current play time in seconds.\n *\n * @param {number} seconds A positive number in seconds. E.g. 10 means 10\n * seconds, 60 means 1 minute\n */\n setCurrentTime(seconds) {\n if (seconds >= this.getDuration()) {\n this.seekTo(1);\n } else {\n this.seekTo(seconds / this.getDuration());\n }\n }\n\n /**\n * Starts playback from the current position. Optional start and end\n * measured in seconds can be used to set the range of audio to play.\n *\n * @param {?number} start Position to start at\n * @param {?number} end Position to end at\n * @emits WaveSurfer#interaction\n * @return {Promise} Result of the backend play method\n * @example\n * // play from second 1 to 5\n * wavesurfer.play(1, 5);\n */\n play(start, end) {\n this.fireEvent('interaction', () => this.play(start, end));\n return this.backend.play(start, end);\n }\n\n /**\n * Set a point in seconds for playback to stop at.\n *\n * @param {number} position Position (in seconds) to stop at\n * @version 3.3.0\n */\n setPlayEnd(position) {\n this.backend.setPlayEnd(position);\n }\n\n /**\n * Stops and pauses playback\n *\n * @example wavesurfer.pause();\n * @return {Promise} Result of the backend pause method\n */\n pause() {\n if (!this.backend.isPaused()) {\n return this.backend.pause();\n }\n }\n\n /**\n * Toggle playback\n *\n * @example wavesurfer.playPause();\n * @return {Promise} Result of the backend play or pause method\n */\n playPause() {\n return this.backend.isPaused() ? this.play() : this.pause();\n }\n\n /**\n * Get the current playback state\n *\n * @example const isPlaying = wavesurfer.isPlaying();\n * @return {boolean} False if paused, true if playing\n */\n isPlaying() {\n return !this.backend.isPaused();\n }\n\n /**\n * Skip backward\n *\n * @param {?number} seconds Amount to skip back, if not specified `skipLength`\n * is used\n * @example wavesurfer.skipBackward();\n */\n skipBackward(seconds) {\n this.skip(-seconds || -this.params.skipLength);\n }\n\n /**\n * Skip forward\n *\n * @param {?number} seconds Amount to skip back, if not specified `skipLength`\n * is used\n * @example wavesurfer.skipForward();\n */\n skipForward(seconds) {\n this.skip(seconds || this.params.skipLength);\n }\n\n /**\n * Skip a number of seconds from the current position (use a negative value\n * to go backwards).\n *\n * @param {number} offset Amount to skip back or forwards\n * @example\n * // go back 2 seconds\n * wavesurfer.skip(-2);\n */\n skip(offset) {\n const duration = this.getDuration() || 1;\n let position = this.getCurrentTime() || 0;\n position = Math.max(0, Math.min(duration, position + (offset || 0)));\n this.seekAndCenter(position / duration);\n }\n\n /**\n * Seeks to a position and centers the view\n *\n * @param {number} progress Between 0 (=beginning) and 1 (=end)\n * @example\n * // seek and go to the middle of the audio\n * wavesurfer.seekTo(0.5);\n */\n seekAndCenter(progress) {\n this.seekTo(progress);\n this.drawer.recenter(progress);\n }\n\n /**\n * Seeks to a position\n *\n * @param {number} progress Between 0 (=beginning) and 1 (=end)\n * @emits WaveSurfer#interaction\n * @emits WaveSurfer#seek\n * @example\n * // seek to the middle of the audio\n * wavesurfer.seekTo(0.5);\n */\n seekTo(progress) {\n // return an error if progress is not a number between 0 and 1\n if (\n typeof progress !== 'number' ||\n !isFinite(progress) ||\n progress < 0 ||\n progress > 1\n ) {\n throw new Error(\n 'Error calling wavesurfer.seekTo, parameter must be a number between 0 and 1!'\n );\n }\n this.fireEvent('interaction', () => this.seekTo(progress));\n\n const isWebAudioBackend = this.params.backend === 'WebAudio';\n const paused = this.backend.isPaused();\n\n if (isWebAudioBackend && !paused) {\n this.backend.pause();\n }\n\n // avoid small scrolls while paused seeking\n const oldScrollParent = this.params.scrollParent;\n this.params.scrollParent = false;\n this.backend.seekTo(progress * this.getDuration());\n this.drawer.progress(progress);\n\n if (isWebAudioBackend && !paused) {\n this.backend.play();\n }\n\n this.params.scrollParent = oldScrollParent;\n this.fireEvent('seek', progress);\n }\n\n /**\n * Stops and goes to the beginning.\n *\n * @example wavesurfer.stop();\n */\n stop() {\n this.pause();\n this.seekTo(0);\n this.drawer.progress(0);\n }\n\n /**\n * Sets the ID of the audio device to use for output and returns a Promise.\n *\n * @param {string} deviceId String value representing underlying output\n * device\n * @returns {Promise} `Promise` that resolves to `undefined` when there are\n * no errors detected.\n */\n setSinkId(deviceId) {\n return this.backend.setSinkId(deviceId);\n }\n\n /**\n * Set the playback volume.\n *\n * @param {number} newVolume A value between 0 and 1, 0 being no\n * volume and 1 being full volume.\n * @emits WaveSurfer#volume\n */\n setVolume(newVolume) {\n this.backend.setVolume(newVolume);\n this.fireEvent('volume', newVolume);\n }\n\n /**\n * Get the playback volume.\n *\n * @return {number} A value between 0 and 1, 0 being no\n * volume and 1 being full volume.\n */\n getVolume() {\n return this.backend.getVolume();\n }\n\n /**\n * Set the playback rate.\n *\n * @param {number} rate A positive number. E.g. 0.5 means half the normal\n * speed, 2 means double speed and so on.\n * @example wavesurfer.setPlaybackRate(2);\n */\n setPlaybackRate(rate) {\n this.backend.setPlaybackRate(rate);\n }\n\n /**\n * Get the playback rate.\n *\n * @return {number} The current playback rate.\n */\n getPlaybackRate() {\n return this.backend.getPlaybackRate();\n }\n\n /**\n * Toggle the volume on and off. If not currently muted it will save the\n * current volume value and turn the volume off. If currently muted then it\n * will restore the volume to the saved value, and then rest the saved\n * value.\n *\n * @example wavesurfer.toggleMute();\n */\n toggleMute() {\n this.setMute(!this.isMuted);\n }\n\n /**\n * Enable or disable muted audio\n *\n * @param {boolean} mute Specify `true` to mute audio.\n * @emits WaveSurfer#volume\n * @emits WaveSurfer#mute\n * @example\n * // unmute\n * wavesurfer.setMute(false);\n * console.log(wavesurfer.getMute()) // logs false\n */\n setMute(mute) {\n // ignore all muting requests if the audio is already in that state\n if (mute === this.isMuted) {\n this.fireEvent('mute', this.isMuted);\n return;\n }\n\n if (this.backend.setMute) {\n // Backends such as the MediaElement backend have their own handling\n // of mute, let them handle it.\n this.backend.setMute(mute);\n this.isMuted = mute;\n } else {\n if (mute) {\n // If currently not muted then save current volume,\n // turn off the volume and update the mute properties\n this.savedVolume = this.backend.getVolume();\n this.backend.setVolume(0);\n this.isMuted = true;\n this.fireEvent('volume', 0);\n } else {\n // If currently muted then restore to the saved volume\n // and update the mute properties\n this.backend.setVolume(this.savedVolume);\n this.isMuted = false;\n this.fireEvent('volume', this.savedVolume);\n }\n }\n this.fireEvent('mute', this.isMuted);\n }\n\n /**\n * Get the current mute status.\n *\n * @example const isMuted = wavesurfer.getMute();\n * @return {boolean} Current mute status\n */\n getMute() {\n return this.isMuted;\n }\n\n /**\n * Get the list of current set filters as an array.\n *\n * Filters must be set with setFilters method first\n *\n * @return {array} List of enabled filters\n */\n getFilters() {\n return this.backend.filters || [];\n }\n\n /**\n * Toggles `scrollParent` and redraws\n *\n * @example wavesurfer.toggleScroll();\n */\n toggleScroll() {\n this.params.scrollParent = !this.params.scrollParent;\n this.drawBuffer();\n }\n\n /**\n * Toggle mouse interaction\n *\n * @example wavesurfer.toggleInteraction();\n */\n toggleInteraction() {\n this.params.interact = !this.params.interact;\n }\n\n /**\n * Get the fill color of the waveform after the cursor.\n *\n * @return {string} A CSS color string.\n */\n getWaveColor() {\n return this.params.waveColor;\n }\n\n /**\n * Set the fill color of the waveform after the cursor.\n *\n * @param {string} color A CSS color string.\n * @example wavesurfer.setWaveColor('#ddd');\n */\n setWaveColor(color) {\n this.params.waveColor = color;\n this.drawBuffer();\n }\n\n /**\n * Get the fill color of the waveform behind the cursor.\n *\n * @return {string} A CSS color string.\n */\n getProgressColor() {\n return this.params.progressColor;\n }\n\n /**\n * Set the fill color of the waveform behind the cursor.\n *\n * @param {string} color A CSS color string.\n * @example wavesurfer.setProgressColor('#400');\n */\n setProgressColor(color) {\n this.params.progressColor = color;\n this.drawBuffer();\n }\n\n /**\n * Get the background color of the waveform container.\n *\n * @return {string} A CSS color string.\n */\n getBackgroundColor() {\n return this.params.backgroundColor;\n }\n\n /**\n * Set the background color of the waveform container.\n *\n * @param {string} color A CSS color string.\n * @example wavesurfer.setBackgroundColor('#FF00FF');\n */\n setBackgroundColor(color) {\n this.params.backgroundColor = color;\n util.style(this.container, { background: this.params.backgroundColor });\n }\n\n /**\n * Get the fill color of the cursor indicating the playhead\n * position.\n *\n * @return {string} A CSS color string.\n */\n getCursorColor() {\n return this.params.cursorColor;\n }\n\n /**\n * Set the fill color of the cursor indicating the playhead\n * position.\n *\n * @param {string} color A CSS color string.\n * @example wavesurfer.setCursorColor('#222');\n */\n setCursorColor(color) {\n this.params.cursorColor = color;\n this.drawer.updateCursor();\n }\n\n /**\n * Get the height of the waveform.\n *\n * @return {number} Height measured in pixels.\n */\n getHeight() {\n return this.params.height;\n }\n\n /**\n * Set the height of the waveform.\n *\n * @param {number} height Height measured in pixels.\n * @example wavesurfer.setHeight(200);\n */\n setHeight(height) {\n this.params.height = height;\n this.drawer.setHeight(height * this.params.pixelRatio);\n this.drawBuffer();\n }\n\n /**\n * Hide channels from being drawn on the waveform if splitting channels.\n *\n * For example, if we want to draw only the peaks for the right stereo channel:\n *\n * const wavesurfer = new WaveSurfer.create({...splitChannels: true});\n * wavesurfer.load('stereo_audio.mp3');\n *\n * wavesurfer.setFilteredChannel([0]); <-- hide left channel peaks.\n *\n * @param {array} channelIndices Channels to be filtered out from drawing.\n * @version 4.0.0\n */\n setFilteredChannels(channelIndices) {\n this.params.splitChannelsOptions.filterChannels = channelIndices;\n this.drawBuffer();\n }\n\n /**\n * Get the correct peaks for current wave view-port and render wave\n *\n * @private\n * @emits WaveSurfer#redraw\n */\n drawBuffer() {\n const nominalWidth = Math.round(\n this.getDuration() *\n this.params.minPxPerSec *\n this.params.pixelRatio\n );\n const parentWidth = this.drawer.getWidth();\n let width = nominalWidth;\n // always start at 0 after zooming for scrolling : issue redraw left part\n let start = 0;\n let end = Math.max(start + parentWidth, width);\n // Fill container\n if (\n this.params.fillParent &&\n (!this.params.scrollParent || nominalWidth < parentWidth)\n ) {\n width = parentWidth;\n start = 0;\n end = width;\n }\n\n let peaks;\n if (this.params.partialRender) {\n const newRanges = this.peakCache.addRangeToPeakCache(\n width,\n start,\n end\n );\n let i;\n for (i = 0; i < newRanges.length; i++) {\n peaks = this.backend.getPeaks(\n width,\n newRanges[i][0],\n newRanges[i][1]\n );\n this.drawer.drawPeaks(\n peaks,\n width,\n newRanges[i][0],\n newRanges[i][1]\n );\n }\n } else {\n peaks = this.backend.getPeaks(width, start, end);\n this.drawer.drawPeaks(peaks, width, start, end);\n }\n this.fireEvent('redraw', peaks, width);\n }\n\n /**\n * Horizontally zooms the waveform in and out. It also changes the parameter\n * `minPxPerSec` and enables the `scrollParent` option. Calling the function\n * with a falsey parameter will reset the zoom state.\n *\n * @param {?number} pxPerSec Number of horizontal pixels per second of\n * audio, if none is set the waveform returns to unzoomed state\n * @emits WaveSurfer#zoom\n * @example wavesurfer.zoom(20);\n */\n zoom(pxPerSec) {\n if (!pxPerSec) {\n this.params.minPxPerSec = this.defaultParams.minPxPerSec;\n this.params.scrollParent = false;\n } else {\n this.params.minPxPerSec = pxPerSec;\n this.params.scrollParent = true;\n }\n\n this.drawBuffer();\n this.drawer.progress(this.backend.getPlayedPercents());\n\n this.drawer.recenter(this.getCurrentTime() / this.getDuration());\n this.fireEvent('zoom', pxPerSec);\n }\n\n /**\n * Decode buffer and load\n *\n * @private\n * @param {ArrayBuffer} arraybuffer Buffer to process\n */\n loadArrayBuffer(arraybuffer) {\n this.decodeArrayBuffer(arraybuffer, data => {\n if (!this.isDestroyed) {\n this.loadDecodedBuffer(data);\n }\n });\n }\n\n /**\n * Directly load an externally decoded AudioBuffer\n *\n * @private\n * @param {AudioBuffer} buffer Buffer to process\n * @emits WaveSurfer#ready\n */\n loadDecodedBuffer(buffer) {\n this.backend.load(buffer);\n this.drawBuffer();\n this.isReady = true;\n this.fireEvent('ready');\n }\n\n /**\n * Loads audio data from a Blob or File object\n *\n * @param {Blob|File} blob Audio data\n * @example\n */\n loadBlob(blob) {\n // Create file reader\n const reader = new FileReader();\n reader.addEventListener('progress', e => this.onProgress(e));\n reader.addEventListener('load', e =>\n this.loadArrayBuffer(e.target.result)\n );\n reader.addEventListener('error', () =>\n this.fireEvent('error', 'Error reading file')\n );\n reader.readAsArrayBuffer(blob);\n this.empty();\n }\n\n /**\n * Loads audio and re-renders the waveform.\n *\n * @param {string|HTMLMediaElement} url The url of the audio file or the\n * audio element with the audio\n * @param {number[]|Number.<Array[]>} peaks Wavesurfer does not have to decode\n * the audio to render the waveform if this is specified\n * @param {?string} preload (Use with backend `MediaElement` and `MediaElementWebAudio`)\n * `'none'|'metadata'|'auto'` Preload attribute for the media element\n * @param {?number} duration The duration of the audio. This is used to\n * render the peaks data in the correct size for the audio duration (as\n * befits the current `minPxPerSec` and zoom value) without having to decode\n * the audio.\n * @returns {void}\n * @throws Will throw an error if the `url` argument is empty.\n * @example\n * // uses fetch or media element to load file (depending on backend)\n * wavesurfer.load('http://example.com/demo.wav');\n *\n * // setting preload attribute with media element backend and supplying\n * // peaks\n * wavesurfer.load(\n * 'http://example.com/demo.wav',\n * [0.0218, 0.0183, 0.0165, 0.0198, 0.2137, 0.2888],\n * true\n * );\n */\n load(url, peaks, preload, duration) {\n if (!url) {\n throw new Error('url parameter cannot be empty');\n }\n this.empty();\n if (preload) {\n // check whether the preload attribute will be usable and if not log\n // a warning listing the reasons why not and nullify the variable\n const preloadIgnoreReasons = {\n \"Preload is not 'auto', 'none' or 'metadata'\":\n ['auto', 'metadata', 'none'].indexOf(preload) === -1,\n 'Peaks are not provided': !peaks,\n \"Backend is not of type 'MediaElement' or 'MediaElementWebAudio'\":\n ['MediaElement', 'MediaElementWebAudio'].indexOf(\n this.params.backend\n ) === -1,\n 'Url is not of type string': typeof url !== 'string'\n };\n const activeReasons = Object.keys(preloadIgnoreReasons).filter(\n reason => preloadIgnoreReasons[reason]\n );\n if (activeReasons.length) {\n // eslint-disable-next-line no-console\n console.warn(\n 'Preload parameter of wavesurfer.load will be ignored because:\\n\\t- ' +\n activeReasons.join('\\n\\t- ')\n );\n // stop invalid values from being used\n preload = null;\n }\n }\n\n // loadBuffer(url, peaks, duration) requires that url is a string\n // but users can pass in a HTMLMediaElement to WaveSurfer\n if (this.params.backend === 'WebAudio' && url instanceof HTMLMediaElement) {\n url = url.src;\n }\n\n switch (this.params.backend) {\n case 'WebAudio':\n return this.loadBuffer(url, peaks, duration);\n case 'MediaElement':\n case 'MediaElementWebAudio':\n return this.loadMediaElement(url, peaks, preload, duration);\n }\n }\n\n /**\n * Loads audio using Web Audio buffer backend.\n *\n * @private\n * @emits WaveSurfer#waveform-ready\n * @param {string} url URL of audio file\n * @param {number[]|Number.<Array[]>} peaks Peaks data\n * @param {?number} duration Optional duration of audio file\n * @returns {void}\n */\n loadBuffer(url, peaks, duration) {\n const load = action => {\n if (action) {\n this.tmpEvents.push(this.once('ready', action));\n }\n return this.getArrayBuffer(url, data => this.loadArrayBuffer(data));\n };\n\n if (peaks) {\n this.backend.setPeaks(peaks, duration);\n this.drawBuffer();\n this.fireEvent('waveform-ready');\n this.tmpEvents.push(this.once('interaction', load));\n } else {\n return load();\n }\n }\n\n /**\n * Either create a media element, or load an existing media element.\n *\n * @private\n * @emits WaveSurfer#waveform-ready\n * @param {string|HTMLMediaElement} urlOrElt Either a path to a media file, or an\n * existing HTML5 Audio/Video Element\n * @param {number[]|Number.<Array[]>} peaks Array of peaks. Required to bypass web audio\n * dependency\n * @param {?boolean} preload Set to true if the preload attribute of the\n * audio element should be enabled\n * @param {?number} duration Optional duration of audio file\n */\n loadMediaElement(urlOrElt, peaks, preload, duration) {\n let url = urlOrElt;\n\n if (typeof urlOrElt === 'string') {\n this.backend.load(url, this.mediaContainer, peaks, preload);\n } else {\n const elt = urlOrElt;\n this.backend.loadElt(elt, peaks);\n\n // If peaks are not provided,\n // url = element.src so we can get peaks with web audio\n url = elt.src;\n }\n\n this.tmpEvents.push(\n this.backend.once('canplay', () => {\n // ignore when backend was already destroyed\n if (!this.backend.destroyed) {\n this.drawBuffer();\n this.isReady = true;\n this.fireEvent('ready');\n }\n }),\n this.backend.once('error', err => this.fireEvent('error', err))\n );\n\n // If peaks are provided, render them and fire the `waveform-ready` event.\n if (peaks) {\n this.backend.setPeaks(peaks, duration);\n this.drawBuffer();\n this.fireEvent('waveform-ready');\n }\n\n // If no pre-decoded peaks are provided, or are provided with\n // forceDecode flag, attempt to download the audio file and decode it\n // with Web Audio.\n if (\n (!peaks || this.params.forceDecode) &&\n this.backend.supportsWebAudio()\n ) {\n this.getArrayBuffer(url, arraybuffer => {\n this.decodeArrayBuffer(arraybuffer, buffer => {\n this.backend.buffer = buffer;\n this.backend.setPeaks(null);\n this.drawBuffer();\n this.fireEvent('waveform-ready');\n });\n });\n }\n }\n\n /**\n * Decode an array buffer and pass data to a callback\n *\n * @private\n * @param {Object} arraybuffer The array buffer to decode\n * @param {function} callback The function to call on complete\n */\n decodeArrayBuffer(arraybuffer, callback) {\n this.arraybuffer = arraybuffer;\n this.backend.decodeArrayBuffer(\n arraybuffer,\n data => {\n // Only use the decoded data if we haven't been destroyed or\n // another decode started in the meantime\n if (!this.isDestroyed && this.arraybuffer == arraybuffer) {\n callback(data);\n this.arraybuffer = null;\n }\n },\n () => this.fireEvent('error', 'Error decoding audiobuffer')\n );\n }\n\n /**\n * Load an array buffer using fetch and pass the result to a callback\n *\n * @param {string} url The URL of the file object\n * @param {function} callback The function to call on complete\n * @returns {util.fetchFile} fetch call\n * @private\n */\n getArrayBuffer(url, callback) {\n let options = Object.assign(\n {\n url: url,\n responseType: 'arraybuffer'\n },\n this.params.xhr\n );\n const request = util.fetchFile(options);\n\n this.currentRequest = request;\n\n this.tmpEvents.push(\n request.on('progress', e => {\n this.onProgress(e);\n }),\n request.on('success', data => {\n callback(data);\n this.currentRequest = null;\n }),\n request.on('error', e => {\n this.fireEvent('error', e);\n this.currentRequest = null;\n })\n );\n\n return request;\n }\n\n /**\n * Called while the audio file is loading\n *\n * @private\n * @param {Event} e Progress event\n * @emits WaveSurfer#loading\n */\n onProgress(e) {\n let percentComplete;\n if (e.lengthComputable) {\n percentComplete = e.loaded / e.total;\n } else {\n // Approximate progress with an asymptotic\n // function, and assume downloads in the 1-3 MB range.\n percentComplete = e.loaded / (e.loaded + 1000000);\n }\n this.fireEvent('loading', Math.round(percentComplete * 100), e.target);\n }\n\n /**\n * Exports PCM data into a JSON array and optionally opens in a new window\n * as valid JSON Blob instance.\n *\n * @param {number} length=1024 The scale in which to export the peaks\n * @param {number} accuracy=10000\n * @param {?boolean} noWindow Set to true to disable opening a new\n * window with the JSON\n * @param {number} start Start index\n * @param {number} end End index\n * @return {Promise} Promise that resolves with array of peaks\n */\n exportPCM(length, accuracy, noWindow, start, end) {\n length = length || 1024;\n start = start || 0;\n accuracy = accuracy || 10000;\n noWindow = noWindow || false;\n const peaks = this.backend.getPeaks(length, start, end);\n const arr = [].map.call(\n peaks,\n val => Math.round(val * accuracy) / accuracy\n );\n\n return new Promise((resolve, reject) => {\n if (!noWindow){\n const blobJSON = new Blob(\n [JSON.stringify(arr)],\n {type: 'application/json;charset=utf-8'}\n );\n const objURL = URL.createObjectURL(blobJSON);\n window.open(objURL);\n URL.revokeObjectURL(objURL);\n }\n resolve(arr);\n });\n }\n\n /**\n * Save waveform image as data URI.\n *\n * The default format is `'image/png'`. Other supported types are\n * `'image/jpeg'` and `'image/webp'`.\n *\n * @param {string} format='image/png' A string indicating the image format.\n * The default format type is `'image/png'`.\n * @param {number} quality=1 A number between 0 and 1 indicating the image\n * quality to use for image formats that use lossy compression such as\n * `'image/jpeg'`` and `'image/webp'`.\n * @param {string} type Image data type to return. Either 'dataURL' (default)\n * or 'blob'.\n * @return {string|string[]|Promise} When using `'dataURL'` type this returns\n * a single data URL or an array of data URLs, one for each canvas. When using\n * `'blob'` type this returns a `Promise` resolving with an array of `Blob`\n * instances, one for each canvas.\n */\n exportImage(format, quality, type) {\n if (!format) {\n format = 'image/png';\n }\n if (!quality) {\n quality = 1;\n }\n if (!type) {\n type = 'dataURL';\n }\n\n return this.drawer.getImage(format, quality, type);\n }\n\n /**\n * Cancel any fetch request currently in progress\n */\n cancelAjax() {\n if (this.currentRequest && this.currentRequest.controller) {\n // If the current request has a ProgressHandler, then its ReadableStream might need to be cancelled too\n // See: Wavesurfer issue #2042\n // See Firefox bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\n if (this.currentRequest._reader) {\n // Ignoring exceptions thrown by call to cancel()\n this.currentRequest._reader.cancel().catch(err => {});\n }\n\n this.currentRequest.controller.abort();\n this.currentRequest = null;\n }\n }\n\n /**\n * @private\n */\n clearTmpEvents() {\n this.tmpEvents.forEach(e => e.un());\n }\n\n /**\n * Display empty waveform.\n */\n empty() {\n if (!this.backend.isPaused()) {\n this.stop();\n this.backend.disconnectSource();\n }\n this.isReady = false;\n this.cancelAjax();\n this.clearTmpEvents();\n\n // empty drawer\n this.drawer.progress(0);\n this.drawer.setWidth(0);\n this.drawer.drawPeaks({ length: this.drawer.getWidth() }, 0);\n }\n\n /**\n * Remove events, elements and disconnect WebAudio nodes.\n *\n * @emits WaveSurfer#destroy\n */\n destroy() {\n this.destroyAllPlugins();\n this.fireEvent('destroy');\n this.cancelAjax();\n this.clearTmpEvents();\n this.unAll();\n if (this.params.responsive !== false) {\n window.removeEventListener('resize', this._onResize, true);\n window.removeEventListener(\n 'orientationchange',\n this._onResize,\n true\n );\n }\n if (this.backend) {\n this.backend.destroy();\n // clears memory usage\n this.backend = null;\n }\n if (this.drawer) {\n this.drawer.destroy();\n }\n this.isDestroyed = true;\n this.isReady = false;\n this.arraybuffer = null;\n }\n}\n","import * as util from './util';\n\n// using constants to prevent someone writing the string wrong\nconst PLAYING = 'playing';\nconst PAUSED = 'paused';\nconst FINISHED = 'finished';\n\n/**\n * WebAudio backend\n *\n * @extends {Observer}\n */\nexport default class WebAudio extends util.Observer {\n /** scriptBufferSize: size of the processing buffer */\n static scriptBufferSize = 256;\n /** audioContext: allows to process audio with WebAudio API */\n audioContext = null;\n /** @private */\n offlineAudioContext = null;\n /** @private */\n stateBehaviors = {\n [PLAYING]: {\n init() {\n this.addOnAudioProcess();\n },\n getPlayedPercents() {\n const duration = this.getDuration();\n return this.getCurrentTime() / duration || 0;\n },\n getCurrentTime() {\n return this.startPosition + this.getPlayedTime();\n }\n },\n [PAUSED]: {\n init() {\n this.removeOnAudioProcess();\n },\n getPlayedPercents() {\n const duration = this.getDuration();\n return this.getCurrentTime() / duration || 0;\n },\n getCurrentTime() {\n return this.startPosition;\n }\n },\n [FINISHED]: {\n init() {\n this.removeOnAudioProcess();\n this.fireEvent('finish');\n },\n getPlayedPercents() {\n return 1;\n },\n getCurrentTime() {\n return this.getDuration();\n }\n }\n };\n\n /**\n * Does the browser support this backend\n *\n * @return {boolean} Whether or not this browser supports this backend\n */\n supportsWebAudio() {\n return !!(window.AudioContext || window.webkitAudioContext);\n }\n\n /**\n * Get the audio context used by this backend or create one\n *\n * @return {AudioContext} Existing audio context, or creates a new one\n */\n getAudioContext() {\n if (!window.WaveSurferAudioContext) {\n window.WaveSurferAudioContext = new (window.AudioContext ||\n window.webkitAudioContext)();\n }\n return window.WaveSurferAudioContext;\n }\n\n /**\n * Get the offline audio context used by this backend or create one\n *\n * @param {number} sampleRate The sample rate to use\n * @return {OfflineAudioContext} Existing offline audio context, or creates\n * a new one\n */\n getOfflineAudioContext(sampleRate) {\n if (!window.WaveSurferOfflineAudioContext) {\n window.WaveSurferOfflineAudioContext = new (window.OfflineAudioContext ||\n window.webkitOfflineAudioContext)(1, 2, sampleRate);\n }\n return window.WaveSurferOfflineAudioContext;\n }\n\n /**\n * Construct the backend\n *\n * @param {WavesurferParams} params Wavesurfer parameters\n */\n constructor(params) {\n super();\n /** @private */\n this.params = params;\n /** ac: Audio Context instance */\n this.ac =\n params.audioContext ||\n (this.supportsWebAudio() ? this.getAudioContext() : {});\n /**@private */\n this.lastPlay = this.ac.currentTime;\n /** @private */\n this.startPosition = 0;\n /** @private */\n this.scheduledPause = null;\n /** @private */\n this.states = {\n [PLAYING]: Object.create(this.stateBehaviors[PLAYING]),\n [PAUSED]: Object.create(this.stateBehaviors[PAUSED]),\n [FINISHED]: Object.create(this.stateBehaviors[FINISHED])\n };\n /** @private */\n this.buffer = null;\n /** @private */\n this.filters = [];\n /** gainNode: allows to control audio volume */\n this.gainNode = null;\n /** @private */\n this.mergedPeaks = null;\n /** @private */\n this.offlineAc = null;\n /** @private */\n this.peaks = null;\n /** @private */\n this.playbackRate = 1;\n /** analyser: provides audio analysis information */\n this.analyser = null;\n /** scriptNode: allows processing audio */\n this.scriptNode = null;\n /** @private */\n this.source = null;\n /** @private */\n this.splitPeaks = [];\n /** @private */\n this.state = null;\n /** @private */\n this.explicitDuration = params.duration;\n /**\n * Boolean indicating if the backend was destroyed.\n */\n this.destroyed = false;\n }\n\n /**\n * Initialise the backend, called in `wavesurfer.createBackend()`\n */\n init() {\n this.createVolumeNode();\n this.createScriptNode();\n this.createAnalyserNode();\n\n this.setState(PAUSED);\n this.setPlaybackRate(this.params.audioRate);\n this.setLength(0);\n }\n\n /** @private */\n disconnectFilters() {\n if (this.filters) {\n this.filters.forEach(filter => {\n filter && filter.disconnect();\n });\n this.filters = null;\n // Reconnect direct path\n this.analyser.connect(this.gainNode);\n }\n }\n\n /**\n * @private\n *\n * @param {string} state The new state\n */\n setState(state) {\n if (this.state !== this.states[state]) {\n this.state = this.states[state];\n this.state.init.call(this);\n }\n }\n\n /**\n * Unpacked `setFilters()`\n *\n * @param {...AudioNode} filters One or more filters to set\n */\n setFilter(...filters) {\n this.setFilters(filters);\n }\n\n /**\n * Insert custom Web Audio nodes into the graph\n *\n * @param {AudioNode[]} filters Packed filters array\n * @example\n * const lowpass = wavesurfer.backend.ac.createBiquadFilter();\n * wavesurfer.backend.setFilter(lowpass);\n */\n setFilters(filters) {\n // Remove existing filters\n this.disconnectFilters();\n\n // Insert filters if filter array not empty\n if (filters && filters.length) {\n this.filters = filters;\n\n // Disconnect direct path before inserting filters\n this.analyser.disconnect();\n\n // Connect each filter in turn\n filters\n .reduce((prev, curr) => {\n prev.connect(curr);\n return curr;\n }, this.analyser)\n .connect(this.gainNode);\n }\n }\n /** Create ScriptProcessorNode to process audio */\n createScriptNode() {\n if (this.params.audioScriptProcessor) {\n this.scriptNode = this.params.audioScriptProcessor;\n } else {\n if (this.ac.createScriptProcessor) {\n this.scriptNode = this.ac.createScriptProcessor(\n WebAudio.scriptBufferSize\n );\n } else {\n this.scriptNode = this.ac.createJavaScriptNode(\n WebAudio.scriptBufferSize\n );\n }\n }\n this.scriptNode.connect(this.ac.destination);\n }\n\n /** @private */\n addOnAudioProcess() {\n this.scriptNode.onaudioprocess = () => {\n const time = this.getCurrentTime();\n\n if (time >= this.getDuration()) {\n this.setState(FINISHED);\n this.fireEvent('pause');\n } else if (time >= this.scheduledPause) {\n this.pause();\n } else if (this.state === this.states[PLAYING]) {\n this.fireEvent('audioprocess', time);\n }\n };\n }\n\n /** @private */\n removeOnAudioProcess() {\n this.scriptNode.onaudioprocess = null;\n }\n /** Create analyser node to perform audio analysis */\n createAnalyserNode() {\n this.analyser = this.ac.createAnalyser();\n this.analyser.connect(this.gainNode);\n }\n\n /**\n * Create the gain node needed to control the playback volume.\n *\n */\n createVolumeNode() {\n // Create gain node using the AudioContext\n if (this.ac.createGain) {\n this.gainNode = this.ac.createGain();\n } else {\n this.gainNode = this.ac.createGainNode();\n }\n // Add the gain node to the graph\n this.gainNode.connect(this.ac.destination);\n }\n\n /**\n * Set the sink id for the media player\n *\n * @param {string} deviceId String value representing audio device id.\n * @returns {Promise} A Promise that resolves to `undefined` when there\n * are no errors.\n */\n setSinkId(deviceId) {\n if (deviceId) {\n /**\n * The webaudio API doesn't currently support setting the device\n * output. Here we create an HTMLAudioElement, connect the\n * webaudio stream to that element and setSinkId there.\n */\n let audio = new window.Audio();\n if (!audio.setSinkId) {\n return Promise.reject(\n new Error('setSinkId is not supported in your browser')\n );\n }\n audio.autoplay = true;\n const dest = this.ac.createMediaStreamDestination();\n this.gainNode.disconnect();\n this.gainNode.connect(dest);\n audio.srcObject = dest.stream;\n\n return audio.setSinkId(deviceId);\n } else {\n return Promise.reject(new Error('Invalid deviceId: ' + deviceId));\n }\n }\n\n /**\n * Set the audio volume\n *\n * @param {number} value A floating point value between 0 and 1.\n */\n setVolume(value) {\n this.gainNode.gain.setValueAtTime(value, this.ac.currentTime);\n }\n\n /**\n * Get the current volume\n *\n * @return {number} value A floating point value between 0 and 1.\n */\n getVolume() {\n return this.gainNode.gain.value;\n }\n\n /**\n * Decode an array buffer and pass data to a callback\n *\n * @private\n * @param {ArrayBuffer} arraybuffer The array buffer to decode\n * @param {function} callback The function to call on complete.\n * @param {function} errback The function to call on error.\n */\n decodeArrayBuffer(arraybuffer, callback, errback) {\n if (!this.offlineAc) {\n this.offlineAc = this.getOfflineAudioContext(\n this.ac && this.ac.sampleRate ? this.ac.sampleRate : 44100\n );\n }\n if ('webkitAudioContext' in window) {\n // Safari: no support for Promise-based decodeAudioData enabled\n // Enable it in Safari using the Experimental Features > Modern WebAudio API option\n this.offlineAc.decodeAudioData(\n arraybuffer,\n data => callback(data),\n errback\n );\n } else {\n this.offlineAc.decodeAudioData(arraybuffer).then(\n (data) => callback(data)\n ).catch(\n (err) => errback(err)\n );\n }\n }\n\n /**\n * Set pre-decoded peaks\n *\n * @param {number[]|Number.<Array[]>} peaks Peaks data\n * @param {?number} duration Explicit duration\n */\n setPeaks(peaks, duration) {\n if (duration != null) {\n this.explicitDuration = duration;\n }\n this.peaks = peaks;\n }\n\n /**\n * Set the rendered length (different from the length of the audio)\n *\n * @param {number} length The rendered length\n */\n setLength(length) {\n // No resize, we can preserve the cached peaks.\n if (this.mergedPeaks && length == 2 * this.mergedPeaks.length - 1 + 2) {\n return;\n }\n\n this.splitPeaks = [];\n this.mergedPeaks = [];\n // Set the last element of the sparse array so the peak arrays are\n // appropriately sized for other calculations.\n const channels = this.buffer ? this.buffer.numberOfChannels : 1;\n let c;\n for (c = 0; c < channels; c++) {\n this.splitPeaks[c] = [];\n this.splitPeaks[c][2 * (length - 1)] = 0;\n this.splitPeaks[c][2 * (length - 1) + 1] = 0;\n }\n this.mergedPeaks[2 * (length - 1)] = 0;\n this.mergedPeaks[2 * (length - 1) + 1] = 0;\n }\n\n /**\n * Compute the max and min value of the waveform when broken into <length> subranges.\n *\n * @param {number} length How many subranges to break the waveform into.\n * @param {number} first First sample in the required range.\n * @param {number} last Last sample in the required range.\n * @return {number[]|Number.<Array[]>} Array of 2*<length> peaks or array of arrays of\n * peaks consisting of (max, min) values for each subrange.\n */\n getPeaks(length, first, last) {\n if (this.peaks) {\n return this.peaks;\n }\n if (!this.buffer) {\n return [];\n }\n\n first = first || 0;\n last = last || length - 1;\n\n this.setLength(length);\n\n if (!this.buffer) {\n return this.params.splitChannels\n ? this.splitPeaks\n : this.mergedPeaks;\n }\n\n /**\n * The following snippet fixes a buffering data issue on the Safari\n * browser which returned undefined It creates the missing buffer based\n * on 1 channel, 4096 samples and the sampleRate from the current\n * webaudio context 4096 samples seemed to be the best fit for rendering\n * will review this code once a stable version of Safari TP is out\n */\n if (!this.buffer.length) {\n const newBuffer = this.createBuffer(1, 4096, this.sampleRate);\n this.buffer = newBuffer.buffer;\n }\n\n const sampleSize = this.buffer.length / length;\n const sampleStep = ~~(sampleSize / 10) || 1;\n const channels = this.buffer.numberOfChannels;\n let c;\n\n for (c = 0; c < channels; c++) {\n const peaks = this.splitPeaks[c];\n const chan = this.buffer.getChannelData(c);\n let i;\n\n for (i = first; i <= last; i++) {\n const start = ~~(i * sampleSize);\n const end = ~~(start + sampleSize);\n /**\n * Initialize the max and min to the first sample of this\n * subrange, so that even if the samples are entirely\n * on one side of zero, we still return the true max and\n * min values in the subrange.\n */\n let min = chan[start];\n let max = min;\n let j;\n\n for (j = start; j < end; j += sampleStep) {\n const value = chan[j];\n\n if (value > max) {\n max = value;\n }\n\n if (value < min) {\n min = value;\n }\n }\n\n peaks[2 * i] = max;\n peaks[2 * i + 1] = min;\n\n if (c == 0 || max > this.mergedPeaks[2 * i]) {\n this.mergedPeaks[2 * i] = max;\n }\n\n if (c == 0 || min < this.mergedPeaks[2 * i + 1]) {\n this.mergedPeaks[2 * i + 1] = min;\n }\n }\n }\n\n return this.params.splitChannels ? this.splitPeaks : this.mergedPeaks;\n }\n\n /**\n * Get the position from 0 to 1\n *\n * @return {number} Position\n */\n getPlayedPercents() {\n return this.state.getPlayedPercents.call(this);\n }\n\n /** @private */\n disconnectSource() {\n if (this.source) {\n this.source.disconnect();\n }\n }\n /**\n * Destroy all references with WebAudio, disconnecting audio nodes and closing Audio Context\n */\n destroyWebAudio() {\n this.disconnectFilters();\n this.disconnectSource();\n this.gainNode.disconnect();\n this.scriptNode.disconnect();\n this.analyser.disconnect();\n\n // close the audioContext if closeAudioContext option is set to true\n if (this.params.closeAudioContext) {\n // check if browser supports AudioContext.close()\n if (\n typeof this.ac.close === 'function' &&\n this.ac.state != 'closed'\n ) {\n this.ac.close();\n }\n // clear the reference to the audiocontext\n this.ac = null;\n // clear the actual audiocontext, either passed as param or the\n // global singleton\n if (!this.params.audioContext) {\n window.WaveSurferAudioContext = null;\n } else {\n this.params.audioContext = null;\n }\n // clear the offlineAudioContext\n window.WaveSurferOfflineAudioContext = null;\n }\n }\n /**\n * This is called when wavesurfer is destroyed\n */\n destroy() {\n if (!this.isPaused()) {\n this.pause();\n }\n this.unAll();\n this.buffer = null;\n this.destroyed = true;\n\n this.destroyWebAudio();\n }\n\n /**\n * Loaded a decoded audio buffer\n *\n * @param {Object} buffer Decoded audio buffer to load\n */\n load(buffer) {\n this.startPosition = 0;\n this.lastPlay = this.ac.currentTime;\n this.buffer = buffer;\n this.createSource();\n }\n\n /** @private */\n createSource() {\n this.disconnectSource();\n this.source = this.ac.createBufferSource();\n\n // adjust for old browsers\n this.source.start = this.source.start || this.source.noteGrainOn;\n this.source.stop = this.source.stop || this.source.noteOff;\n\n this.setPlaybackRate(this.playbackRate);\n this.source.buffer = this.buffer;\n this.source.connect(this.analyser);\n }\n\n /**\n * @private\n *\n * some browsers require an explicit call to #resume before they will play back audio\n */\n resumeAudioContext() {\n if (this.ac.state == 'suspended') {\n this.ac.resume && this.ac.resume();\n }\n }\n\n /**\n * Used by `wavesurfer.isPlaying()` and `wavesurfer.playPause()`\n *\n * @return {boolean} Whether or not this backend is currently paused\n */\n isPaused() {\n return this.state !== this.states[PLAYING];\n }\n\n /**\n * Used by `wavesurfer.getDuration()`\n *\n * @return {number} Duration of loaded buffer\n */\n getDuration() {\n if (this.explicitDuration) {\n return this.explicitDuration;\n }\n if (!this.buffer) {\n return 0;\n }\n return this.buffer.duration;\n }\n\n /**\n * Used by `wavesurfer.seekTo()`\n *\n * @param {number} start Position to start at in seconds\n * @param {number} end Position to end at in seconds\n * @return {{start: number, end: number}} Object containing start and end\n * positions\n */\n seekTo(start, end) {\n if (!this.buffer) {\n return;\n }\n\n this.scheduledPause = null;\n\n if (start == null) {\n start = this.getCurrentTime();\n if (start >= this.getDuration()) {\n start = 0;\n }\n }\n if (end == null) {\n end = this.getDuration();\n }\n\n this.startPosition = start;\n this.lastPlay = this.ac.currentTime;\n\n if (this.state === this.states[FINISHED]) {\n this.setState(PAUSED);\n }\n\n return {\n start: start,\n end: end\n };\n }\n\n /**\n * Get the playback position in seconds\n *\n * @return {number} The playback position in seconds\n */\n getPlayedTime() {\n return (this.ac.currentTime - this.lastPlay) * this.playbackRate;\n }\n\n /**\n * Plays the loaded audio region.\n *\n * @param {number} start Start offset in seconds, relative to the beginning\n * of a clip.\n * @param {number} end When to stop relative to the beginning of a clip.\n */\n play(start, end) {\n if (!this.buffer) {\n return;\n }\n\n // need to re-create source on each playback\n this.createSource();\n\n const adjustedTime = this.seekTo(start, end);\n\n start = adjustedTime.start;\n end = adjustedTime.end;\n\n this.scheduledPause = end;\n\n this.source.start(0, start);\n\n this.resumeAudioContext();\n\n this.setState(PLAYING);\n\n this.fireEvent('play');\n }\n\n /**\n * Pauses the loaded audio.\n */\n pause() {\n this.scheduledPause = null;\n\n this.startPosition += this.getPlayedTime();\n this.source && this.source.stop(0);\n\n this.setState(PAUSED);\n\n this.fireEvent('pause');\n }\n\n /**\n * Returns the current time in seconds relative to the audio-clip's\n * duration.\n *\n * @return {number} The current time in seconds\n */\n getCurrentTime() {\n return this.state.getCurrentTime.call(this);\n }\n\n /**\n * Returns the current playback rate. (0=no playback, 1=normal playback)\n *\n * @return {number} The current playback rate\n */\n getPlaybackRate() {\n return this.playbackRate;\n }\n\n /**\n * Set the audio source playback rate.\n *\n * @param {number} value The playback rate to use\n */\n setPlaybackRate(value) {\n this.playbackRate = value || 1;\n this.source && this.source.playbackRate.setValueAtTime(\n this.playbackRate,\n this.ac.currentTime\n );\n }\n\n /**\n * Set a point in seconds for playback to stop at.\n *\n * @param {number} end Position to end at\n * @version 3.3.0\n */\n setPlayEnd(end) {\n this.scheduledPause = end;\n }\n}\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n var timeout, args, context, timestamp, result;\n if (null == wait) wait = 100;\n\n function later() {\n var last = Date.now() - timestamp;\n\n if (last < wait && last >= 0) {\n timeout = setTimeout(later, wait - last);\n } else {\n timeout = null;\n if (!immediate) {\n result = func.apply(context, args);\n context = args = null;\n }\n }\n };\n\n var debounced = function(){\n context = this;\n args = arguments;\n timestamp = Date.now();\n var callNow = immediate && !timeout;\n if (!timeout) timeout = setTimeout(later, wait);\n if (callNow) {\n result = func.apply(context, args);\n context = args = null;\n }\n\n return result;\n };\n\n debounced.clear = function() {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n };\n \n debounced.flush = function() {\n if (timeout) {\n result = func.apply(context, args);\n context = args = null;\n \n clearTimeout(timeout);\n timeout = null;\n }\n };\n\n return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\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/wavesurfer.js\");\n",""],"names":["CanvasEntry","wave","waveCtx","progress","progressCtx","start","end","id","constructor","name","toLowerCase","canvasContextAttributes","element","getContext","elementWidth","totalWidth","width","height","offsetLeft","elementSize","hasProgressCanvas","clearRect","canvas","waveColor","progressColor","fillStyle","vertical","setTransform","x","y","radius","fillRectToContext","ctx","drawRoundedRect","fillRect","beginPath","moveTo","lineTo","quadraticCurveTo","closePath","fill","peaks","absmax","halfH","offsetY","drawLineToContext","length","first","Math","round","last","canvasStart","canvasEnd","scale","halfOffset","absmaxHalf","i","peak","h","halfPixel","j","format","quality","type","Promise","resolve","toBlob","toDataURL","Drawer","container","params","util","withOrientation","pixelRatio","lastPos","wrapper","el","styles","style","appendChild","document","createElement","display","position","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","hideScrollbar","overflowY","setupWrapperEvents","e","noPrevent","preventDefault","clientX","targetTouches","bbox","getBoundingClientRect","nominalWidth","parentWidth","getWidth","progressPixels","getProgressPixels","scrollLeft","scrollWidth","clamp","wrapperBbox","rtl","right","left","addEventListener","orientedEvent","scrollbarHeight","offsetHeight","clientHeight","clientY","bottom","interact","fireEvent","handleEvent","setWidth","clearWave","barWidth","drawBars","drawWave","percent","recenterOnPosition","immediate","half","clientWidth","maxScroll","target","offset","rate","autoCenterRate","max","min","newWidth","updateSize","minPxDelta","pos","autoCenter","newPos","autoCenterImmediately","updateProgress","unAll","parentNode","domElement","removeChild","channelIndex","Observer","MultiCanvas","maxCanvasWidth","maxCanvasElementWidth","canvases","progressWave","EntryClass","drawingContextAttributes","overlap","ceil","barRadius","createWrapper","createElements","zIndex","top","overflow","boxSizing","borderRightStyle","pointerEvents","addCanvas","updateCursor","borderRightWidth","cursorWidth","borderRightColor","cursorColor","requiredCanvases","removeCanvas","canvasWidth","lastCanvas","forEach","entry","updateDimensions","leftOffset","initWave","initProgress","push","lastEntry","parentElement","destroy","pop","frame","prepareDraw","hasMinVals","ch","undefined","peakIndexScale","bar","gap","barGap","step","floor","barMinHeight","reflectedPeaks","len","drawLine","splitChannelsOptions","channelColors","setFillStyles","applyCanvasTransforms","drawLines","startCanvas","endCanvas","intersection","x1","y1","x2","y2","fillRects","splitChannels","filterChannels","includes","fn","drawIndex","normalizedMax","Array","channels","filteredChannels","filter","c","hideChannel","overlay","setHeight","overallAbsMax","relativeNormalization","map","channelPeaks","absMax","indexOf","barHeight","normalize","some","call","val","all","getImage","images","MediaElementWebAudio","sourceMediaElement","setPlaybackRate","audioRate","createTimer","createVolumeNode","createScriptNode","createAnalyserNode","media","preload","createMediaElementSource","mediaElement","ac","connect","analyser","resumeAudioContext","destroyWebAudio","MediaElement","currentTime","duration","paused","playbackRate","play","pause","volume","mediaType","elementPosition","isMuted","buffer","onPlayEnd","mediaListeners","error","canplay","ended","seeked","event","volumechange","muted","Object","keys","removeEventListener","onAudioProcess","isPaused","getCurrentTime","on","url","controls","mediaControls","autoplay","src","prevMedia","querySelector","_load","elt","HTMLMediaElement","Error","load","_setupMediaListeners","setVolume","explicitDuration","Infinity","seekable","getDuration","value","clearPlayEnd","seekTo","promise","setPlayEnd","_onPlayEnd","time","un","deviceId","setSinkId","reject","destroyed","removeMediaElementOnDestroy","WebAudio","PeakCache","clearPeakCache","peakCacheRanges","peakCacheLength","uncachedRanges","item","arr","concat","sort","a","b","uncachedRangePairs","peakCacheRangePairs","values","ProgressHandler","instance","contentLength","response","_reader","body","getReader","total","parseInt","loaded","controller","read","then","done","onProgress","lengthComputable","close","byteLength","enqueue","catch","fetchFile","options","fetchHeaders","Headers","fetchRequest","Request","AbortController","requestHeaders","header","append","key","responseType","fetchOptions","method","headers","mode","credentials","cache","redirect","referrer","signal","fetch","progressAvailable","get","Response","ReadableStream","errMsg","ok","arrayBuffer","json","blob","text","status","func","args","getId","prefix","random","toString","substring","largest","smallest","Number","_disabledEventEmissions","handlers","callback","splice","handler","apply","setTimeout","eventNames","_isDisabledEventEmission","verticalPropMap","offsetTop","offsetWidth","mapProp","prop","prototype","hasOwnProperty","isProxy","Symbol","Proxy","obj","receiver","bind","set","preventClickHandler","stopPropagation","preventClick","window","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","PluginClass","ws","WaveSurfer","defaultParams","audioContext","audioScriptProcessor","backend","backgroundColor","dragSelection","desynchronized","forceDecode","loopSelection","mediaContainer","minPxPerSec","partialRender","devicePixelRatio","screen","deviceXDPI","logicalXDPI","plugins","renderer","responsive","skipLength","xhr","backends","assign","transform","setBackgroundColor","savedVolume","tmpEvents","currentRequest","arraybuffer","drawer","peakCache","supportsWebAudio","Backend","initialisedPluginList","isDestroyed","isReady","prevWidth","_onResize","debounce","registerPlugins","createDrawer","createBackend","createPeakCache","plugin","addPlugin","deferInit","initPlugin","staticProps","pluginStaticProp","Instance","observerPrototypeKeys","getOwnPropertyNames","destroyPlugin","init","drawBuffer","getPlayedPercents","newVolume","getVolume","seconds","skip","seekAndCenter","recenter","isFinite","isWebAudioBackend","oldScrollParent","getPlaybackRate","setMute","mute","filters","color","background","channelIndices","newRanges","addRangeToPeakCache","getPeaks","drawPeaks","pxPerSec","decodeArrayBuffer","data","loadDecodedBuffer","reader","FileReader","loadArrayBuffer","result","readAsArrayBuffer","empty","preloadIgnoreReasons","activeReasons","reason","console","warn","join","loadBuffer","loadMediaElement","action","once","getArrayBuffer","setPeaks","urlOrElt","loadElt","err","request","percentComplete","accuracy","noWindow","blobJSON","Blob","JSON","stringify","objURL","URL","createObjectURL","open","revokeObjectURL","cancel","abort","stop","disconnectSource","cancelAjax","clearTmpEvents","destroyAllPlugins","wavesurfer","VERSION","__VERSION__","PLAYING","PAUSED","FINISHED","offlineAudioContext","stateBehaviors","addOnAudioProcess","startPosition","getPlayedTime","removeOnAudioProcess","getAudioContext","lastPlay","scheduledPause","states","create","gainNode","mergedPeaks","offlineAc","scriptNode","source","splitPeaks","state","AudioContext","webkitAudioContext","WaveSurferAudioContext","sampleRate","WaveSurferOfflineAudioContext","OfflineAudioContext","webkitOfflineAudioContext","setState","setLength","disconnect","setFilters","disconnectFilters","reduce","prev","curr","createScriptProcessor","scriptBufferSize","createJavaScriptNode","destination","onaudioprocess","createAnalyser","createGain","createGainNode","audio","Audio","dest","createMediaStreamDestination","srcObject","stream","gain","setValueAtTime","errback","getOfflineAudioContext","decodeAudioData","numberOfChannels","newBuffer","createBuffer","sampleSize","sampleStep","chan","getChannelData","closeAudioContext","createSource","createBufferSource","noteGrainOn","noteOff","resume","adjustedTime"],"sourceRoot":""}