Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DOM exception: failed to execute start on Media recorder: The
- MediaRecorder failed to start because there are no audio or video
- tracks available
- const recorder = yield select(getRecorder)
- yield call(recorder.startRecording)
- startRecording = () => {
- try {
- this.captureUserMedia((stream, error) => {
- try {
- if (error) {
- console.log(error)
- return
- }
- this.rtcRecorder.startRecording()
- this.recording = true
- } catch (err) {
- sendEmail(err, "inner startRecording failed", "support@gmail.com")
- console.log("inner startRecording ERROR: ", err)
- }
- });
- } catch (err) {
- sendEmail(err, "startRecording failed", "support@gmail.com")
- console.log("startRecording ERROR: ", err)
- }
- }
- captureUserMedia(callback) {
- var params = { audio: true, video: false };
- navigator.getUserMedia(params, callback, (error) => {
- // alert(JSON.stringify(error));
- console.log('USER MEDIA ERROR:: ' + JSON.stringify(error))
- callback(null, error)
- });
- };
- this.rtcRecorder.startRecording()
- var hiddenAudio = document.createElement('audio');
- hiddenAudio.srcObject = stream // this line is required to make sure stream tracks aren't stopped/released
- hiddenAudio.muted = true
- hiddenAudio.play()
- initialize = (callback) => {
- if (!!this.rtcRecorder) {
- console.log('Attempted to initialize an already initialized recorder but that's expected')
- return
- }
- console.log('initialize Recorder -- requestUserMedia')
- this.captureUserMedia((stream, error) => {
- if (error) {
- console.log('!!errror capturing user media!!')
- return callback && callback(error)
- }
- // TODO: detect if system can play webms
- // <-- smaller filesize
- // this.rtcRecorder = RecordRTC(stream, { recorderType: RecordRTC.StereoAudioRecorder, bitsPerSecond: 30000, numberOfAudioChannels: 1, mimeType: 'audio/wav' });
- try {
- // the MUAZ KHAN edits
- var hiddenAudio = document.createElement('audio');
- hiddenAudio.srcObject = stream // this line is required to make sure stream tracks aren't stopped/released
- hiddenAudio.muted = true
- hiddenAudio.play()
- this.rtcRecorder = RecordRTC(stream, { audio: 'true', mimeType: 'audio/webm', checkForInactiveTracks: 'true' });
- callback && callback(null)
- return true
- } catch (err) {
- sendEmail(err, "captureMedia (inner-most) startRecording failed", "support@gmail.com")
- console.log("captureMedia (inner-most) startRecording ERROR: ", err)
- callback && callback(null)
- return true
- }
- });
- };
- function* rootSaga() {
- const { payload: { isDemo } } = yield take(IS_DEMO_SET)
- const { payload: { bookKey } } = yield take(BOOK_KEY_SET)
- yield clog("isDemo: ", isDemo)
- yield clog("bookKey: ", bookKey)
- yield clog('Root Saga Started')
- const newBookKey = isDemo ? 'demo' : 'unclear'
- yield clog('Generating assessment... newBookKey:', newBookKey)
- const assessmentId = yield requestNewAssessment(newBookKey)
- .catch(e => e.request) // TODO
- yield clog('Assessment ID:', assessmentId)
- // if isMobileDevice, halt
- const isMobile = yield call(isMobileDevice)
- if (isMobile) {
- window.location.href = '/mobile_halt'
- take('ickkk')
- }
- // CREATE THE USER
- $.ajax({
- url: ('/auth/phil_setup_demo?book_key=' + bookKey),
- type: 'post',
- }).fail(function(xhr, status, err) {
- console.log(err)
- })
- /*
- ****************
- * watchers
- *****************
- */
- // yield* audioEffectsSaga()
- yield takeLatest(HEAR_RECORDING_CLICKED, function* () {
- yield put(setCurrentModal('modal-playback'))
- yield call(stopAudio)
- })
- // yield takeLatest(PERMISSIONS_ARROW_CLICKED, function* () {
- // yield call(playSound, '/audio/click_allow_button.mp3')
- // })
- /*
- ****************
- * main race
- *****************
- */
- yield clog('Race About To Start')
- while (true) {
- const {
- restartAssessment,
- recordingBlobArray,
- quit,
- } = yield race({
- restartAssessment: take(RESTART_RECORDING_CLICKED),
- recordingBlobArray: call(assessThenSubmitSaga, assessmentId),
- quit: take('QUIT_ASSESSMENT_AND_DESTROY'),
- })
- function* assessThenSubmitSaga(assessmentId) {
- const effects = []
- // TODO: convert this into a batched action
- yield put.resolve(setPageNumber(0))
- yield put.resolve(setQuestionNumber(1))
- yield put.resolve(setPrompt(
- PromptOptions.awaitingPrompt,
- ))
- yield put.resolve(setInComp(false))
- yield put.resolve(setHasRecordedSomething(false))
- yield put.resolve(setCurrentModal('no-modal'))
- yield put(setCurrentOverlay('no-overlay'))
- const permissionsGranted = yield* getMicPermissionsSaga() // blocks
- // TODO asap as possible
- // TODO: some loop here :)
- while (!permissionsGranted) {
- yield put(setCurrentOverlay('overlay-blocked-mic'))
- yield take('ickkkkk')
- return
- }
- yield put(setCurrentOverlay('no-overlay'))
- // permission was granted!!!!
- let recorder = yield select(getRecorder)
- yield call(recorder.initialize)
- yield put.resolve(setReaderState(
- ReaderStateOptions.awaitingStart,
- ))
- effects.push(
- yield fork(hideVolumeSaga),
- )
- // before assessment has started, clicking exit immediately quits app
- // I guess. We will probably change this
- const { exit } = yield race({
- exit: take(EXIT_CLICKED),
- startAssessment: take(START_RECORDING_CLICKED),
- })
- // const { exit, fake } = yield all([
- // race({
- // exit: take(EXIT_CLICKED),
- // startAssessment: take(START_RECORDING_CLICKED),
- // })
- // ])
- yield call(stopAudio)
- // the app will end :O
- if (exit) {
- yield* redirectToHomepage()
- }
- // now we start the assessment for real
- effects.push(
- yield takeLatest(EXIT_CLICKED, exitClick),
- )
- yield call(sendEmail, "Demo started", "Demo was started", "philesterman@gmail.com") // move here so don't break
- // TODO: convert the countdown to saga!!!!
- yield put.resolve(setPageNumber(1))
- yield put.resolve(setReaderState(
- ReaderStateOptions.countdownToStart,
- ))
- yield playSoundAsync('/audio/recording_countdown.mp3')
- if (!DEV_DISABLE_VOICE_INSTRUCTIONS) {
- let countdown = 3
- while (countdown > 0) {
- yield put(setCountdownValue(countdown))
- yield call(delay, 1000)
- countdown--
- }
- }
- // yield put(setCurrentSound('/audio/book_intro.mp3'))
- yield put.resolve(setCurrentModal('no-modal'))
- yield put.resolve(setReaderState(
- ReaderStateOptions.inProgress,
- ))
- // this ensures that effects are canceleld
- // while (true) {
- // const {exit} = yield race({
- // exit: take(EXIT_CLICKED),
- // assessmentResult: call(assessmentSaga),
- // })
- // if (exit) {
- // yield call(exitClick)
- // } else {
- // }
- // }
- // starts the recording assessment flow
- effects.push(
- yield fork(assessmentSaga),
- )
- export default function* assessmentSaga() {
- yield call(console.log, "here in assessmentSaga")
- // watchers!
- // TODO: refactor this into saga for referential integrity of recorder
- yield takeLatest(PAUSE_CLICKED, pauseAssessmentSaga)
- yield takeLatest(COMP_PAUSE_CLICKED, compPauseAssessmentSaga)
- yield takeLatest(RESUME_CLICKED, resumeAssessmentSaga)
- yield takeLatest(NEXT_PAGE_CLICKED, pageIncrementSaga)
- yield takeLatest(PREVIOUS_PAGE_CLICKED, pageDecrementSaga)
- // start recording the assessment audio
- const recorder = yield select(getRecorder)
- try {
- yield call(recorder.startRecording)
- yield put.resolve(setHasRecordedSomething(true))
- } catch (err) {
- yield clog("ERROR: ", err)
- yield call(sendEmail, err, "Recorder failed to start", "support@gmail.com") // move here so don't break
- }
- return { some: 'sick results' }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement