dev@347
|
1 import {
|
dev@347
|
2 Component,
|
dev@354
|
3 Input,
|
dev@354
|
4 ChangeDetectorRef,
|
dev@347
|
5 ElementRef,
|
dev@357
|
6 ViewChild,
|
dev@357
|
7 ChangeDetectionStrategy
|
dev@347
|
8 } from '@angular/core';
|
dev@347
|
9 import wavesUI from 'waves-ui-piper';
|
dev@354
|
10 import {WavesComponent} from '../waves-base.component';
|
dev@347
|
11
|
dev@347
|
12
|
dev@347
|
13 @Component({
|
dev@347
|
14 selector: 'ugly-waveform',
|
dev@355
|
15 templateUrl: '../waves-template.html',
|
dev@357
|
16 styleUrls: ['../waves-template.css'],
|
dev@357
|
17 changeDetection: ChangeDetectionStrategy.OnPush
|
dev@347
|
18 })
|
dev@354
|
19 export class WaveformComponent extends WavesComponent {
|
dev@347
|
20 @ViewChild('track') trackDiv: ElementRef;
|
dev@347
|
21 @Input() set audioBuffer(buffer: AudioBuffer) {
|
dev@347
|
22 this._audioBuffer = buffer || undefined;
|
dev@347
|
23 if (this.audioBuffer) {
|
dev@347
|
24 this.renderWaveform(this.audioBuffer);
|
dev@347
|
25 }
|
dev@347
|
26 }
|
dev@347
|
27
|
dev@347
|
28 get audioBuffer(): AudioBuffer {
|
dev@347
|
29 return this._audioBuffer;
|
dev@347
|
30 }
|
dev@347
|
31
|
dev@347
|
32 private _audioBuffer: AudioBuffer;
|
dev@347
|
33
|
dev@347
|
34 constructor(private ref: ChangeDetectorRef) {
|
dev@354
|
35 super();
|
dev@347
|
36 }
|
dev@347
|
37
|
dev@347
|
38 renderWaveform(buffer: AudioBuffer): void {
|
dev@347
|
39 const height = this.trackDiv.nativeElement.getBoundingClientRect().height;
|
dev@347
|
40 if (this.timeline && this.waveTrack) {
|
dev@347
|
41 // resize
|
dev@347
|
42 const width = this.trackDiv.nativeElement.getBoundingClientRect().width;
|
dev@356
|
43 this.clearTimeline(this.trackDiv);
|
dev@347
|
44 this.timeline.visibleWidth = width;
|
dev@347
|
45 this.timeline.pixelsPerSecond = width / buffer.duration;
|
dev@347
|
46 this.waveTrack.height = height;
|
dev@347
|
47 } else {
|
dev@354
|
48 this.renderTimeline(this.trackDiv, buffer.duration);
|
dev@347
|
49 }
|
dev@347
|
50
|
dev@347
|
51 const nchannels = buffer.numberOfChannels;
|
dev@347
|
52 const totalWaveHeight = height * 0.9;
|
dev@347
|
53 const waveHeight = totalWaveHeight / nchannels;
|
dev@347
|
54
|
dev@347
|
55 for (let ch = 0; ch < nchannels; ++ch) {
|
dev@347
|
56 const waveformLayer = new wavesUI.helpers.WaveformLayer(buffer, {
|
dev@347
|
57 top: (height - totalWaveHeight) / 2 + waveHeight * ch,
|
dev@347
|
58 height: waveHeight,
|
dev@347
|
59 color: '#0868ac',
|
dev@347
|
60 channel: ch
|
dev@347
|
61 });
|
dev@347
|
62 this.addLayer(waveformLayer, this.waveTrack, this.timeline.timeContext);
|
dev@347
|
63 }
|
dev@347
|
64
|
dev@347
|
65 this.waveTrack.render();
|
dev@347
|
66 this.waveTrack.update();
|
dev@347
|
67 this.ref.markForCheck();
|
dev@347
|
68 }
|
dev@347
|
69 }
|