Mercurial > hg > ugly-duckling
changeset 135:262995cfd3e6
Bootstrap the app with the recorder service and component
author | Lucas Thompson <dev@lucas.im> |
---|---|
date | Mon, 20 Mar 2017 13:26:33 +0000 |
parents | 976087b98e72 |
children | 56160ef70799 612b75bb6227 81b83ed94831 |
files | src/app/app.component.html src/app/app.module.ts |
diffstat | 2 files changed, 42 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/app/app.component.html Mon Mar 20 13:26:23 2017 +0000 +++ b/src/app/app.component.html Mon Mar 20 13:26:33 2017 +0000 @@ -4,9 +4,9 @@ <span class="app-toolbar-filler"></span> <app-playback-control></app-playback-control> - <button md-icon-button> - <md-icon>mic_off</md-icon> - </button> + <ugly-recording-control + (finishedRecording)="onFileOpened($event)" + ></ugly-recording-control> <!-- This fills the remaining space of the current row --> <span class="app-toolbar-filler"></span>
--- a/src/app/app.module.ts Mon Mar 20 13:26:23 2017 +0000 +++ b/src/app/app.module.ts Mon Mar 20 13:26:33 2017 +0000 @@ -12,6 +12,15 @@ import { FeatureExtractionService } from "./services/feature-extraction/feature-extraction.service"; import { FeatureExtractionMenuComponent } from "./feature-extraction-menu/feature-extraction-menu.component"; import { ProgressSpinnerComponent } from "./progress-spinner/progress-spinner.component"; +import { + AudioRecorderService, + AudioInputProvider, + MediaRecorderConstructor, + MediaRecorder as IMediaRecorder, + MediaRecorderOptions, + ThrowingMediaRecorder, +} from "./services/audio-recorder/audio-recorder.service"; +import {RecordingControlComponent} from "./recording-control/recording-control.component"; export function createAudioContext(): AudioContext { return new ( @@ -24,12 +33,39 @@ return new Audio(); } +export function createAudioInputProvider(): AudioInputProvider { + if (navigator.mediaDevices && + typeof navigator.mediaDevices.getUserMedia === 'function') { + return () => navigator.mediaDevices.getUserMedia( + {audio: true, video: false} + ); + } else { + return () => Promise.reject('Recording is not supported in this browser.'); + } +} + +declare const MediaRecorder: { + prototype: IMediaRecorder; + new(stream: MediaStream, + options?: MediaRecorderOptions): IMediaRecorder; + isTypeSupported(mimeType: string): boolean; +}; + +export function createMediaRecorderFactory(): MediaRecorderConstructor { + if (typeof MediaRecorder !== 'undefined') { + return MediaRecorder; + } else { + return ThrowingMediaRecorder; + } +} + @NgModule({ declarations: [ AppComponent, WaveformComponent, AudioFileOpenComponent, PlaybackControlComponent, + RecordingControlComponent, FeatureExtractionMenuComponent, ProgressSpinnerComponent ], @@ -43,7 +79,10 @@ {provide: HTMLAudioElement, useFactory: createAudioElement}, // TODO use something more generic than HTMLAudioElement {provide: 'AudioContext', useFactory: createAudioContext}, // use a string token, Safari doesn't seem to like AudioContext AudioPlayerService, + {provide: 'AudioInputProvider', useFactory: createAudioInputProvider}, + AudioRecorderService, FeatureExtractionService, + {provide: 'MediaRecorderFactory', useFactory: createMediaRecorderFactory}, {provide: 'PiperRepoUri', useValue: 'assets/remote-plugins.json'} ], bootstrap: [AppComponent]