annotate src/app/audio-file-open/audio-file-open.component.ts @ 19:953932e9ba82

Remove zone injection from app.component and move to where the event is emitted in audio-file-open.component.
author Lucas Thompson <dev@lucas.im>
date Fri, 28 Oct 2016 08:28:54 +0100
parents 7e3ab6f8792f
children 5bdfcf493646
rev   line source
dev@16 1 import {
dev@16 2 Component, OnInit, ViewChild, ElementRef, Output,
dev@19 3 EventEmitter, NgZone
dev@16 4 } from '@angular/core';
dev@13 5
dev@15 6 interface AudioContextConstructor {
dev@15 7 new(): AudioContext
dev@15 8 }
dev@15 9
dev@15 10 interface WindowAudioContext {
dev@15 11 AudioContext?: AudioContextConstructor;
dev@15 12 webkitAudioContext?: AudioContextConstructor
dev@15 13 }
dev@15 14
dev@13 15 @Component({
dev@13 16 selector: 'app-audio-file-open',
dev@13 17 templateUrl: './audio-file-open.component.html',
dev@13 18 styleUrls: ['./audio-file-open.component.css']
dev@13 19 })
dev@13 20 export class AudioFileOpenComponent implements OnInit {
dev@13 21
dev@13 22 @ViewChild('open') open: ElementRef;
dev@16 23 @Output() audioLoaded: EventEmitter<AudioBuffer>;
dev@13 24
dev@15 25 private audioContext: AudioContext;
dev@15 26
dev@19 27 constructor(private zone: NgZone) {
dev@16 28 this.audioLoaded = new EventEmitter<AudioBuffer>();
dev@16 29
dev@15 30 // TODO make a service which provides the AudioContext?
dev@15 31 const factory: WindowAudioContext = (window as WindowAudioContext);
dev@15 32 this.audioContext = new (factory.AudioContext || factory.webkitAudioContext)();
dev@15 33 }
dev@13 34
dev@13 35 ngOnInit() {
dev@13 36 }
dev@13 37
dev@15 38 decodeAudio(files: FileList) {
dev@15 39 if (files.length > 0) {
dev@15 40 const reader: FileReader = new FileReader();
dev@15 41 reader.onload = (event: any) => {
dev@15 42 this.audioContext.decodeAudioData(event.target.result, buffer => {
dev@19 43 this.zone.run(() => {
dev@19 44 this.audioLoaded.emit(buffer);
dev@19 45 });
dev@15 46 });
dev@15 47 };
dev@15 48 reader.readAsArrayBuffer(files[0]);
dev@15 49 }
dev@13 50 }
dev@13 51
dev@13 52 openAudioDialog() {
dev@13 53 this.open.nativeElement.click();
dev@13 54 }
dev@13 55 }