cordova.define(plugin_name, function(require, exports, module) {
// TODO: remove -> end
+ function MediaError (code, msg) {
+ Object.defineProperties(this, {
+ code: {
+ value: code || null,
+ writable: false
+ },
+ message: {
+ value: msg || "",
+ writable: false
+ }
+ });
+ }
+ Object.assign(MediaError, window.MediaError);
var audioObjects = {};
var recorder = null;
var audioContext = window.AudioContext || window.webkitAudioContext;
var context = new audioContext();
- function Recorder(_filename) {
+ function Recorder(_filename, _errorCallback) {
var recorder = null;
var recording = false;
var recordingLength = 0;
var sampleRate = null;
var filename = _filename;
var audioBlob = null;
- var leftchannel = [];
- var rightchannel = [];
+ var leftchannel;
+ var rightchannel;
+ var errorCallback = _errorCallback;
this.rec = function(){
if (navigator.mediaDevices.getUserMedia){
var bufferSize = 2048;
recorder = context.createScriptProcessor(bufferSize, 2, 2);
+ rightchannel = [];
+ leftchannel = [];
recorder.onaudioprocess = function(sample){
if (!recording) {
return;
}
function onsuccess(dir) {
- var recFile = dir.createFile(filename);
- if (recFile != null) {
- recFile.openStream('w', function (fs) {
- fs.writeBytes(arr);
- fs.close();
- }, function (error) {
- console.log('Error ' + error.message);
- }, 'UTF-8');
+ var recFile
+ try {
+ recFile = dir.createFile(filename);
+ if (recFile != null) {
+ recFile.openStream('w', function (fs) {
+ try {
+ fs.writeBytes(arr);
+ fs.close();
+ } catch (error) {
+ errorCallback(new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
+ }
+ }, function (error) {
+ console.log('Failed to open stream error: ' + error.message);
+ errorCallback(new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
+ }, 'UTF-8');
+ }
+ } catch (error) {
+ console.log('Error during saving record to file');
+ errorCallback(new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
}
}
function onerror(error) {
console.log('The error ' + error + ' occurred when resolving documents folder');
+ errorCallback(new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
}
try {
tizen.filesystem.resolve('documents', onsuccess, onerror, 'rw');
}
catch(error) {
- console.log('Caught error ' + error);
+ console.log('Caught error during documents folder resolve: ' + error.message);
+ errorCallback(new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
}
}
console.log('media::create() - id =' + id + ', src =' + src);
- recorder = new Recorder(src);
+ recorder = new Recorder(src, function(error) {
+ console.log('Recorder error callback');
+ Media.onStatus(id, Media.MEDIA_ERROR, error);
+ });
audioObjects[id] = new Audio();
audioObjects[id].isReady = false;
audioObjects[id].onErrorCB = function (event) {
var err = event.srcElement.error.code === MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED ?
- { code: MediaError.MEDIA_ERR_ABORTED } :
+ new MediaError(MediaError.MEDIA_ERR_ABORTED) :
event.srcElement.error;
- Object.freeze(err);
console.log('media::onErrorCB() - MEDIA_ERROR -> ' + err);
Media.onStatus(id, Media.MEDIA_ERROR, err);
- if (errorCallback) {
- errorCallback(err);
- }
};
audioObjects[id].onPlayCB = function () {
audioObjects[id].isReady = true;
if (!audioObjects[id].src) {
- //assigning src sets playbackRate to default value equal to 1
- //so if playbackRate was set before first run of play() function
- //it should be saved and restored.
- var rate = audioObjects[id].playbackRate;
+ var setSrc = function(id, src) {
+ //assigning src sets playbackRate to default value equal to 1
+ //so if playbackRate was set before first run of play() function
+ //it should be saved and restored.
+ var rate = audioObjects[id].playbackRate;
+
+ audioObjects[id].src = src;
+ audioObjects[id].playbackRate = rate;
+ };
+
+ if(RegExp('^((file\:\/\/)|(/)).*').test(src)) {
+ setSrc(id,src);
+ return;
+ }
- audioObjects[id].src = src;
- audioObjects[id].playbackRate = rate;
- return;
+ if(!RegExp('.*!(\/\/).*').test(src)) {
+ try {
+ tizen.filesystem.resolve('documents', function(dir) {
+ setSrc(id, dir.toURI() + '/' + src);
+ }, function(error) {
+ console.log('Documents filesystem resolve failed');
+ Media.onStatus(id, Media.MEDIA_ERROR, new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
+ }, 'r');
+ } catch (error) {
+ console.log('Caught error during documents folder resolve: ' + error.message);
+ Media.onStatus(id, Media.MEDIA_ERROR, new MediaError(MediaError.MEDIA_ERR_ABORTED, error.message));
+ }
+ return;
+ } else {
+ setSrc(id, src);
+ }
}
audioObjects[id].play();
console.log('media::stopPlayingAudio() - MEDIA_STATE -> MEDIA_STOPPED');
- audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
- audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
- audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
- audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
- audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
- audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
- audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
- audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
- audioObjects[id].removeEventListener('seeked', audioObjects[id].onSeekedCB);
-
Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
},
seekToAudio: function(successCallback, errorCallback, args) {
getCurrentPositionAudio: function(successCallback, errorCallback, args) {
var id = args[0];
console.log('media::getCurrentPositionAudio()');
- if (audioObjects[id].src === 'undefined') {
- audioObjects[id].src = args[1];
- }
+
successCallback(audioObjects[id].currentTime);
},
startRecordingAudio: function(successCallback, errorCallback, args) {
var id = args[0];
console.log('media::startRecordingAudio()');
- if (audioObjects[id].src === 'undefined') {
- audioObjects[id].src = args[1];
- }
+
recorder.rec();
},
stopRecordingAudio: function(successCallback, errorCallback, args) {
var id = args[0];
console.log('media::stopRecordingAudio()');
- if (audioObjects[id].src === 'undefined') {
- audioObjects[id].src = args[1];
- }
+
recorder.stop();
},
release: function(successCallback, errorCallback, args) {
exports.stopPlayingAudio(successCallback, errorCallback, args);
var id = args[0];
+
+ audioObjects[id].removeEventListener('canplay', audioObjects[id].onCanPlayCB);
+ audioObjects[id].removeEventListener('ended', audioObjects[id].onEndedCB);
+ audioObjects[id].removeEventListener('timeupdate', audioObjects[id].onTimeUpdateCB);
+ audioObjects[id].removeEventListener('durationchange', audioObjects[id].onDurationChangeCB);
+ audioObjects[id].removeEventListener('playing', audioObjects[id].onPlayingCB);
+ audioObjects[id].removeEventListener('play', audioObjects[id].onPlayCB);
+ audioObjects[id].removeEventListener('error', audioObjects[id].onErrorCB);
+ audioObjects[id].removeEventListener('error', audioObjects[id].onStalledCB);
+ audioObjects[id].removeEventListener('seeked', audioObjects[id].onSeekedCB);
+
delete audioObjects[id];
console.log('media::release()');
},