dev@497
|
1 import {BrowserModule} from '@angular/platform-browser';
|
dev@70
|
2 import {NgModule} from '@angular/core';
|
dev@497
|
3 import {FormsModule} from '@angular/forms';
|
dev@497
|
4 import {HttpModule} from '@angular/http';
|
angular-cli@0
|
5
|
dev@497
|
6 import {AppComponent} from './app.component';
|
dev@497
|
7 import {WaveformComponent} from './visualisations/waveform/waveform.component';
|
dev@497
|
8 import {AudioFileOpenComponent} from './audio-file-open/audio-file-open.component';
|
dev@497
|
9 import {PlaybackControlComponent} from './playback-control/playback-control.component';
|
dev@191
|
10 import {
|
dev@191
|
11 AudioPlayerService,
|
dev@236
|
12 ResourceReader
|
dev@236
|
13 } from './services/audio-player/audio-player.service';
|
dev@497
|
14 import {FeatureExtractionService} from './services/feature-extraction/feature-extraction.service';
|
dev@497
|
15 import {FeatureExtractionMenuComponent} from './feature-extraction-menu/feature-extraction-menu.component';
|
dev@497
|
16 import {ProgressSpinnerComponent} from './progress-spinner/progress-spinner.component';
|
dev@135
|
17 import {
|
dev@497
|
18 AudioInputProvider,
|
dev@135
|
19 AudioRecorderService,
|
dev@497
|
20 MediaRecorder as IMediaRecorder,
|
dev@135
|
21 MediaRecorderConstructor,
|
dev@446
|
22 MediaRecorderOptions
|
dev@236
|
23 } from './services/audio-recorder/audio-recorder.service';
|
dev@236
|
24 import {RecordingControlComponent} from './recording-control/recording-control.component';
|
dev@236
|
25 import {NotebookFeedComponent} from './notebook-feed/notebook-feed.component';
|
dev@236
|
26 import {AnalysisItemComponent} from './analysis-item/analysis-item.component';
|
dev@236
|
27 import {ProgressBarComponent} from './progress-bar/progress-bar';
|
dev@236
|
28 import {UglyMaterialModule} from './ugly-material.module';
|
dev@284
|
29 import {Observable} from 'rxjs/Observable';
|
dev@347
|
30 import {PlayHeadComponent} from './playhead/playhead.component';
|
dev@347
|
31 import {LivePlayHeadComponent} from './playhead/live-play-head.component';
|
dev@378
|
32 import {CurveComponent} from './visualisations/curve/curve.component';
|
dev@378
|
33 import {TracksComponent} from './visualisations/tracks/tracks.components';
|
dev@378
|
34 import {NotesComponent} from './visualisations/notes/notes.component';
|
cannam@480
|
35 import {RegionsComponent} from './visualisations/regions/regions.component';
|
dev@381
|
36 import {InstantsComponent} from './visualisations/instants/instants.component';
|
dev@382
|
37 import {GridComponent} from './visualisations/grid/grid.component';
|
dev@393
|
38 import {VerticalScaleComponent} from './visualisations/vertical-scale.component';
|
dev@393
|
39 import {CrossHairInspectorComponent} from './visualisations/cross-hair-inspector.component';
|
dev@397
|
40 import {RenderLoopService} from './services/render-loop/render-loop.service';
|
dev@411
|
41 import {WavesPlayHeadComponent} from './playhead/waves-ui-play-head.component';
|
dev@497
|
42 import {ActionTrayComponent} from './actions/action-tray.component';
|
dev@446
|
43 import {RecordRtcMediaRecorder} from './services/audio-recorder/RecordRtcMediaRecorder';
|
dev@493
|
44 import {NotificationService} from './services/notifications/notifications.service';
|
dev@497
|
45 import {UrlResourceLifetimeManager} from "./services/File";
|
dev@31
|
46
|
dev@93
|
47 export function createAudioContext(): AudioContext {
|
dev@31
|
48 return new (
|
dev@31
|
49 (window as any).AudioContext
|
dev@31
|
50 || (window as any).webkitAudioContext
|
dev@31
|
51 )();
|
dev@31
|
52 }
|
angular-cli@0
|
53
|
dev@94
|
54 export function createAudioElement(): HTMLAudioElement {
|
dev@94
|
55 return new Audio();
|
dev@94
|
56 }
|
dev@94
|
57
|
dev@135
|
58 export function createAudioInputProvider(): AudioInputProvider {
|
dev@135
|
59 if (navigator.mediaDevices &&
|
dev@135
|
60 typeof navigator.mediaDevices.getUserMedia === 'function') {
|
dev@135
|
61 return () => navigator.mediaDevices.getUserMedia(
|
dev@135
|
62 {audio: true, video: false}
|
dev@135
|
63 );
|
dev@135
|
64 } else {
|
dev@135
|
65 return () => Promise.reject('Recording is not supported in this browser.');
|
dev@135
|
66 }
|
dev@135
|
67 }
|
dev@135
|
68
|
dev@135
|
69 declare const MediaRecorder: {
|
dev@135
|
70 prototype: IMediaRecorder;
|
dev@135
|
71 new(stream: MediaStream,
|
dev@135
|
72 options?: MediaRecorderOptions): IMediaRecorder;
|
dev@135
|
73 isTypeSupported(mimeType: string): boolean;
|
dev@135
|
74 };
|
dev@135
|
75
|
dev@135
|
76 export function createMediaRecorderFactory(): MediaRecorderConstructor {
|
dev@135
|
77 if (typeof MediaRecorder !== 'undefined') {
|
dev@135
|
78 return MediaRecorder;
|
dev@135
|
79 } else {
|
dev@446
|
80 return RecordRtcMediaRecorder;
|
dev@135
|
81 }
|
dev@135
|
82 }
|
dev@135
|
83
|
dev@194
|
84 export function createUrlResourceManager(): UrlResourceLifetimeManager {
|
dev@194
|
85 return {
|
dev@194
|
86 createUrlToResource: (resource: File | Blob): string => {
|
dev@194
|
87 return URL.createObjectURL(resource);
|
dev@194
|
88 },
|
dev@194
|
89 revokeUrlToResource: (url: string) => {
|
dev@194
|
90 URL.revokeObjectURL(url);
|
dev@194
|
91 }
|
dev@194
|
92 };
|
dev@194
|
93 }
|
dev@191
|
94
|
dev@236
|
95 export function createResourceReader(): ResourceReader {
|
dev@195
|
96 return (resource) => {
|
dev@195
|
97 return new Promise((res, rej) => {
|
dev@195
|
98 const reader: FileReader = new FileReader();
|
dev@195
|
99 reader.onload = (event: any) => {
|
dev@195
|
100 res(event.target.result);
|
dev@195
|
101 };
|
dev@195
|
102 reader.onerror = (event) => {
|
dev@195
|
103 rej(event.message);
|
dev@195
|
104 };
|
dev@195
|
105 reader.readAsArrayBuffer(resource);
|
dev@195
|
106 });
|
dev@233
|
107 };
|
dev@195
|
108 }
|
dev@192
|
109
|
dev@284
|
110 export interface Dimension {
|
dev@284
|
111 width: number;
|
dev@284
|
112 height: number;
|
dev@284
|
113 }
|
dev@284
|
114 export function createWindowDimensionObservable(): Observable<Dimension> {
|
dev@284
|
115 return Observable.fromEvent(window, 'resize', () => ({
|
dev@284
|
116 height: window.innerHeight,
|
dev@284
|
117 width: window.innerWidth
|
dev@284
|
118 })).share();
|
dev@284
|
119 }
|
angular-cli@0
|
120 @NgModule({
|
angular-cli@0
|
121 declarations: [
|
dev@1
|
122 AppComponent,
|
dev@13
|
123 WaveformComponent,
|
dev@21
|
124 AudioFileOpenComponent,
|
dev@44
|
125 PlaybackControlComponent,
|
dev@135
|
126 RecordingControlComponent,
|
dev@115
|
127 FeatureExtractionMenuComponent,
|
dev@172
|
128 ProgressSpinnerComponent,
|
dev@172
|
129 AnalysisItemComponent,
|
dev@233
|
130 NotebookFeedComponent,
|
dev@347
|
131 ProgressBarComponent,
|
dev@347
|
132 PlayHeadComponent,
|
dev@359
|
133 LivePlayHeadComponent,
|
dev@372
|
134 CurveComponent,
|
dev@378
|
135 TracksComponent,
|
dev@381
|
136 NotesComponent,
|
cannam@480
|
137 RegionsComponent,
|
dev@382
|
138 InstantsComponent,
|
dev@388
|
139 GridComponent,
|
dev@393
|
140 VerticalScaleComponent,
|
dev@407
|
141 CrossHairInspectorComponent,
|
dev@423
|
142 WavesPlayHeadComponent,
|
dev@423
|
143 ActionTrayComponent
|
angular-cli@0
|
144 ],
|
angular-cli@0
|
145 imports: [
|
angular-cli@0
|
146 BrowserModule,
|
angular-cli@0
|
147 FormsModule,
|
dev@3
|
148 HttpModule,
|
dev@236
|
149 UglyMaterialModule
|
angular-cli@0
|
150 ],
|
dev@1
|
151 providers: [
|
dev@94
|
152 {provide: HTMLAudioElement, useFactory: createAudioElement}, // TODO use something more generic than HTMLAudioElement
|
dev@94
|
153 {provide: 'AudioContext', useFactory: createAudioContext}, // use a string token, Safari doesn't seem to like AudioContext
|
dev@40
|
154 AudioPlayerService,
|
dev@135
|
155 {provide: 'AudioInputProvider', useFactory: createAudioInputProvider},
|
dev@135
|
156 AudioRecorderService,
|
dev@70
|
157 FeatureExtractionService,
|
dev@135
|
158 {provide: 'MediaRecorderFactory', useFactory: createMediaRecorderFactory},
|
dev@236
|
159 {provide: 'PiperRepoUri', useValue: 'assets/remote-extractors.json'},
|
dev@194
|
160 {provide: 'UrlResourceLifetimeManager', useFactory: createUrlResourceManager},
|
dev@284
|
161 {provide: 'ResourceReader', useFactory: createResourceReader},
|
dev@397
|
162 {provide: 'DimensionObservable', useFactory: createWindowDimensionObservable},
|
dev@493
|
163 RenderLoopService,
|
dev@493
|
164 NotificationService
|
dev@1
|
165 ],
|
angular-cli@0
|
166 bootstrap: [AppComponent]
|
angular-cli@0
|
167 })
|
dev@1
|
168 export class AppModule {
|
dev@1
|
169
|
dev@1
|
170 }
|