Create JS lib for record audio and oral expression question - refs BT#12615

pull/2487/head
Angel Fernando Quiroz Campos 8 years ago
parent 7a9a04cb96
commit 80151243e0
  1. 2
      main/document/record_audio.php
  2. 1
      main/exercise/exercise_submit.php
  3. 2
      main/inc/ajax/record_audio_rtc.ajax.php
  4. 198
      main/inc/lib/javascript/record_audio/record_audio.js
  5. 182
      main/template/default/document/record_audio.tpl
  6. 168
      main/template/default/exercise/oral_expression.tpl

@ -142,6 +142,8 @@ $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_JS_PATH).'rtc/RecordR
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'wami-recorder/recorder.js"></script>';
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'wami-recorder/gui.js"></script>';
$htmlHeadXtra[] = '<script type="text/javascript" src="'.api_get_path(WEB_LIBRARY_PATH).'swfobject/swfobject.js"></script>';
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'swfobject/swfobject.js"></script>';
$htmlHeadXtra[] = api_get_js('record_audio/record_audio.js');
$actions = Display::toolbarButton(
get_lang('BackTo').' '.get_lang('DocumentsOverview'),

@ -69,6 +69,7 @@ if (api_get_setting('enable_record_audio') === 'true') {
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'wami-recorder/recorder.js"></script>';
$htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'wami-recorder/gui.js"></script>';
$htmlHeadXtra[] = '<script type="text/javascript" src="'.api_get_path(WEB_LIBRARY_PATH).'swfobject/swfobject.js"></script>';
$htmlHeadXtra[] = api_get_js('record_audio/record_audio.js');
}
$template = new Template();

@ -33,7 +33,7 @@ $dirBaseDocuments = api_get_path(SYS_COURSE_PATH).$courseInfo['path'].'/document
$saveDir = $dirBaseDocuments.$audioDir;
if (!is_dir($saveDir)) {
DocumentManager::createDefaultAudioFolder($courseInfo);
mkdir($saveDir, api_get_permissions_for_new_directories(), true);
}
$documentPath = $saveDir.'/'.$audioFileName;

@ -0,0 +1,198 @@
/* For licensing terms, see /license.txt */
window.RecordAudio = (function () {
function useRecordRTC(rtcInfo, fileName) {
$(rtcInfo.blockId).show();
var mediaConstraints = {audio: true},
recordRTC = null,
btnStart = $(rtcInfo.btnStartId),
btnPause = $(rtcInfo.btnPauseId),
btnPlay = $(rtcInfo.btnPlayId),
btnStop = $(rtcInfo.btnStopId),
btnSave = $(rtcInfo.btnSaveId),
tagAudio = $(rtcInfo.plyrPreviewId);
btnStart.on('click', function () {
if (!fileName) {
fileName = $('#audio-title-rtc').val();
if (!$.trim(fileName)) {
return;
}
}
navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia;
function successCallback(stream) {
recordRTC = RecordRTC(stream, {
numberOfAudioChannels: 1,
type: 'audio'
});
recordRTC.startRecording();
$('#audio-title-rtc').prop('readonly', true);
btnSave.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', false).removeClass('hidden');
btnStart.prop('disabled', true).addClass('hidden');
btnPause.prop('disabled', false).removeClass('hidden');
tagAudio.removeClass('show').addClass('hidden');
}
function errorCallback(error) {
alert(error.message);
}
if (navigator.getUserMedia) {
navigator.getUserMedia(mediaConstraints, successCallback, errorCallback);
} else if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia(mediaConstraints)
.then(successCallback)
.error(errorCallback);
}
});
btnPause.on('click', function () {
if (!recordRTC) {
return;
}
btnPause.prop('disabled', true).addClass('hidden');
btnPlay.prop('disabled', false).removeClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
recordRTC.pauseRecording();
});
btnPlay.on('click', function () {
if (!recordRTC) {
return;
}
btnPlay.prop('disabled', true).addClass('hidden');
btnPause.prop('disabled', false).removeClass('hidden');
btnStop.prop('disabled', false).removeClass('hidden');
recordRTC.resumeRecording();
});
btnStop.on('click', function () {
if (!recordRTC) {
return;
}
recordRTC.stopRecording(function (audioURL) {
btnStart.prop('disabled', false).removeClass('hidden');
btnPause.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
btnSave.prop('disabled', false).removeClass('hidden');
tagAudio
.removeClass('hidden')
.addClass('show')
.prop('src', audioURL);
});
});
btnSave.on('click', function () {
if (!recordRTC) {
return;
}
var recordedBlob = recordRTC.getBlob();
if (!recordedBlob) {
return;
}
var fileExtension = '.' + recordedBlob.type.split('/')[1];
var formData = new FormData();
formData.append('audio_blob', recordedBlob, fileName + fileExtension);
formData.append('audio_dir', rtcInfo.directory);
$.ajax({
url: _p.web_ajax + 'record_audio_rtc.ajax.php',
data: formData,
processData: false,
contentType: false,
type: 'POST'
}).then(function (fileUrl) {
if (!fileUrl) {
return;
}
btnSave.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
btnStart.prop('disabled', false).removeClass('hidden');
if ($('#audio-title-rtc').length) {
$('#audio-title-rtc').prop('readonly', false);
window.location.reload();
}
});
});
}
function useWami(wamiInfo, fileName) {
$(wamiInfo.blockId).show();
if (!fileName) {
$('#btn-activate-wami').on('click', function (e) {
e.preventDefault();
fileName = $('#audio-title-wami').val();
if (!$.trim(fileName)) {
return;
}
$('#audio-title-wami').prop('readonly', true);
$(this).prop('disabled', true);
Wami.setup({
id: wamiInfo.containerId,
onReady : setupGUI,
swfUrl: _p.web_lib + 'wami-recorder/Wami.swf'
});
});
} else {
Wami.setup({
id: wamiInfo.containerId,
onReady: setupGUI,
swfUrl: _p.web_lib + 'wami-recorder/Wami.swf'
});
}
function setupGUI() {
var gui = new Wami.GUI({
id: wamiInfo.containerId,
singleButton: true,
recordUrl: _p.web_ajax + 'record_audio_wami.ajax.php?' + $.param({
waminame: fileName + '.wav',
wamidir: wamiInfo.directory,
wamiuserid: wamiInfo.userId
}),
buttonUrl: _p.web_lib + 'wami-recorder/buttons.png',
buttonNoUrl: _p.web_img + 'blank.gif'
});
gui.setPlayEnabled(false);
}
}
return {
init: function (rtcInfo, wamiInfo, fileName) {
$(rtcInfo.blockId + ', ' + wamiInfo.blockId).hide();
var webRTCIsEnabled = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia ||
navigator.mediaDevices.getUserMedia;
if (webRTCIsEnabled) {
useRecordRTC(rtcInfo, fileName);
return;
}
useWami(wamiInfo, fileName);
}
}
})();

