@pixi/sound
Version:
WebAudio API playback library with filters
1 lines • 4.01 kB
Source Map (JSON)
{"version":3,"file":"render.mjs","sources":["../../src/utils/render.ts"],"sourcesContent":["import { CanvasSource, ICanvas, TextureSource } from 'pixi.js';\nimport { Sound } from '../Sound';\nimport { WebAudioMedia } from '../webaudio/WebAudioMedia';\n\ninterface RenderOptions\n{\n /**\n * Width of the render.\n * @default 512\n */\n width?: number;\n /**\n * Height of the render.\n * @default 128\n */\n height?: number;\n /**\n * Fill style for waveform.\n * @default 'black'\n */\n fill?: string | CanvasPattern | CanvasGradient;\n}\n\n/**\n * Render image as Texture. **Only supported with WebAudio**\n * @memberof utils\n * @param sound - Instance of sound to render\n * @param options - Custom rendering options\n * @return Result texture\n */\nfunction render(sound: Sound, options?: RenderOptions): TextureSource\n{\n const canvas: HTMLCanvasElement = document.createElement('canvas');\n\n options = {\n width: 512,\n height: 128,\n fill: 'black', ...(options || {})\n };\n\n canvas.width = options.width;\n canvas.height = options.height;\n\n const textureSource = new CanvasSource({\n resource: canvas as ICanvas,\n });\n\n if (!(sound.media instanceof WebAudioMedia))\n {\n return textureSource;\n }\n\n const media: WebAudioMedia = sound.media as WebAudioMedia;\n\n // eslint-disable-next-line no-console\n console.assert(!!media.buffer, 'No buffer found, load first');\n\n const context: CanvasRenderingContext2D = canvas.getContext('2d');\n\n context.fillStyle = options.fill;\n const data: Float32Array = media.buffer.getChannelData(0);\n const step: number = Math.ceil(data.length / options.width);\n const amp: number = options.height / 2;\n\n for (let i = 0; i < options.width; i++)\n {\n let min = 1.0;\n let max = -1.0;\n\n for (let j = 0; j < step; j++)\n {\n const datum: number = data[(i * step) + j];\n\n if (datum < min)\n {\n min = datum;\n }\n if (datum > max)\n {\n max = datum;\n }\n }\n context.fillRect(i, (1 + min) * amp, 1, Math.max(1, (max - min) * amp));\n }\n\n return textureSource;\n}\n\nexport { render };\nexport type { RenderOptions };\n\n"],"names":[],"mappings":";;;AA8BA,SAAS,MAAA,CAAO,OAAc,OAC9B,EAAA;AACI,EAAM,MAAA,MAAA,GAA4B,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAEjE,EAAU,OAAA,GAAA;AAAA,IACN,KAAO,EAAA,GAAA;AAAA,IACP,MAAQ,EAAA,GAAA;AAAA,IACR,IAAM,EAAA,OAAA;AAAA,IAAS,GAAI,WAAW,EAAC;AAAA,GACnC,CAAA;AAEA,EAAA,MAAA,CAAO,QAAQ,OAAQ,CAAA,KAAA,CAAA;AACvB,EAAA,MAAA,CAAO,SAAS,OAAQ,CAAA,MAAA,CAAA;AAExB,EAAM,MAAA,aAAA,GAAgB,IAAI,YAAa,CAAA;AAAA,IACnC,QAAU,EAAA,MAAA;AAAA,GACb,CAAA,CAAA;AAED,EAAI,IAAA,EAAE,KAAM,CAAA,KAAA,YAAiB,aAC7B,CAAA,EAAA;AACI,IAAO,OAAA,aAAA,CAAA;AAAA,GACX;AAEA,EAAA,MAAM,QAAuB,KAAM,CAAA,KAAA,CAAA;AAGnC,EAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAC,KAAA,CAAM,QAAQ,6BAA6B,CAAA,CAAA;AAE5D,EAAM,MAAA,OAAA,GAAoC,MAAO,CAAA,UAAA,CAAW,IAAI,CAAA,CAAA;AAEhE,EAAA,OAAA,CAAQ,YAAY,OAAQ,CAAA,IAAA,CAAA;AAC5B,EAAA,MAAM,IAAqB,GAAA,KAAA,CAAM,MAAO,CAAA,cAAA,CAAe,CAAC,CAAA,CAAA;AACxD,EAAA,MAAM,OAAe,IAAK,CAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,QAAQ,KAAK,CAAA,CAAA;AAC1D,EAAM,MAAA,GAAA,GAAc,QAAQ,MAAS,GAAA,CAAA,CAAA;AAErC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,OAAO,CACnC,EAAA,EAAA;AACI,IAAA,IAAI,GAAM,GAAA,CAAA,CAAA;AACV,IAAA,IAAI,GAAM,GAAA,CAAA,CAAA,CAAA;AAEV,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,EAAM,CAC1B,EAAA,EAAA;AACI,MAAA,MAAM,KAAgB,GAAA,IAAA,CAAM,CAAI,GAAA,IAAA,GAAQ,CAAC,CAAA,CAAA;AAEzC,MAAA,IAAI,QAAQ,GACZ,EAAA;AACI,QAAM,GAAA,GAAA,KAAA,CAAA;AAAA,OACV;AACA,MAAA,IAAI,QAAQ,GACZ,EAAA;AACI,QAAM,GAAA,GAAA,KAAA,CAAA;AAAA,OACV;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,QAAS,CAAA,CAAA,EAAA,CAAI,CAAI,GAAA,GAAA,IAAO,GAAK,EAAA,CAAA,EAAG,IAAK,CAAA,GAAA,CAAI,CAAI,EAAA,CAAA,GAAA,GAAM,GAAO,IAAA,GAAG,CAAC,CAAA,CAAA;AAAA,GAC1E;AAEA,EAAO,OAAA,aAAA,CAAA;AACX;;;;"}