{"version":3,"file":"ngx-audio-wave.mjs","sources":["../../../projects/ngx-audio-wave/src/lib/service/ngx-audio-wave.service.ts","../../../projects/ngx-audio-wave/src/lib/component/ngx-audio-wave.component.ts","../../../projects/ngx-audio-wave/src/lib/component/ngx-audio-wave.component.html","../../../projects/ngx-audio-wave/src/lib/ngx-audio-wave.module.ts","../../../projects/ngx-audio-wave/src/public-api.ts","../../../projects/ngx-audio-wave/src/ngx-audio-wave.ts"],"sourcesContent":["import {Injectable} from '@angular/core';\n\n@Injectable()\nexport class NgxAudioWaveService {\n  samples = 50;\n\n  /**\n   * Filters the AudioBuffer retrieved from an external source\n   * @param {AudioBuffer} audioBuffer the AudioBuffer from drawAudio()\n   * @returns {Array} an array of floating point numbers\n   */\n  filterData(audioBuffer: AudioBuffer): number[] {\n    const rawData = audioBuffer.getChannelData(0); // We only need to work with one channel of data\n    const blockSize = Math.floor(rawData.length / this.samples); // the number of samples in each subdivision\n    const filteredData = [];\n    for (let i = 0; i < this.samples; i++) {\n      let blockStart = blockSize * i; // the location of the first sample in the block\n      let sum = 0;\n      for (let j = 0; j < blockSize; j++) {\n        sum = sum + Math.abs(rawData[blockStart + j]); // find the sum of all the samples in the block\n      }\n      filteredData.push(sum / blockSize); // divide the sum by the block size to get the average\n    }\n    return filteredData;\n  }\n\n  /**\n   * Normalizes the audio data to make a cleaner illustration\n   * @param {Array} filteredData the data from filterData()\n   * @returns {Array} an normalized array of floating point numbers\n   */\n  normalizeData(filteredData: number[]): number[] {\n    const multiplier = Math.pow(Math.max(...filteredData), -1);\n    return filteredData.map(n => n * multiplier);\n  }\n}\n","import {\n  AfterViewInit,\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  numberAttribute,\n  OnDestroy,\n  PLATFORM_ID,\n  SecurityContext,\n  signal,\n  viewChild\n} from '@angular/core';\nimport {HttpClient} from \"@angular/common/http\";\nimport {isPlatformBrowser} from \"@angular/common\";\nimport {finalize, interval} from \"rxjs\";\nimport {NgxAudioWaveService} from \"../service/ngx-audio-wave.service\";\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {DomSanitizer, SafeUrl} from '@angular/platform-browser';\n\n@Component({\n  standalone: false,\n  selector: 'ngx-audio-wave',\n  templateUrl: './ngx-audio-wave.component.html',\n  styleUrls: ['./ngx-audio-wave.component.scss'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxAudioWaveComponent implements AfterViewInit, OnDestroy {\n  audioSrc = input.required<string | SafeUrl>();\n\n  color = input('#1e90ff');\n  height = input(25, {transform: numberAttribute});\n  gap = input(5, {transform: numberAttribute})\n  rounded = input(true, {transform: booleanAttribute});\n  hideBtn = input(false, {transform: booleanAttribute});\n\n  hasError = signal(false);\n  exactPlayedPercent = signal(0);\n  exactCurrentTime = signal(0);\n  isPaused = signal(true);\n  isLoading = signal(true);\n\n  exactDuration = signal(0);\n  protected normalizedData = signal<number[]>([]);\n\n  protected clipPath = computed(() => `inset(0px ${100 - this.exactPlayedPercent()}% 0px 0px)`)\n\n  // injecting\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly isPlatformBrowser = isPlatformBrowser(this.platformId);\n\n  private readonly domSanitizer = inject(DomSanitizer);\n  private readonly httpClient = inject(HttpClient);\n  private readonly audioWaveService = inject(NgxAudioWaveService);\n  private readonly destroyRef = inject(DestroyRef);\n\n  private audioRef = viewChild.required<ElementRef<HTMLAudioElement>>('audioRef');\n\n  playedPercent = computed(() => Math.round(this.exactPlayedPercent()))\n  currentTime = computed(() => Math.round(this.exactCurrentTime()))\n  duration = computed(() => Math.round(this.exactDuration()));\n  width = computed(() => this.audioWaveService.samples * this.gap());\n\n  ngAfterViewInit() {\n    if (this.isPlatformBrowser) {\n      this.fetchAudio(this.audioSrc());\n\n      this.startInterval();\n    }\n  }\n\n  ngOnDestroy() {\n    this.stop();\n  }\n\n  play(time = 0) {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.audioRef().nativeElement;\n    void audio.play();\n\n    if (time) {\n      audio.currentTime = time;\n    }\n  }\n\n  pause() {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.audioRef().nativeElement;\n    audio.pause();\n  }\n\n  stop() {\n    if (!this.isPlatformBrowser) return;\n\n    const audio = this.audioRef().nativeElement;\n    audio.currentTime = 0;\n    this.pause();\n  }\n\n  private calculatePercent(total: number, value: number) {\n    return (value / total) * 100 || 0;\n  }\n\n  setTime(mouseEvent: MouseEvent) {\n    const offsetX = mouseEvent.offsetX;\n    const width = this.width;\n\n    const clickPercent = this.calculatePercent(width(), offsetX);\n\n    const time = (clickPercent * this.exactDuration()) / 100;\n\n    void this.play(time);\n  }\n\n  private startInterval() {\n    interval(100)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe({\n        next: () => {\n          const audio = this.audioRef().nativeElement;\n          if (audio) {\n            const percent = this.calculatePercent(this.exactDuration(), audio.currentTime);\n            this.exactPlayedPercent.set(percent < 100 ? percent : 100);\n            this.exactCurrentTime.set(audio.currentTime);\n\n            this.isPaused.set(audio.paused);\n          }\n        }\n      })\n  }\n\n  private fetchAudio(audioSrc: string | SafeUrl) {\n    this.isLoading.set(true);\n\n    const src = typeof audioSrc === 'object' ? this.domSanitizer.sanitize(SecurityContext.URL, audioSrc) : audioSrc;\n    if (!src) {\n      console.error('Invalid SafeUrl: could not sanitize');\n      this.hasError.set(true);\n      return;\n    }\n\n    this.httpClient\n      .get(src, {responseType: 'arraybuffer'})\n      .pipe(\n        finalize(() => {\n          this.isLoading.set(false);\n        }),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe({\n        next: async (arrayBuffer) => {\n          try {\n            const audioContext = new AudioContext();\n            const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n\n            this.exactDuration.set(audioBuffer.duration);\n\n            const filteredData = this.audioWaveService.filterData(audioBuffer);\n            this.normalizedData.set(this.audioWaveService.normalizeData(filteredData));\n          } catch (e) {\n            this.hasError.set(true)\n          }\n        },\n        error: (error) => {\n          console.error(error);\n\n          this.hasError.set(true)\n        }\n      });\n  }\n}\n","<audio #audioRef [src]=\"audioSrc()\"></audio>\n\n<div [style.--ngx-audio-wave-color]=\"color()\"\n     class=\"ngx-audio-wave-wrapper\">\n  @if (!hasError()) {\n    @if (!hideBtn()) {\n      @if (isPaused()) {\n        <button class=\"ngx-audio-wave-btn\" (click)=\"play()\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n            <path\n              d=\"m11.596 8.697-6.363 3.692c-.54.313-1.233-.066-1.233-.697V4.308c0-.63.692-1.01 1.233-.696l6.363 3.692a.802.802 0 0 1 0 1.393z\"/>\n          </svg>\n        </button>\n      } @else {\n        <button class=\"ngx-audio-wave-btn\" (click)=\"pause()\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\">\n            <path\n              d=\"M5.5 3.5A1.5 1.5 0 0 1 7 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5zm5 0A1.5 1.5 0 0 1 12 5v6a1.5 1.5 0 0 1-3 0V5a1.5 1.5 0 0 1 1.5-1.5z\"/>\n          </svg>\n        </button>\n      }\n    }\n\n    <div class=\"ngx-audio-wave\" [style.height.px]=\"height()\" [style.width.px]=\"width()\">\n      @if (!isLoading()) {\n        <svg (click)=\"setTime($event)\"\n             [attr.viewBox]=\"`0 0 ${width()} ${height()}`\"\n             class=\"real\">\n          @for (rect of normalizedData(); track rect; let index = $index) {\n            <rect\n              [attr.height]=\"rect * height()\"\n              [attr.width]=\"2\"\n              [attr.x]=\"index * gap()\"\n              [attr.y]=\"height() - (rect * height())\"\n              [attr.rx]=\"rounded() ? 1 : 0\"\n              [attr.ry]=\"rounded() ? 1 : 0\">\n            </rect>\n          }\n        </svg>\n\n        <div class=\"fake\" [style.clip-path]=\"clipPath()\">\n          <svg [attr.viewBox]=\"`0 0 ${width()} ${height()}`\">\n            @for (rect of normalizedData(); track rect; let index = $index) {\n              <rect\n                [attr.height]=\"rect * height()\"\n                [attr.width]=\"2\"\n                [attr.x]=\"index * gap()\"\n                [attr.y]=\"height() - (rect * height())\"\n                [attr.rx]=\"rounded() ? 1 : 0\"\n                [attr.ry]=\"rounded() ? 1 : 0\">\n              </rect>\n            }\n          </svg>\n        </div>\n      } @else {\n        <div class=\"ngx-audio-wave-loading\">\n          <span></span>\n          <span></span>\n          <span></span>\n        </div>\n      }\n    </div>\n  } @else {\n    Some errors occurred\n  }\n</div>\n","import {NgModule} from '@angular/core';\nimport {NgxAudioWaveComponent} from './component/ngx-audio-wave.component';\nimport {provideHttpClient, withFetch} from \"@angular/common/http\";\nimport {NgxAudioWaveService} from \"./service/ngx-audio-wave.service\";\n\n\n@NgModule({\n  declarations: [NgxAudioWaveComponent],\n  exports: [NgxAudioWaveComponent],\n  providers: [NgxAudioWaveService, provideHttpClient(withFetch())]\n})\nexport class NgxAudioWaveModule {\n}\n","/*\n * Public API Surface of ngx-audio-wave\n */\n\nexport * from './lib/component/ngx-audio-wave.component';\nexport * from './lib/ngx-audio-wave.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}