* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
var playback = (function() {
var soundElement;
var counter = 1;
- var soundPathArray = ['/usr/share/feedback/sound/operation/operation.wav', '/usr/share/feedback/sound/operation/home.wav'];
+ var soundPathArray = ['/usr/share/feedback/sound/operation/operation.wav', '/usr/share/feedback/sound/operation/home.wav', '/usr/share/feedback/sound/operation/back.wav'];
var soundPathCount = 0;
function win(v) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
var formatLength = (options && options.formatLength) || FORMAT_SHORT_STR;
var selector = (options && options.selector) || SELECTOR_DATE_AND_TIME_STR;
- tizen.cordova.globalization.dateToString(timestamp, formatLength, selector, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.dateToString(timestamp, formatLength, selector, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_stringToDate(dateString, successCb, errorCb, options) {
var formatLength = (options && options.formatLength) || FORMAT_SHORT_STR;
var selector = (options && options.selector) || SELECTOR_DATE_AND_TIME_STR;
- tizen.cordova.globalization.stringToDate(dateString, formatLength, selector, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.stringToDate(dateString, formatLength, selector, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_getDatePattern(successCb, errorCb, options) {
var formatLength = (options && options.formatLength) || FORMAT_SHORT_STR;
var selector = (options && options.selector) || SELECTOR_DATE_AND_TIME_STR;
- tizen.cordova.globalization.getDatePattern(formatLength, selector, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.getDatePattern(formatLength, selector, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_getDateNames(successCb, errorCb, options) {
var type = (options && options.type) || TYPE_WIDE;
var item = (options && options.item) || ITEM_MONTHS;
- tizen.cordova.globalization.getDateNames(type, item, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.getDateNames(type, item, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_isDayLightSavingsTime(timestamp, successCb, errorCb) {
}
function Globalization_getFirstDayOfWeek(successCb, errorCb) {
- tizen.cordova.globalization.getFirstDayOfWeek(successCb, errorCb);
+ try {
+ tizen.cordova.globalization.getFirstDayOfWeek(successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_numberToString(number, successCb, errorCb, options) {
var type = (options && options.type) || NUMBER_TYPE_DECIMAL;
- tizen.cordova.globalization.numberToString(number, type, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.numberToString(number, type, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_stringToNumber(numberStr, successCb, errorCb, options) {
var type = (options && options.type) || NUMBER_TYPE_DECIMAL;
- tizen.cordova.globalization.stringToNumber(numberStr, type, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.stringToNumber(numberStr, type, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_getNumberPattern(successCb, errorCb, options) {
var type = (options && options.type) || NUMBER_TYPE_DECIMAL;
- tizen.cordova.globalization.getNumberPattern(type, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.getNumberPattern(type, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
function Globalization_getCurrencyPattern(currencyCode, successCb, errorCb) {
- tizen.cordova.globalization.getCurrencyPattern(currencyCode, successCb, errorCb);
+ try {
+ tizen.cordova.globalization.getCurrencyPattern(currencyCode, successCb, errorCb);
+ } catch (e) {
+ errorCb(new GlobalizationError(GlobalizationError.UNKNOWN_ERROR,
+ 'globalization not initialized'));
+ }
}
exports = {
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec');
var convertTizenFileError = require('cordova-plugin-file.tizen.Errors');
var rootUtils = require('cordova-plugin-file.tizen.rootUtils');
-// https://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+//Code created with the help of Stack Overflow question
+//http://stackoverflow.com/a/18729931
+//Question by don kaka:
+//https://stackoverflow.com/users/2408835/don-kaka
+//Answer by Joni and Damian:
+//https://stackoverflow.com/users/318758/joni
+//https://stackoverflow.com/users/3390/damian
function toUTF8Array(str) {
var utf8 = [];
for (var i = 0; i < str.length; ++i) {
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
// Map of fsName -> FileSystem.
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 errorCallback = _errorCallback;
this.rec = function(){
-
- if (!navigator.getUserMedia)
+ if (navigator.mediaDevices.getUserMedia){
+ navigator.mediaDevices.getUserMedia({audio:true})
+ .then(onGetUserMedia)
+ .catch(function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ });
+ } else {
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
-
- if (navigator.getUserMedia){
- navigator.getUserMedia({audio:true}, onGetUserMedia, function(e) {
- console.log('Error capturing audio.');
- });
- } else {
- console.log('getUserMedia not supported in this browser.');
+ if(navigator.getUserMedia) {
+ navigator.getUserMedia({audio: true}, onGetUserMedia, function(e) {
+ console.log('Error capturing audio: ' + e.name + ': ' + e.message);
+ })
+ } else {
+ console.log('getUserMedia not supported in this browser.');
+ }
}
}
this.stop = function (){
recording = false;
- audioBlob.stop();
+ var tracks = audioBlob.getAudioTracks();
+
+ tracks.forEach(function(track) {
+ track.stop();
+ });
+
recorder.disconnect();
// flat the left and right channels down
function onGetUserMedia(stream){
recording = true;
- var leftchannel = [];
- var rightchannel = [];
recordingLength = 0;
audioBlob = stream;
Lower values for buffer size will result in a lower (better) latency.
Higher values will be necessary to avoid audio breakup and glitches */
var bufferSize = 2048;
- recorder = context.createJavaScriptNode(bufferSize, 2, 2);
+ 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()');
},
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var argscheck = require('cordova/argscheck'),
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
/**
* specific language governing permissions and limitations
* under the License.
*
+ * Modifications copyright (C) 2015 Samsung Electronics Co., Ltd All Rights Reserved
*/
var exec = require('cordova/exec'),