annotate src/app/app.component.ts @ 132:36f57a21637c

Add a service for audio recording which uses relies on being provided implementations of a provider to a MediaStream and a MediaRecorder. Include a stub for use when recording isn't supported.
author Lucas Thompson <dev@lucas.im>
date Mon, 20 Mar 2017 13:24:36 +0000
parents c02c76b94148
children 976087b98e72
rev   line source
dev@31 1 import {Component} from '@angular/core';
dev@37 2 import {AudioPlayerService} from "./services/audio-player/audio-player.service";
dev@47 3 import {FeatureExtractionService} from "./services/feature-extraction/feature-extraction.service";
dev@47 4 import {ExtractorOutputInfo} from "./feature-extraction-menu/feature-extraction-menu.component";
dev@89 5 import {DomSanitizer} from '@angular/platform-browser';
dev@89 6 import {MdIconRegistry} from '@angular/material';
angular-cli@0 7
angular-cli@0 8 @Component({
angular-cli@0 9 selector: 'app-root',
angular-cli@0 10 templateUrl: './app.component.html',
angular-cli@0 11 styleUrls: ['./app.component.css']
angular-cli@0 12 })
angular-cli@0 13 export class AppComponent {
dev@31 14 audioBuffer: AudioBuffer; // TODO consider revising
dev@49 15 canExtract: boolean;
dev@115 16 isProcessing: boolean;
dev@1 17
dev@47 18 constructor(private audioService: AudioPlayerService,
dev@89 19 private piperService: FeatureExtractionService,
dev@89 20 private iconRegistry: MdIconRegistry,
dev@89 21 private sanitizer: DomSanitizer) {
dev@49 22 this.canExtract = false;
dev@115 23 this.isProcessing = false;
dev@89 24 iconRegistry.addSvgIcon(
dev@89 25 'duck',
dev@89 26 sanitizer.bypassSecurityTrustResourceUrl('assets/duck.svg')
dev@89 27 );
dev@48 28 }
dev@16 29
dev@31 30 onFileOpened(file: File) {
dev@49 31 this.canExtract = false;
dev@115 32 this.isProcessing = true;
dev@31 33 const reader: FileReader = new FileReader();
dev@31 34 const mimeType = file.type;
dev@31 35 reader.onload = (event: any) => {
dev@31 36 this.audioService.loadAudioFromUrl(
dev@31 37 URL.createObjectURL(new Blob([event.target.result], {type: mimeType}))
dev@31 38 );
dev@31 39 // TODO use a rxjs/Subject instead?
dev@31 40 this.audioService.decodeAudioData(event.target.result).then(audioBuffer => {
dev@31 41 this.audioBuffer = audioBuffer;
dev@115 42 if (this.audioBuffer) {
dev@49 43 this.canExtract = true;
dev@115 44 this.isProcessing = false;
dev@115 45 }
dev@31 46 });
dev@31 47 };
dev@31 48 reader.readAsArrayBuffer(file);
dev@16 49 }
dev@47 50
dev@48 51 extractFeatures(outputInfo: ExtractorOutputInfo): void {
dev@50 52 if (!this.canExtract || !outputInfo) return;
dev@49 53 this.canExtract = false;
dev@115 54 this.isProcessing = true;
dev@63 55 this.piperService.collect({
dev@47 56 audioData: [...Array(this.audioBuffer.numberOfChannels).keys()]
dev@47 57 .map(i => this.audioBuffer.getChannelData(i)),
dev@47 58 audioFormat: {
dev@47 59 sampleRate: this.audioBuffer.sampleRate,
dev@47 60 channelCount: this.audioBuffer.numberOfChannels
dev@47 61 },
dev@47 62 key: outputInfo.extractorKey,
dev@47 63 outputId: outputInfo.outputId
dev@50 64 }).then(() => {
dev@49 65 this.canExtract = true;
dev@115 66 this.isProcessing = false;
dev@115 67 }).catch(err => {
dev@115 68 this.canExtract = true;
dev@115 69 this.isProcessing = false;
dev@115 70 console.error(err)
dev@115 71 });
dev@47 72 }
angular-cli@0 73 }