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 }
|