changeset 1205:0e49d874ba97

Interfaces report error if audio cannot be loaded/decoded/played
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Mon, 22 Feb 2016 15:48:28 +0000
parents 96acb21e1cd5
children 74ce8e3f8dd5
files core.css core.js interfaces/AB.js interfaces/ape.js interfaces/blank.js interfaces/discrete.js interfaces/horizontal-sliders.js interfaces/mushra.js
diffstat 8 files changed, 85 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/core.css	Mon Feb 22 15:05:39 2016 +0000
+++ b/core.css	Mon Feb 22 15:48:28 2016 +0000
@@ -151,4 +151,12 @@
     height: 25px;
     margin-left: 5px;
     float: left;
+}
+
+div.error-colour {
+    background-color: #FF8F8F;
+}
+button.error-colour {
+    background-color: #FF8F8F;
+    color: black;
 }
\ No newline at end of file
--- a/core.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/core.js	Mon Feb 22 15:48:28 2016 +0000
@@ -982,6 +982,7 @@
 			// Create callback to decode the data asynchronously
 			this.xmlRequest.onloadend = function() {
                 // Use inbuilt WAVE decoder first
+                if (this.status == -1) {return;}
                 var waveObj = new WAVE();
                 if (waveObj.open(bufferObj.xmlRequest.response) == 0)
                 {
@@ -1011,7 +1012,7 @@
                                 console.log('URL: '+audioObj.url);
                                 errorSessionDump('Fragment '+audioObj.id+' 404 error');
                             }
-                            this.status = -1;
+                            this.parent.status = -1;
                         }
                     });
                 }
@@ -1021,6 +1022,20 @@
                     calculateLoudness(bufferObj,"I");
                 }
 			};
+            
+            // Create callback for any error in loading
+            this.xmlRequest.onerror = function() {
+                this.parent.status = -1;
+                for (var i=0; i<this.parent.users.length; i++)
+                {
+                    this.parent.users[i].state = -1;
+                    if (this.parent.users[i].interfaceDOM != null)
+                    {
+                        this.parent.users[i].bufferLoaded(this);
+                    }
+                }
+            }
+            
 			this.progress = 0;
 			this.progressCallback = function(event){
 				if (event.lengthComputable)
@@ -1052,7 +1067,7 @@
                 if (audioObject.id == objects.id){return 0;}
             }
             this.users.push(audioObject);
-            if (this.status == 3)
+            if (this.status == 3 || this.status == -1)
             {
                 // The buffer is already ready, trigger bufferLoaded
                 audioObject.bufferLoaded(this);
@@ -1267,6 +1282,13 @@
 	{
 		// Called by the associated buffer when it has finished loading, will then 'bind' the buffer to the
 		// audioObject and trigger the interfaceDOM.enable() function for user feedback
+        if (callee.status == -1) {
+            // ERROR
+            this.state = -1;
+            if (this.interfaceDOM != null) {this.interfaceDOM.error();}
+            this.buffer = callee;
+            return;
+        }
 		if (audioEngineContext.loopPlayback){
 			// First copy the buffer into this.buffer
 			this.buffer = new audioEngineContext.bufferObj();
@@ -1308,7 +1330,11 @@
 		if (this.state == 1)
 		{
 			this.interfaceDOM.enable();
-		}
+		} else if (this.state == -1) {
+            // ERROR
+            this.interfaceDOM.error();
+            return;
+        }
 		this.storeDOM.setAttribute('presentedId',interfaceObject.getPresentedId());
 	};
     
--- a/interfaces/AB.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/AB.js	Mon Feb 22 15:48:28 2016 +0000
@@ -259,6 +259,11 @@
 				this.playback.textContent = "Play";
 			}
 		};
+        this.error = function() {
+            // audioObject has an error!!
+            this.playback.textContent = "Error";
+            $(this.playback).addClass("error-colour");
+        }
         this.startPlayback = function()
         {
             $('.comparator-button').text('Listen');
--- a/interfaces/ape.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/ape.js	Mon Feb 22 15:48:28 2016 +0000
@@ -644,6 +644,11 @@
 	{
 		return true;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.playback.textContent = "Error";
+        $(this.playback).addClass("error-colour");
+    }
 }
 
 function outsideReferenceDOM(audioObject,index,inject)
@@ -713,6 +718,11 @@
 	{
 		return false;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.outsideReferenceHolder.textContent = "Error";
+        $(this.outsideReferenceHolder).addClass("error-colour");
+    }
 }
 
 function buttonSubmitClick()
--- a/interfaces/blank.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/blank.js	Mon Feb 22 15:48:28 2016 +0000
@@ -57,6 +57,9 @@
 		// Use storage.document.createElement('value'); to generate the XML node.
 		
 	};
+    this.error = function() {
+        // If there is an error with the audioObject, this will be called to indicate a failure
+    }
 };
 
 function resizeWindow(event)
--- a/interfaces/discrete.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/discrete.js	Mon Feb 22 15:48:28 2016 +0000
@@ -378,6 +378,11 @@
 		node.textContent = this.getValue();
 		return node;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.playback.textContent = "Error";
+        $(this.playback).addClass("error-colour");
+    }
 };
 
 function outsideReferenceDOM(audioObject,index,inject)
@@ -446,6 +451,11 @@
 	{
 		return false;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.outsideReferenceHolder.textContent = "Error";
+        $(this.outsideReferenceHolder).addClass("error-colour");
+    }
 }
 
 function resizeWindow(event)
--- a/interfaces/horizontal-sliders.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/horizontal-sliders.js	Mon Feb 22 15:48:28 2016 +0000
@@ -331,6 +331,11 @@
         node.textContent = this.slider.value;
         return node;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.playback.textContent = "Error";
+        $(this.playback).addClass("error-colour");
+    }
 };
 
 function outsideReferenceDOM(audioObject,index,inject)
@@ -394,6 +399,11 @@
 	{
 		return false;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.outsideReferenceHolder.textContent = "Error";
+        $(this.outsideReferenceHolder).addClass("error-colour");
+    }
 }
 
 function resizeWindow(event)
--- a/interfaces/mushra.js	Mon Feb 22 15:05:39 2016 +0000
+++ b/interfaces/mushra.js	Mon Feb 22 15:48:28 2016 +0000
@@ -343,6 +343,11 @@
 	{
 		return true;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.playback.textContent = "Error";
+        $(this.playback).addClass("error-colour");
+    }
 }
 
 function outsideReferenceDOM(audioObject,index,inject)
@@ -406,6 +411,11 @@
 	{
 		return false;
 	};
+    this.error = function() {
+            // audioObject has an error!!
+        this.outsideReferenceHolder.textContent = "Error";
+        $(this.outsideReferenceHolder).addClass("error-colour");
+    }
 }
 
 function resizeWindow(event)