dev@497: import {BrowserModule} from '@angular/platform-browser'; dev@70: import {NgModule} from '@angular/core'; dev@497: import {FormsModule} from '@angular/forms'; dev@497: import {HttpModule} from '@angular/http'; angular-cli@0: dev@497: import {AppComponent} from './app.component'; dev@497: import {WaveformComponent} from './visualisations/waveform/waveform.component'; dev@497: import {AudioFileOpenComponent} from './audio-file-open/audio-file-open.component'; dev@497: import {PlaybackControlComponent} from './playback-control/playback-control.component'; dev@191: import { dev@191: AudioPlayerService, dev@236: ResourceReader dev@236: } from './services/audio-player/audio-player.service'; dev@497: import {FeatureExtractionService} from './services/feature-extraction/feature-extraction.service'; dev@497: import {FeatureExtractionMenuComponent} from './feature-extraction-menu/feature-extraction-menu.component'; dev@497: import {ProgressSpinnerComponent} from './progress-spinner/progress-spinner.component'; dev@135: import { dev@497: AudioInputProvider, dev@135: AudioRecorderService, dev@497: MediaRecorder as IMediaRecorder, dev@135: MediaRecorderConstructor, dev@446: MediaRecorderOptions dev@236: } from './services/audio-recorder/audio-recorder.service'; dev@236: import {RecordingControlComponent} from './recording-control/recording-control.component'; dev@236: import {NotebookFeedComponent} from './notebook-feed/notebook-feed.component'; dev@236: import {AnalysisItemComponent} from './analysis-item/analysis-item.component'; dev@236: import {ProgressBarComponent} from './progress-bar/progress-bar'; dev@236: import {UglyMaterialModule} from './ugly-material.module'; dev@284: import {Observable} from 'rxjs/Observable'; dev@347: import {PlayHeadComponent} from './playhead/playhead.component'; dev@347: import {LivePlayHeadComponent} from './playhead/live-play-head.component'; dev@378: import {CurveComponent} from './visualisations/curve/curve.component'; dev@378: import {TracksComponent} from './visualisations/tracks/tracks.components'; dev@378: import {NotesComponent} from './visualisations/notes/notes.component'; cannam@480: import {RegionsComponent} from './visualisations/regions/regions.component'; dev@381: import {InstantsComponent} from './visualisations/instants/instants.component'; dev@382: import {GridComponent} from './visualisations/grid/grid.component'; dev@393: import {VerticalScaleComponent} from './visualisations/vertical-scale.component'; dev@393: import {CrossHairInspectorComponent} from './visualisations/cross-hair-inspector.component'; dev@397: import {RenderLoopService} from './services/render-loop/render-loop.service'; dev@411: import {WavesPlayHeadComponent} from './playhead/waves-ui-play-head.component'; dev@497: import {ActionTrayComponent} from './actions/action-tray.component'; dev@446: import {RecordRtcMediaRecorder} from './services/audio-recorder/RecordRtcMediaRecorder'; dev@493: import {NotificationService} from './services/notifications/notifications.service'; dev@497: import {UrlResourceLifetimeManager} from "./services/File"; dev@31: dev@93: export function createAudioContext(): AudioContext { dev@31: return new ( dev@31: (window as any).AudioContext dev@31: || (window as any).webkitAudioContext dev@31: )(); dev@31: } angular-cli@0: dev@94: export function createAudioElement(): HTMLAudioElement { dev@94: return new Audio(); dev@94: } dev@94: dev@135: export function createAudioInputProvider(): AudioInputProvider { dev@135: if (navigator.mediaDevices && dev@135: typeof navigator.mediaDevices.getUserMedia === 'function') { dev@135: return () => navigator.mediaDevices.getUserMedia( dev@135: {audio: true, video: false} dev@135: ); dev@135: } else { dev@135: return () => Promise.reject('Recording is not supported in this browser.'); dev@135: } dev@135: } dev@135: dev@135: declare const MediaRecorder: { dev@135: prototype: IMediaRecorder; dev@135: new(stream: MediaStream, dev@135: options?: MediaRecorderOptions): IMediaRecorder; dev@135: isTypeSupported(mimeType: string): boolean; dev@135: }; dev@135: dev@135: export function createMediaRecorderFactory(): MediaRecorderConstructor { dev@135: if (typeof MediaRecorder !== 'undefined') { dev@135: return MediaRecorder; dev@135: } else { dev@446: return RecordRtcMediaRecorder; dev@135: } dev@135: } dev@135: dev@194: export function createUrlResourceManager(): UrlResourceLifetimeManager { dev@194: return { dev@194: createUrlToResource: (resource: File | Blob): string => { dev@194: return URL.createObjectURL(resource); dev@194: }, dev@194: revokeUrlToResource: (url: string) => { dev@194: URL.revokeObjectURL(url); dev@194: } dev@194: }; dev@194: } dev@191: dev@236: export function createResourceReader(): ResourceReader { dev@195: return (resource) => { dev@195: return new Promise((res, rej) => { dev@195: const reader: FileReader = new FileReader(); dev@195: reader.onload = (event: any) => { dev@195: res(event.target.result); dev@195: }; dev@195: reader.onerror = (event) => { dev@195: rej(event.message); dev@195: }; dev@195: reader.readAsArrayBuffer(resource); dev@195: }); dev@233: }; dev@195: } dev@192: dev@284: export interface Dimension { dev@284: width: number; dev@284: height: number; dev@284: } dev@284: export function createWindowDimensionObservable(): Observable { dev@284: return Observable.fromEvent(window, 'resize', () => ({ dev@284: height: window.innerHeight, dev@284: width: window.innerWidth dev@284: })).share(); dev@284: } angular-cli@0: @NgModule({ angular-cli@0: declarations: [ dev@1: AppComponent, dev@13: WaveformComponent, dev@21: AudioFileOpenComponent, dev@44: PlaybackControlComponent, dev@135: RecordingControlComponent, dev@115: FeatureExtractionMenuComponent, dev@172: ProgressSpinnerComponent, dev@172: AnalysisItemComponent, dev@233: NotebookFeedComponent, dev@347: ProgressBarComponent, dev@347: PlayHeadComponent, dev@359: LivePlayHeadComponent, dev@372: CurveComponent, dev@378: TracksComponent, dev@381: NotesComponent, cannam@480: RegionsComponent, dev@382: InstantsComponent, dev@388: GridComponent, dev@393: VerticalScaleComponent, dev@407: CrossHairInspectorComponent, dev@423: WavesPlayHeadComponent, dev@423: ActionTrayComponent angular-cli@0: ], angular-cli@0: imports: [ angular-cli@0: BrowserModule, angular-cli@0: FormsModule, dev@3: HttpModule, dev@236: UglyMaterialModule angular-cli@0: ], dev@1: providers: [ dev@94: {provide: HTMLAudioElement, useFactory: createAudioElement}, // TODO use something more generic than HTMLAudioElement dev@94: {provide: 'AudioContext', useFactory: createAudioContext}, // use a string token, Safari doesn't seem to like AudioContext dev@40: AudioPlayerService, dev@135: {provide: 'AudioInputProvider', useFactory: createAudioInputProvider}, dev@135: AudioRecorderService, dev@70: FeatureExtractionService, dev@135: {provide: 'MediaRecorderFactory', useFactory: createMediaRecorderFactory}, dev@236: {provide: 'PiperRepoUri', useValue: 'assets/remote-extractors.json'}, dev@194: {provide: 'UrlResourceLifetimeManager', useFactory: createUrlResourceManager}, dev@284: {provide: 'ResourceReader', useFactory: createResourceReader}, dev@397: {provide: 'DimensionObservable', useFactory: createWindowDimensionObservable}, dev@493: RenderLoopService, dev@493: NotificationService dev@1: ], angular-cli@0: bootstrap: [AppComponent] angular-cli@0: }) dev@1: export class AppModule { dev@1: dev@1: }