changeset 410:6be81817d142 Dev_main

Specification document handles optional loudness control.
author Nicholas Jillings <n.g.r.jillings@se14.qmul.ac.uk>
date Wed, 16 Dec 2015 14:00:11 +0000
parents 8f88db0c38b5
children 12abf9c61949
files core.js example_eval/project.xml loudness.js
diffstat 3 files changed, 33 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/core.js	Wed Dec 16 12:35:52 2015 +0000
+++ b/core.js	Wed Dec 16 14:00:11 2015 +0000
@@ -897,6 +897,13 @@
 		this.audioObjects[audioObjectId].specification = element;
 		this.audioObjects[audioObjectId].url = URL;
 		this.audioObjects[audioObjectId].buffer = buffer;
+		var targetLUFS = this.audioObjects[audioObjectId].specification.parent.loudness;
+		if (typeof targetLUFS === "number")
+		{
+			buffer.buffer.gain = decibelToLinear(targetLUFS - buffer.buffer.lufs);
+		} else {
+			buffer.buffer.gain = 1.0;
+		}
 		if (buffer.buffer != null)
 		{
 			this.audioObjects[audioObjectId].state = 1;
@@ -1451,6 +1458,7 @@
 	this.testPages = null;
 	this.audioHolders = [];
 	this.metrics = [];
+	this.loudness = null;
 	
 	this.decode = function(projectXML) {
 		// projectXML - DOM Parsed document
@@ -1472,6 +1480,14 @@
 			this.testPages = Number(this.testPages);
 			if (this.testPages == 0) {this.testPages = null;}
 		}
+		if (setupNode.getAttribute('loudness') != null)
+		{
+			var XMLloudness = setupNode.getAttribute('loudness');
+			if (isNaN(Number(XMLloudness)) == false)
+			{
+				this.loudness = Number(XMLloudness);
+			}
+		}
 		var metricCollection = setupNode.getElementsByTagName('Metric');
 		
 		var setupPreTestNode = setupNode.getElementsByTagName('PreTest');
@@ -1587,6 +1603,7 @@
 		setupNode.setAttribute('randomiseOrder',this.randomiseOrder);
 		setupNode.setAttribute('collectMetrics',this.collectMetrics);
 		setupNode.setAttribute('testPages',this.testPages);
+		if(this.loudness != null) {AHNode.setAttribute("loudness",this.loudness);}
 		
 		var setupPreTest = root.createElement("PreTest");
 		for (var i=0; i<this.preTest.options.length; i++)
@@ -1793,6 +1810,7 @@
 		this.loop = undefined;
 		this.elementComments = undefined;
 		this.outsideReference = null;
+		this.loudness = null;
 		this.preTest = new parent.prepostNode("pretest");
 		this.postTest = new parent.prepostNode("pretest");
 		this.interfaces = [];
@@ -1813,7 +1831,18 @@
 			else {this.loop == false;}
 			if (xml.getAttribute('elementComments') == "true") {this.elementComments = true;}
 			else {this.elementComments = false;}
-			
+			if (typeof parent.loudness === "number")
+			{
+				this.loudness = parent.loudness;
+			}
+			if (xml.getAttribute('loudness') != null)
+			{
+				var XMLloudness = xml.getAttribute('loudness');
+				if (isNaN(Number(XMLloudness)) == false)
+				{
+					this.loudness = Number(XMLloudness);
+				}
+			}
 			var setupPreTestNode = xml.getElementsByTagName('PreTest');
 			if (setupPreTestNode.length != 0)
 			{
@@ -1880,6 +1909,7 @@
 			AHNode.setAttribute("repeatCount",this.repeatCount);
 			AHNode.setAttribute("loop",this.loop);
 			AHNode.setAttribute("elementComments",this.elementComments);
+			if(this.loudness != null) {AHNode.setAttribute("loudness",this.loudness);}
 			
 			for (var i=0; i<this.interfaces.length; i++)
 			{
--- a/example_eval/project.xml	Wed Dec 16 12:35:52 2015 +0000
+++ b/example_eval/project.xml	Wed Dec 16 14:00:11 2015 +0000
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <BrowserEvalProjectDocument>
-	<setup interface="APE" projectReturn="save.php" randomiseOrder='true' collectMetrics='true' testPages="2">
+	<setup interface="APE" projectReturn="save.php" randomiseOrder='true' collectMetrics='true' testPages="2" loudness="-23">
 		<PreTest>
 			<question id="sessionId" mandatory="true">Please enter your name.</question>
 			<statement>This is an example of an 'APE'-style test, with two pages, using the test stimuli in 'example_eval/'.</statement>
@@ -33,7 +33,7 @@
 			<option name="page-count"/>
 		</interface>
 	</setup>
-	<audioHolder id='test-0' hostURL="example_eval/" randomiseOrder='true' repeatCount='0' loop='true' elementComments='true'>
+	<audioHolder id='test-0' hostURL="example_eval/" randomiseOrder='true' repeatCount='0' loop='true' elementComments='true' loudness="-12">
 		<interface name="preference">
 			<title>Preference</title>
 			<scale position="0">Min</scale>
--- a/loudness.js	Wed Dec 16 12:35:52 2015 +0000
+++ b/loudness.js	Wed Dec 16 14:00:11 2015 +0000
@@ -94,8 +94,6 @@
 			}
 			var overallRelLoudness = calculateOverallLoudnessFromChannelBlocks(relgateEnergy);
 			buffer.lufs =  overallRelLoudness;
-			var diff = -23 -overallRelLoudness;
-			buffer.gain = decibelToLinear(diff);
 		}
 	}).catch(function(err) {
 		console.log(err);