annotate src/app/services/audio-recorder/RecordRtcMediaRecorder.ts @ 509:041468f553e1 tip master

Merge pull request #57 from LucasThompson/fix/session-stack-max-call-stack Fix accidental recursion in PersistentStack
author Lucas Thompson <LucasThompson@users.noreply.github.com>
date Mon, 27 Nov 2017 11:04:30 +0000
parents a9fb6590a3dc
children
rev   line source
dev@445 1 /**
dev@445 2 * Created by lucast on 26/06/2017.
dev@445 3 */
dev@445 4 import {
dev@445 5 BlobEvent as IBlobEvent,
dev@445 6 MediaRecorder,
dev@445 7 MediaRecorderErrorEvent,
dev@445 8 RecordingState
dev@445 9 } from './audio-recorder.service';
dev@445 10 import * as RecordRtc from 'recordrtc';
dev@445 11
dev@445 12 // safari doesn't implement BlobEvent... this should do
dev@445 13 class BlobEvent extends Event implements IBlobEvent {
dev@445 14 data: Blob;
dev@445 15
dev@445 16 constructor(data: Blob) {
dev@445 17 super('blob');
dev@445 18 this.data = data;
dev@445 19 }
dev@445 20 }
dev@445 21
dev@445 22 export class RecordRtcMediaRecorder implements MediaRecorder {
dev@445 23 mimeType: string;
dev@445 24 state: RecordingState;
dev@445 25 stream: MediaStream;
dev@445 26 ignoreMutedMedia: boolean;
dev@445 27 videoBitsPerSecond: number;
dev@445 28 audioBitsPerSecond: number;
dev@445 29 onstart: (evt: Event) => void;
dev@445 30 onstop: (evt: Event) => void;
dev@445 31 ondataavailable: (evt: BlobEvent) => void;
dev@445 32 onpause: (evt: Event) => void;
dev@445 33 onresume: (evt: Event) => void;
dev@445 34 onerror: (evt: MediaRecorderErrorEvent) => void;
dev@445 35
dev@445 36 private recorder: any; // TODO RecordRTC typings?
dev@445 37
dev@445 38 static isTypeSupported(mimeType: string): boolean {
dev@445 39 return mimeType === 'audio/wav';
dev@445 40 }
dev@445 41
dev@445 42 constructor(stream: MediaStream) {
dev@445 43 this.state = 'inactive';
dev@445 44 this.stream = stream;
dev@445 45 this.recorder = RecordRtc(stream, {
dev@445 46 type: 'audio',
dev@445 47 recorderType: RecordRtc.StereoAudioRecorder
dev@445 48 });
dev@445 49 }
dev@445 50
dev@445 51
dev@445 52 pause(): void {
dev@445 53 this.state = 'paused';
dev@445 54 this.recorder.pauseRecording();
dev@445 55 }
dev@445 56
dev@445 57 requestData(): void {
dev@445 58 // could probably implement this, but it isn't actually used in the app
dev@445 59 throw new Error('Not implemented');
dev@445 60 }
dev@445 61
dev@445 62 resume(): void {
dev@445 63 this.state = 'recording';
dev@445 64 this.recorder.resumeRecording();
dev@445 65 }
dev@445 66
dev@445 67 start(timeslice?: number): void {
dev@445 68 this.state = 'recording';
dev@445 69 this.recorder.startRecording();
dev@445 70 }
dev@445 71
dev@445 72 stop(): void {
dev@445 73 this.state = 'inactive';
dev@445 74 this.recorder.stopRecording(() => {
dev@445 75 if (this.ondataavailable) {
dev@445 76 const blob = this.recorder.getBlob();
dev@445 77 this.mimeType = blob.type;
dev@445 78 this.ondataavailable(new BlobEvent(blob));
dev@445 79 }
dev@445 80 if (this.onstop) {
dev@445 81 this.onstop(new Event('stop'));
dev@445 82 }
dev@445 83 });
dev@445 84 }
dev@445 85 }