annotate src/app/visualisations/waveform/waveform.component.ts @ 357:b529a08ddff1

Explicitly state the change detection strategy, despite the fact it will already be OnPush here because its parent is.
author Lucas Thompson <dev@lucas.im>
date Fri, 26 May 2017 18:30:58 +0100
parents b852bace6b14
children a3b45218c311
rev   line source
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 }