dev@445: /** dev@445: * Created by lucast on 26/06/2017. dev@445: */ dev@445: import { dev@445: BlobEvent as IBlobEvent, dev@445: MediaRecorder, dev@445: MediaRecorderErrorEvent, dev@445: RecordingState dev@445: } from './audio-recorder.service'; dev@445: import * as RecordRtc from 'recordrtc'; dev@445: dev@445: // safari doesn't implement BlobEvent... this should do dev@445: class BlobEvent extends Event implements IBlobEvent { dev@445: data: Blob; dev@445: dev@445: constructor(data: Blob) { dev@445: super('blob'); dev@445: this.data = data; dev@445: } dev@445: } dev@445: dev@445: export class RecordRtcMediaRecorder implements MediaRecorder { dev@445: mimeType: string; dev@445: state: RecordingState; dev@445: stream: MediaStream; dev@445: ignoreMutedMedia: boolean; dev@445: videoBitsPerSecond: number; dev@445: audioBitsPerSecond: number; dev@445: onstart: (evt: Event) => void; dev@445: onstop: (evt: Event) => void; dev@445: ondataavailable: (evt: BlobEvent) => void; dev@445: onpause: (evt: Event) => void; dev@445: onresume: (evt: Event) => void; dev@445: onerror: (evt: MediaRecorderErrorEvent) => void; dev@445: dev@445: private recorder: any; // TODO RecordRTC typings? dev@445: dev@445: static isTypeSupported(mimeType: string): boolean { dev@445: return mimeType === 'audio/wav'; dev@445: } dev@445: dev@445: constructor(stream: MediaStream) { dev@445: this.state = 'inactive'; dev@445: this.stream = stream; dev@445: this.recorder = RecordRtc(stream, { dev@445: type: 'audio', dev@445: recorderType: RecordRtc.StereoAudioRecorder dev@445: }); dev@445: } dev@445: dev@445: dev@445: pause(): void { dev@445: this.state = 'paused'; dev@445: this.recorder.pauseRecording(); dev@445: } dev@445: dev@445: requestData(): void { dev@445: // could probably implement this, but it isn't actually used in the app dev@445: throw new Error('Not implemented'); dev@445: } dev@445: dev@445: resume(): void { dev@445: this.state = 'recording'; dev@445: this.recorder.resumeRecording(); dev@445: } dev@445: dev@445: start(timeslice?: number): void { dev@445: this.state = 'recording'; dev@445: this.recorder.startRecording(); dev@445: } dev@445: dev@445: stop(): void { dev@445: this.state = 'inactive'; dev@445: this.recorder.stopRecording(() => { dev@445: if (this.ondataavailable) { dev@445: const blob = this.recorder.getBlob(); dev@445: this.mimeType = blob.type; dev@445: this.ondataavailable(new BlobEvent(blob)); dev@445: } dev@445: if (this.onstop) { dev@445: this.onstop(new Event('stop')); dev@445: } dev@445: }); dev@445: } dev@445: }