2018-06-19 16:43:33 +00:00
|
|
|
import { RecordingAdapter } from './RecordingAdapter';
|
|
|
|
import { downloadBlob, timestampString } from './Utils';
|
|
|
|
|
|
|
|
const logger = require('jitsi-meet-logger').getLogger(__filename);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* RecordingAdapter implementation that uses MediaRecorder
|
|
|
|
* (default browser encoding with Opus codec)
|
|
|
|
*/
|
|
|
|
export class OggAdapter extends RecordingAdapter {
|
|
|
|
|
2018-07-09 17:49:55 +00:00
|
|
|
/**
|
|
|
|
* Instance of MediaRecorder.
|
|
|
|
*/
|
2018-06-19 16:43:33 +00:00
|
|
|
_mediaRecorder = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements {@link RecordingAdapter#ensureInitialized()}.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
ensureInitialized() {
|
|
|
|
let p = null;
|
|
|
|
|
|
|
|
if (this._mediaRecorder === null) {
|
|
|
|
p = new Promise((resolve, error) => {
|
2018-07-09 17:49:55 +00:00
|
|
|
this._getAudioStream(0)
|
|
|
|
.then(stream => {
|
|
|
|
this._mediaRecorder = new MediaRecorder(stream);
|
|
|
|
this._mediaRecorder.ondataavailable
|
|
|
|
= e => this._saveMediaData(e.data);
|
|
|
|
resolve();
|
|
|
|
})
|
|
|
|
.catch(err => {
|
|
|
|
logger.error(`Error calling getUserMedia(): ${err}`);
|
|
|
|
error();
|
|
|
|
});
|
2018-06-19 16:43:33 +00:00
|
|
|
});
|
|
|
|
} else {
|
|
|
|
p = new Promise(resolve => {
|
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return p;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements {@link RecordingAdapter#start()}.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
start() {
|
|
|
|
return new Promise(resolve => {
|
|
|
|
this._mediaRecorder.start();
|
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements {@link RecordingAdapter#stop()}.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
stop() {
|
|
|
|
return new Promise(
|
|
|
|
resolve => {
|
|
|
|
this._mediaRecorder.onstop = () => resolve();
|
|
|
|
this._mediaRecorder.stop();
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Implements {@link RecordingAdapter#download()}.
|
|
|
|
*
|
|
|
|
* @inheritdoc
|
|
|
|
*/
|
|
|
|
download() {
|
|
|
|
if (this._recordedData !== null) {
|
|
|
|
const audioURL = window.URL.createObjectURL(this._recordedData);
|
|
|
|
|
|
|
|
downloadBlob(audioURL, `recording${timestampString()}.ogg`);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Callback for encoded data.
|
|
|
|
*
|
|
|
|
* @private
|
|
|
|
* @param {*} data - Encoded data.
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
_saveMediaData(data) {
|
|
|
|
this._recordedData = data;
|
|
|
|
}
|
|
|
|
}
|