[Media] Fix minor issues 80/171380/1
authorPawel Kaczmarczyk <p.kaczmarczy@samsung.com>
Tue, 20 Feb 2018 13:48:33 +0000 (14:48 +0100)
committerPiotr Kosko <p.kosko@samsung.com>
Fri, 2 Mar 2018 07:00:41 +0000 (08:00 +0100)
[Verification]
1. Tested in chromium console
2. tct-cordova-media-tests passrate: 100%

1) Removed unreachable code,
2) Removed calling error callback twice,
3) Unregistering listeners moved to 'release' from 'stop',
4) Audio can be now played using the same object which has recorded it.

Change-Id: Ie30d4517117da2060d03e6b3b6e3b2652520a9dc
Signed-off-by: Pawel Kaczmarczyk <p.kaczmarczy@samsung.com>
src/lib/plugins/cordova-plugin-media/tizen/Media.js

index 717be92..9dff36b 100755 (executable)
@@ -19,6 +19,19 @@ var plugin_name = 'cordova-plugin-media.tizen.Media';
 
 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;
@@ -27,7 +40,7 @@ cordova.define(plugin_name, function(require, exports, module) {
     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;
@@ -36,8 +49,9 @@ cordova.define(plugin_name, function(require, exports, module) {
         var sampleRate = null;
         var filename = _filename;
         var audioBlob = null;
-        var leftchannel = [];
-        var rightchannel = [];
+        var leftchannel;
+        var rightchannel;
+        var errorCallback = _errorCallback;
 
         this.rec = function(){
             if (navigator.mediaDevices.getUserMedia){
@@ -135,6 +149,8 @@ cordova.define(plugin_name, function(require, exports, module) {
             var bufferSize = 2048;
             recorder = context.createScriptProcessor(bufferSize, 2, 2);
 
+            rightchannel = [];
+            leftchannel = [];
             recorder.onaudioprocess = function(sample){
                 if (!recording) {
                     return;
@@ -160,26 +176,39 @@ cordova.define(plugin_name, function(require, exports, module) {
             }
 
             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));
             }
         }
 
@@ -223,7 +252,10 @@ cordova.define(plugin_name, function(require, exports, module) {
 
     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;
 
@@ -253,16 +285,12 @@ cordova.define(plugin_name, function(require, exports, module) {
 
     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 () {
@@ -323,14 +351,37 @@ cordova.define(plugin_name, function(require, exports, module) {
     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();
@@ -348,16 +399,6 @@ cordova.define(plugin_name, function(require, exports, module) {
 
       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) {
@@ -379,30 +420,35 @@ cordova.define(plugin_name, function(require, exports, module) {
   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()');
   },