@ -54,167 +54,25 @@
</div>
<script>
$(document).on('ready', function() {
function useRecordRTC() {
$('#record-audio-recordrtc').show();
var audioTitle = '';
var mediaConstraints = {audio: true},
recordRTC = null,
btnStart = $('#btn-start-record'),
btnStop = $('#btn-stop-record'),
btnSave = $('#btn-save-record'),
tagAudio = $('#record-preview');
btnStart.on('click', function () {
audioTitle = $('#audio-title-rtc').val();
if (!$.trim(audioTitle)) {
return;
}
navigator.getUserMedia = navigator.getUserMedia ||
navigator.mozGetUserMedia ||
navigator.webkitGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia(mediaConstraints, successCallback, errorCallback);
} else if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia(mediaConstraints)
.then(successCallback).error(errorCallback);
}
function successCallback(stream) {
recordRTC = RecordRTC(stream, {
numberOfAudioChannels: 1,
type: 'audio'
});
recordRTC.startRecording();
$('#audio-title-rtc').prop('readonly', true);
btnSave.prop('disabled', true);
btnStop.prop('disabled', false);
btnStart.prop('disabled', true);
tagAudio.removeClass('show').addClass('hidden');
}
function errorCallback(error) {
alert(error.message);
}
});
btnStop.on('click', function () {
if (!recordRTC) {
return;
}
recordRTC.stopRecording(function (audioURL) {
btnStart.prop('disabled', false);
btnStop.prop('disabled', true);
btnSave.prop('disabled', false);
tagAudio
.removeClass('hidden')
.addClass('show')
.prop('src', audioURL);
});
});
btnSave.on('click', function () {
if (!recordRTC) {
return;
}
var recordedBlob = recordRTC.getBlob();
if (!recordedBlob) {
return;
}
var fileName = audioTitle,
fileExtension = '.' + recordedBlob.type.split('/')[1];
var formData = new FormData();
formData.append('audio_blob', recordedBlob, audioTitle + fileExtension);
formData.append('audio_dir', '{{ directory }}');
$.ajax({
url: '{{ _p.web_ajax }}record_audio_rtc.ajax.php',
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function (fileURL) {
if (!fileURL) {
return;
}
$('#audio-title-rtc').prop('readonly', false);
btnSave.prop('disabled', true);
btnStop.prop('disabled', true);
btnStart.prop('disabled', false);
window.location.reload();
}
});
});
}
function useWami() {
$('#record-audio-wami').show();
var audioTitle = '';
$('#btn-activate-wami').on('click', function (e) {
e.preventDefault();
audioTitle = $('#audio-title-wami').val();
if (!$.trim(audioTitle)) {
return;
}
$('#audio-title-wami').prop('readonly', true);
$(this).prop('disabled', true);
Wami.setup({
id : "record-audio-wami-container",
onReady : setupGUI,
swfUrl: '{{ _p.web_lib }}wami-recorder/Wami.swf'
});
});
function setupGUI() {
var gui = new Wami.GUI({
id : 'record-audio-wami-container',
singleButton : true,
recordUrl : '{{ _p.web_ajax }}record_audio_wami.ajax.php?' + $.param({
waminame: audioTitle + '.wav',
wamidir: '{{ directory }}',
wamiuserid: {{ user_id }}
}),
buttonUrl : '{{ _p.web_lib }}wami-recorder/buttons.png',
buttonNoUrl: '{{ _p.web_img }}blank.gif',
onRecordFinish: function() {
window.location.reload();
}
});
gui.setPlayEnabled(false);
}
}
$('#record-audio-recordrtc, #record-audio-wami').hide();
var webRTCIsEnabled = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia ||
navigator.mediaDevices.getUserMedia;
if (webRTCIsEnabled) {
useRecordRTC();
return;
}
useWami();
$(document).on('ready', function () {
RecordAudio.init(
{
blockId: '#record-audio-recordrtc',
btnStartId: '#btn-start-record',
btnPauseId: '#btn-pause-record',
btnPlayId: '#btn-play-record',
btnStopId: '#btn-stop-record',
btnSaveId: '#btn-save-record',
plyrPreviewId: '#record-preview',
directory: '{{ directory }}'
},
{
blockId: '#record-audio-wami',
containerId: 'record-audio-wami-container',
directory: '{{ directory }}',
userId: {{ user_id }}
},
null
);
});
</script>

