{"version":3,"file":"videogular-ngx-videogular-modulo.mjs","sources":["../../../../libs/ngx-videogular/modulo/src/lib/utils/modulo.ts","../../../../libs/ngx-videogular/modulo/src/lib/components/vg-modulo.component.ts","../../../../libs/ngx-videogular/modulo/src/lib/components/vg-modulo.component.html","../../../../libs/ngx-videogular/modulo/src/lib/modulo.module.ts","../../../../libs/ngx-videogular/modulo/src/videogular-ngx-videogular-modulo.ts"],"sourcesContent":["import {FluctusInterface} from '../interfaces/fluctus.interface';\n\nconst AudioContext = window[\"AudioContext\"] || window[\"webkitAudioContext\"];\n\nexport class Gondolo implements FluctusInterface {\n  ctx: AudioContext;\n  analyser: AnalyserNode | Array<AnalyserNode>;\n  stereo: boolean;\n  audible: boolean;\n  wavedata: Uint8Array | null;\n  freqdata: any;\n  splitter: ChannelSplitterNode | null;\n  merger: ChannelMergerNode | null;\n  source: MediaElementAudioSourceNode | MediaStreamAudioSourceNode;\n  output: ChannelMergerNode;\n\n  constructor(\n    audio:\n      | HTMLAudioElement\n      | AudioNode\n      | MediaStream\n      | MediaElementAudioSourceNode\n      | MediaStreamAudioSourceNode,\n    ctx?: AudioContext | any,\n    opts?: { stereo?: boolean; audible?: boolean }\n  ) {\n    if (!(this instanceof Gondolo)) {\n      return new Gondolo(audio, ctx, opts);\n    }\n\n    if (!(ctx instanceof AudioContext)) {\n      (opts = ctx), (ctx = null);\n    }\n\n    opts = opts || {};\n    this.ctx = ctx = ctx || new AudioContext();\n\n    if (!(audio instanceof AudioNode)) {\n      audio =\n        audio instanceof Audio || audio instanceof HTMLAudioElement\n          ? ctx.createMediaElementSource(audio)\n          : ctx.createMediaStreamSource(audio);\n    }\n\n    this.audioConfigStateResolver(ctx, opts, audio);\n    this.audioConfigStateParser(ctx);\n  }\n\n  public waveform(output?: Uint8Array, channel?: number): Uint8Array {\n    if (!output) {\n      output =\n        this.wavedata ||\n        (this.wavedata = new Uint8Array(\n          (this.analyser[0] || this.analyser).frequencyBinCount\n        ));\n    }\n\n    const analyser = this.stereo ? this.analyser[channel || 0] : this.analyser;\n\n    analyser.getByteTimeDomainData(output);\n\n    return output;\n  }\n\n  public frequencies(output?: Uint8Array, channel?: number): Uint8Array {\n    if (!output) {\n      output =\n        this.freqdata ||\n        (this.freqdata = new Uint8Array(\n          (this.analyser[0] || this.analyser).frequencyBinCount\n        ));\n    }\n\n    const analyser = this.stereo ? this.analyser[channel || 0] : this.analyser;\n\n    analyser.getByteFrequencyData(output);\n\n    return output;\n  }\n\n  private audioConfigStateResolver(\n    ctx: AudioContext,\n    opts: { stereo?: boolean; audible?: boolean },\n    audio: MediaElementAudioSourceNode | any\n  ): void {\n    this.analyser = ctx.createAnalyser();\n    this.stereo = !!opts.stereo;\n    this.audible = opts.audible !== false;\n    this.wavedata = null;\n    this.freqdata = null;\n    this.splitter = null;\n    this.merger = null;\n    this.source = audio;\n  }\n\n  private audioConfigStateParser(ctx: AudioContext) {\n    if (!this.stereo) {\n      this.output = this.source;\n\n      this.source.connect(this.analyser[0] || this.analyser);\n\n      if (this.audible) {\n        (this.analyser[0] || this.analyser).connect(ctx.destination);\n      }\n    } else {\n      this.analyser = [this.analyser[0] || this.analyser];\n\n      this.analyser.push(ctx.createAnalyser());\n\n      this.splitter = ctx.createChannelSplitter(2);\n      this.merger = ctx.createChannelMerger(2);\n      this.output = this.merger;\n\n      this.source.connect(this.splitter);\n\n      for (let i = 0; i < 2; i++) {\n        this.splitter.connect(this.analyser[i], i, 0);\n        this.analyser[i].connect(this.merger, 0, i);\n      }\n\n      if (this.audible) {\n        this.merger.connect(ctx.destination);\n      }\n    }\n  }\n}\n","import { Component, ElementRef, Input, ViewChild } from \"@angular/core\";\nimport { ModuloConfig } from '../interfaces/modulo-config.interface';\nimport { Gondolo } from \"../utils/modulo\";\n\n@Component({\n    selector: \"vg-modulo\",\n    templateUrl: \"./vg-modulo.component.html\",\n    standalone: false\n})\nexport class VgModuloComponent {\n  private _audioAnalyser: Gondolo;\n  private _ctx: CanvasRenderingContext2D;\n\n  @Input() moduloConfig: ModuloConfig;\n  @Input() audioElement: HTMLAudioElement;\n\n  @ViewChild(\"waveCanvas\", { static: false }) waveCanvas: ElementRef<HTMLCanvasElement>;\n\n  public startVisualizer() {\n    if (!this._audioAnalyser) {\n      this._audioAnalyser = new Gondolo(this.audioElement);\n\n      const {width, height} = this.moduloConfig.dimensions;\n      const canvasElement = this.waveCanvas.nativeElement;\n\n      this._ctx = canvasElement.getContext(\"2d\");\n\n      canvasElement.width = width;\n      canvasElement.height = height;\n    }\n\n    this.update();\n  }\n\n  public update() {\n    const audioFreq = this._audioAnalyser.waveform();\n    const {fillStyle, strokeStyle, lineWidth, scaleFactor} = this.moduloConfig;\n    const {width, height} = this.waveCanvas.nativeElement;\n\n    // Clear canvas\n    this._ctx.fillStyle = fillStyle;\n    this._ctx.fillRect(0, 0, width, height);\n\n    this._ctx.strokeStyle = strokeStyle;\n    this._ctx.lineWidth = lineWidth;\n\n    // Draw frequency lines\n    this._ctx.beginPath();\n    this._ctx.moveTo(0, height / 2 - audioFreq[0] * scaleFactor);\n\n    for (let i = 0; i < audioFreq.length; i++) {\n      this._ctx.lineTo(\n        (width / audioFreq.length) * i,\n        height / 2 - audioFreq[i] * scaleFactor\n      );\n    }\n\n    this._ctx.moveTo(0, height / 2 + audioFreq[0] * scaleFactor);\n\n    for (let i = 0; i < audioFreq.length; i++) {\n      this._ctx.lineTo(\n        (width / audioFreq.length) * i,\n        height / 2 + audioFreq[i] * scaleFactor\n      );\n    }\n\n    this._ctx.stroke();\n\n    window.requestAnimationFrame(() => this.update());\n  }\n}\n","<canvas #waveCanvas></canvas>\n","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { VgModuloComponent } from \"./components/vg-modulo.component\";\n\n@NgModule({\n  imports: [\n    CommonModule\n  ],\n  declarations: [VgModuloComponent],\n  exports: [VgModuloComponent],\n})\nexport class VgModuloModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}