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 }
|