annotate src/app/app.module.ts @ 192:e4f38975c2bc

Introduce interface for reading a file, once again avoiding specific browser implementation.
author Lucas Thompson <dev@lucas.im>
date Thu, 23 Mar 2017 15:42:34 +0000
parents ea735ebeed0e
children ff5a850f0f72
rev   line source
angular-cli@0 1 import { BrowserModule } from '@angular/platform-browser';
dev@70 2 import {NgModule} from '@angular/core';
angular-cli@0 3 import { FormsModule } from '@angular/forms';
angular-cli@0 4 import { HttpModule } from '@angular/http';
angular-cli@0 5
angular-cli@0 6 import { AppComponent } from './app.component';
dev@31 7 import { MaterialModule } from "@angular/material";
dev@5 8 import { WaveformComponent } from './waveform/waveform.component';
dev@13 9 import { AudioFileOpenComponent } from './audio-file-open/audio-file-open.component';
dev@21 10 import { PlaybackControlComponent } from './playback-control/playback-control.component';
dev@191 11 import {
dev@191 12 AudioPlayerService,
dev@192 13 UrlResourceLifetimeManager, ResourceReader
dev@191 14 } from "./services/audio-player/audio-player.service";
dev@40 15 import { FeatureExtractionService } from "./services/feature-extraction/feature-extraction.service";
dev@44 16 import { FeatureExtractionMenuComponent } from "./feature-extraction-menu/feature-extraction-menu.component";
dev@115 17 import { ProgressSpinnerComponent } from "./progress-spinner/progress-spinner.component";
dev@135 18 import {
dev@135 19 AudioRecorderService,
dev@135 20 AudioInputProvider,
dev@135 21 MediaRecorderConstructor,
dev@135 22 MediaRecorder as IMediaRecorder,
dev@135 23 MediaRecorderOptions,
dev@135 24 ThrowingMediaRecorder,
dev@135 25 } from "./services/audio-recorder/audio-recorder.service";
dev@135 26 import {RecordingControlComponent} from "./recording-control/recording-control.component";
dev@172 27 import {NotebookFeedComponent} from "./notebook-feed/notebook-feed.component";
dev@172 28 import {AnalysisItemComponent} from "./analysis-item/analysis-item.component";
dev@31 29
dev@93 30 export function createAudioContext(): AudioContext {
dev@31 31 return new (
dev@31 32 (window as any).AudioContext
dev@31 33 || (window as any).webkitAudioContext
dev@31 34 )();
dev@31 35 }
angular-cli@0 36
dev@94 37 export function createAudioElement(): HTMLAudioElement {
dev@94 38 return new Audio();
dev@94 39 }
dev@94 40
dev@135 41 export function createAudioInputProvider(): AudioInputProvider {
dev@135 42 if (navigator.mediaDevices &&
dev@135 43 typeof navigator.mediaDevices.getUserMedia === 'function') {
dev@135 44 return () => navigator.mediaDevices.getUserMedia(
dev@135 45 {audio: true, video: false}
dev@135 46 );
dev@135 47 } else {
dev@135 48 return () => Promise.reject('Recording is not supported in this browser.');
dev@135 49 }
dev@135 50 }
dev@135 51
dev@135 52 declare const MediaRecorder: {
dev@135 53 prototype: IMediaRecorder;
dev@135 54 new(stream: MediaStream,
dev@135 55 options?: MediaRecorderOptions): IMediaRecorder;
dev@135 56 isTypeSupported(mimeType: string): boolean;
dev@135 57 };
dev@135 58
dev@135 59 export function createMediaRecorderFactory(): MediaRecorderConstructor {
dev@135 60 if (typeof MediaRecorder !== 'undefined') {
dev@135 61 return MediaRecorder;
dev@135 62 } else {
dev@135 63 return ThrowingMediaRecorder;
dev@135 64 }
dev@135 65 }
dev@135 66
dev@191 67 export const urlResourceManager: UrlResourceLifetimeManager = {
dev@191 68 createUrlToResource: (resource: File | Blob): string => {
dev@191 69 return URL.createObjectURL(resource);
dev@191 70 },
dev@191 71 revokeUrlToResource: (url: string) => {
dev@191 72 URL.revokeObjectURL(url);
dev@191 73 }
dev@191 74 };
dev@191 75
dev@192 76 export const readResource: ResourceReader = (resource) => {
dev@192 77 return new Promise((res, rej) => {
dev@192 78 const reader: FileReader = new FileReader();
dev@192 79 reader.onload = (event: any) => {
dev@192 80 res(event.target.result);
dev@192 81 };
dev@192 82 reader.onerror = (event) => {
dev@192 83 rej(event.message);
dev@192 84 };
dev@192 85 reader.readAsArrayBuffer(resource);
dev@192 86 });
dev@192 87 };
dev@192 88
angular-cli@0 89 @NgModule({
angular-cli@0 90 declarations: [
dev@1 91 AppComponent,
dev@13 92 WaveformComponent,
dev@21 93 AudioFileOpenComponent,
dev@44 94 PlaybackControlComponent,
dev@135 95 RecordingControlComponent,
dev@115 96 FeatureExtractionMenuComponent,
dev@172 97 ProgressSpinnerComponent,
dev@172 98 AnalysisItemComponent,
dev@172 99 NotebookFeedComponent
angular-cli@0 100 ],
angular-cli@0 101 imports: [
angular-cli@0 102 BrowserModule,
angular-cli@0 103 FormsModule,
dev@3 104 HttpModule,
dev@89 105 MaterialModule
angular-cli@0 106 ],
dev@1 107 providers: [
dev@94 108 {provide: HTMLAudioElement, useFactory: createAudioElement}, // TODO use something more generic than HTMLAudioElement
dev@94 109 {provide: 'AudioContext', useFactory: createAudioContext}, // use a string token, Safari doesn't seem to like AudioContext
dev@40 110 AudioPlayerService,
dev@135 111 {provide: 'AudioInputProvider', useFactory: createAudioInputProvider},
dev@135 112 AudioRecorderService,
dev@70 113 FeatureExtractionService,
dev@135 114 {provide: 'MediaRecorderFactory', useFactory: createMediaRecorderFactory},
dev@191 115 {provide: 'PiperRepoUri', useValue: 'assets/remote-plugins.json'},
dev@192 116 {provide: 'UrlResourceLifetimeManager', useValue: urlResourceManager},
dev@192 117 {provide: 'ResourceReader', useValue: readResource}
dev@1 118 ],
angular-cli@0 119 bootstrap: [AppComponent]
angular-cli@0 120 })
dev@1 121 export class AppModule {
dev@1 122
dev@1 123 }