@ -37,158 +37,20 @@
<script>
$(document).on('ready', function () {
function useRecordRTC() {
$('#record-audio-recordrtc-{{ question_id }}').show();
var mediaConstraints = {audio: true},
recordRTC = null,
btnStart = $('#btn-start-record-{{ question_id }}'),
btnPause = $('#btn-pause-record-{{ question_id }}'),
btnPlay = $('#btn-play-record-{{ question_id }}'),
btnStop = $('#btn-stop-record-{{ question_id }}'),
btnSave = $('#btn-save-record-{{ question_id }}'),
tagAudio = $('#record-preview-{{ question_id }}');
btnStart.on('click', function () {
navigator.getUserMedia = navigator.getUserMedia ||
navigator.mozGetUserMedia ||
navigator.webkitGetUserMedia;
if (navigator.getUserMedia) {
navigator.getUserMedia(mediaConstraints, successCallback, errorCallback);
} else if (navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia(mediaConstraints)
.then(successCallback).error(errorCallback);
}
function successCallback(stream) {
recordRTC = RecordRTC(stream, {
numberOfAudioChannels: 1,
type: 'audio'
});
recordRTC.startRecording();
btnSave.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', false).removeClass('hidden');
btnStart.prop('disabled', true).addClass('hidden');
btnPause.prop('disabled', false).removeClass('hidden');
tagAudio.removeClass('show').addClass('hidden');
}
function errorCallback(error) {
alert(error.message);
}
});
btnPause.on('click', function () {
if (!recordRTC) {
return;
}
btnPause.prop('disabled', true).addClass('hidden');
btnPlay.prop('disabled', false).removeClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
recordRTC.pauseRecording();
});
btnPlay.on('click', function () {
if (!recordRTC) {
return;
}
btnPlay.prop('disabled', true).addClass('hidden');
btnPause.prop('disabled', false).removeClass('hidden');
btnStop.prop('disabled', false).removeClass('hidden');
recordRTC.resumeRecording();
});
btnStop.on('click', function () {
if (!recordRTC) {
return;
}
recordRTC.stopRecording(function (audioURL) {
btnStart.prop('disabled', false).removeClass('hidden');
btnPause.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
btnSave.prop('disabled', false).removeClass('hidden');
tagAudio
.removeClass('hidden')
.addClass('show')
.prop('src', audioURL);
});
});
// Download button
btnSave.on('click', function () {
if (!recordRTC) {
return;
}
var recordedBlob = recordRTC.getBlob();
if (!recordedBlob) {
return;
}
var fileName = '{{ file_name }}',
fileExtension = '.' + recordedBlob.type.split('/')[1];
var formData = new FormData();
formData.append('audio_blob', recordedBlob, fileName + fileExtension);
formData.append('audio_dir', '{{ directory }}');
$.ajax({
url: '{{ _p.web_ajax }}record_audio_rtc.ajax.php',
data: formData,
processData: false,
contentType: false,
type: 'POST'
}).then(function () {
btnSave.prop('disabled', true).addClass('hidden');
btnStop.prop('disabled', true).addClass('hidden');
btnStart.prop('disabled', false).removeClass('hidden');
});
});
}
function useWami() {
$('#record-audio-wami-{{ question_id }}').show();
Wami.setup({
id: "record-audio-wami-container-{{ question_id }}",
onReady: setupGUI,
swfUrl: '{{ _p.web_lib }}wami-recorder/Wami.swf'
});
function setupGUI() {
var gui = new Wami.GUI({
id: 'record-audio-wami-container-{{ question_id }}',
singleButton: true,
recordUrl: '{{ _p.web_ajax }}record_audio_wami.ajax.php?' + $.param({
waminame: '{{ file_name }}.wav',
wamidir: '{{ directory }}',
wamiuserid: {{ user_id }}
}),
buttonUrl: '{{ _p.web_lib }}wami-recorder/buttons.png',
buttonNoUrl: '{{ _p.web_img }}blank.gif'
}
);
gui.setPlayEnabled(false);
}
}
$('#record-audio-recordrtc-{{ question_id }}, #record-audio-wami-{{ question_id }}').hide();
var webRTCIsEnabled = navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.getUserMedia ||
navigator.mediaDevices.getUserMedia;
if (webRTCIsEnabled) {
useRecordRTC();
return;
}
useWami();
RecordAudio.init({
blockId: '#record-audio-recordrtc-{{ question_id }}',
btnStartId: '#btn-start-record-{{ question_id }}',
btnPauseId: '#btn-pause-record-{{ question_id }}',
btnPlayId: '#btn-play-record-{{ question_id }}',
btnStopId: '#btn-stop-record-{{ question_id }}',
btnSaveId: '#btn-save-record-{{ question_id }}',
plyrPreviewId: '#record-preview-{{ question_id }}',
directory: '{{ directory }}'
}, {
blockId: '#record-audio-wami-{{ question_id }}',
containerId: 'record-audio-wami-container-{{ question_id }}',
directory: '{{ directory }}',
userId: {{ user_id }}
}, '{{ file_name }}');
});
</script>

Loading…
Cancel
Save