comparison core.js @ 965:2dc61bd6494e

Merge
author Nicholas Jillings <nicholas.jillings@eecs.qmul.ac.uk>
date Wed, 27 May 2015 16:46:43 +0100
parents b81bedba3e13 9c09cb530ec1
children 4a5102ff2822
comparison
equal deleted inserted replaced
935:b81bedba3e13 965:2dc61bd6494e
7 7
8 /* create the web audio API context and store in audioContext*/ 8 /* create the web audio API context and store in audioContext*/
9 var audioContext; // Hold the browser web audio API 9 var audioContext; // Hold the browser web audio API
10 var projectXML; // Hold the parsed setup XML 10 var projectXML; // Hold the parsed setup XML
11 var popup; // Hold the interfacePopup object 11 var popup; // Hold the interfacePopup object
12 var testState;
12 var currentState; // Keep track of the current state (pre/post test, which test, final test? first test?) 13 var currentState; // Keep track of the current state (pre/post test, which test, final test? first test?)
13 var testXMLSetups = []; // Hold the parsed test instances 14 //var testXMLSetups = []; // Hold the parsed test instances
14 var testResultsHolders =[]; // Hold the results from each test for publishing to XML 15 //var testResultsHolders =[]; // Hold the results from each test for publishing to XML
15 var currentTrackOrder = []; // Hold the current XML tracks in their (randomised) order 16 var currentTrackOrder = []; // Hold the current XML tracks in their (randomised) order
16 var currentTestHolder; // Hold any intermediate results during test - metrics 17 //var currentTestHolder; // Hold any intermediate results during test - metrics
17 var audioEngineContext; // The custome AudioEngine object 18 var audioEngineContext; // The custome AudioEngine object
18 var projectReturn; // Hold the URL for the return 19 var projectReturn; // Hold the URL for the return
19 var preTestQuestions = document.createElement('PreTest'); // Store any pre-test question response 20 //var preTestQuestions = document.createElement('PreTest'); // Store any pre-test question response
20 var postTestQuestions = document.createElement('PostTest'); // Store any post-test question response 21 //var postTestQuestions = document.createElement('PostTest'); // Store any post-test question response
21 22
22 // Add a prototype to the bufferSourceNode to reference to the audioObject holding it 23 // Add a prototype to the bufferSourceNode to reference to the audioObject holding it
23 AudioBufferSourceNode.prototype.owner = undefined; 24 AudioBufferSourceNode.prototype.owner = undefined;
24 25
25 window.onload = function() { 26 window.onload = function() {
28 29
29 // Create a web audio API context 30 // Create a web audio API context
30 // Fixed for cross-browser support 31 // Fixed for cross-browser support
31 var AudioContext = window.AudioContext || window.webkitAudioContext; 32 var AudioContext = window.AudioContext || window.webkitAudioContext;
32 audioContext = new AudioContext; 33 audioContext = new AudioContext;
34
35 // Create test state
36 testState = new stateMachine();
33 37
34 // Create the audio engine object 38 // Create the audio engine object
35 audioEngineContext = new AudioEngine(); 39 audioEngineContext = new AudioEngine();
36 40
37 // Create the popup interface object 41 // Create the popup interface object
161 if (this.currentIndex < this.popupOptions.length) { 165 if (this.currentIndex < this.popupOptions.length) {
162 this.postNode(); 166 this.postNode();
163 } else { 167 } else {
164 // Reached the end of the popupOptions 168 // Reached the end of the popupOptions
165 this.hidePopup(); 169 this.hidePopup();
170 if (this.responses.nodeName == testState.stateResults[testState.stateIndex].nodeName) {
171 testState.stateResults[testState.stateIndex] = this.responses;
172 } else {
173 testState.stateResults[testState.stateIndex].appendChild(this.responses);
174 }
166 advanceState(); 175 advanceState();
167 } 176 }
168 } 177 }
169 } 178 }
170 179
171 function advanceState() 180 function advanceState()
172 { 181 {
173 console.log(currentState); 182 // Just for complete clarity
174 if (currentState == 'preTest') 183 testState.advanceState();
175 { 184 }
176 // End of pre-test, begin the test 185
177 preTestQuestions = popup.responses; 186 function stateMachine()
178 loadTest(0); 187 {
179 } else if (currentState == 'postTest') { 188 // Object prototype for tracking and managing the test state
180 postTestQuestions = popup.responses; 189 this.stateMap = [];
181 console.log('ALL COLLECTED!'); 190 this.stateIndex = null;
182 createProjectSave(projectReturn); 191 this.currentStateMap = [];
183 }else if (currentState.substr(0,10) == 'testRunPre') 192 this.currentIndex = null;
184 { 193 this.currentTestId = 0;
185 // Start the test 194 this.stateResults = [];
186 var testId = currentState.substr(11,currentState.length-10); 195 this.initialise = function(){
187 currentState = 'testRun-'+testId; 196 if (this.stateMap.length > 0) {
188 currentTestHolder.appendChild(popup.responses); 197 if(this.stateIndex != null) {
189 //audioEngineContext.timer.startTest(); 198 console.log('NOTE - State already initialise');
190 //audioEngineContext.play(); 199 }
191 } else if (currentState.substr(0,11) == 'testRunPost') 200 this.stateIndex = -1;
192 { 201 var that = this;
193 var testId = currentState.substr(12,currentState.length-11); 202 for (var id=0; id<this.stateMap.length; id++){
194 currentTestHolder.appendChild(popup.responses); 203 var name = this.stateMap[id].nodeName;
195 testEnded(testId); 204 var obj = document.createElement(name);
196 } else if (currentState.substr(0,7) == 'testRun') 205 this.stateResults.push(obj);
197 { 206 }
198 var testId = currentState.substr(8,currentState.length-7); 207 } else {
199 // Check if we have any post tests to perform 208 conolse.log('FATAL - StateMap not correctly constructed. EMPTY_STATE_MAP');
200 var postXML = $(testXMLSetups[testId]).find('PostTest')[0]; 209 }
201 if (postXML == undefined || postXML.childElementCount == 0) { 210 };
202 testEnded(testId); 211 this.advanceState = function(){
203 } 212 if (this.stateIndex == null) {
204 else if (postXML.childElementCount > 0) 213 this.initialise();
205 { 214 }
206 currentState = 'testRunPost-'+testId; 215 if (this.stateIndex == -1) {
207 popup.initState(postXML); 216 console.log('Starting test...');
208 } 217 }
209 } 218 if (this.currentIndex == null){
210 console.log(currentState); 219 if (this.currentStateMap.nodeName == "audioHolder") {
220 // Save current page
221 this.testPageCompleted(this.stateResults[this.stateIndex],this.currentStateMap,this.currentTestId);
222 this.currentTestId++;
223 }
224 this.stateIndex++;
225 if (this.stateIndex >= this.stateMap.length) {
226 console.log('Test Completed');
227 createProjectSave(projectReturn);
228 } else {
229 this.currentStateMap = this.stateMap[this.stateIndex];
230 if (this.currentStateMap.nodeName == "audioHolder") {
231 console.log('Loading test page');
232 loadTest(this.currentStateMap);
233 this.initialiseInnerState(this.currentStateMap);
234 } else if (this.currentStateMap.nodeName == "PreTest" || this.currentStateMap.nodeName == "PostTest") {
235 if (this.currentStateMap.childElementCount >= 1) {
236 popup.initState(this.currentStateMap);
237 } else {
238 this.advanceState();
239 }
240 } else {
241 this.advanceState();
242 }
243 }
244 } else {
245 this.advanceInnerState();
246 }
247 };
248
249 this.testPageCompleted = function(store, testXML, testId) {
250 // Function called each time a test page has been completed
251 // Can be used to over-rule default behaviour
252
253 pageXMLSave(store, testXML, testId);
254 }
255
256 this.initialiseInnerState = function(testXML) {
257 // Parses the received testXML for pre and post test options
258 this.currentStateMap = [];
259 var preTest = $(testXML).find('PreTest')[0];
260 var postTest = $(testXML).find('PostTest')[0];
261 if (preTest == undefined) {preTest = document.createElement("preTest");}
262 if (postTest == undefined){postTest= document.createElement("postTest");}
263 this.currentStateMap.push(preTest);
264 this.currentStateMap.push(testXML);
265 this.currentStateMap.push(postTest);
266 this.currentIndex = -1;
267 this.advanceInnerState();
268 }
269
270 this.advanceInnerState = function() {
271 this.currentIndex++;
272 if (this.currentIndex >= this.currentStateMap.length) {
273 this.currentIndex = null;
274 this.currentStateMap = this.stateMap[this.stateIndex];
275 this.advanceState();
276 } else {
277 if (this.currentStateMap[this.currentIndex].nodeName == "audioHolder") {
278 console.log("Loading test page"+this.currentTestId);
279 } else if (this.currentStateMap[this.currentIndex].nodeName == "PreTest") {
280 popup.initState(this.currentStateMap[this.currentIndex]);
281 } else if (this.currentStateMap[this.currentIndex].nodeName == "PostTest") {
282 popup.initState(this.currentStateMap[this.currentIndex]);
283 } else {
284 this.advanceInnerState();
285 }
286 }
287 }
288
289 this.previousState = function(){};
211 } 290 }
212 291
213 function testEnded(testId) 292 function testEnded(testId)
214 { 293 {
215 pageXMLSave(testId); 294 pageXMLSave(testId);
301 xmlhttp.send(file); 380 xmlhttp.send(file);
302 } 381 }
303 return submitDiv; 382 return submitDiv;
304 } 383 }
305 384
385 // Only other global function which must be defined in the interface class. Determines how to create the XML document.
386 function interfaceXMLSave(){
387 // Create the XML string to be exported with results
388 var xmlDoc = document.createElement("BrowserEvaluationResult");
389 xmlDoc.appendChild(returnDateNode());
390 for (var i=0; i<testState.stateResults.length; i++)
391 {
392 xmlDoc.appendChild(testState.stateResults[i]);
393 }
394
395 return xmlDoc;
396 }
397
306 function AudioEngine() { 398 function AudioEngine() {
307 399
308 // Create two output paths, the main outputGain and fooGain. 400 // Create two output paths, the main outputGain and fooGain.
309 // Output gain is default to 1 and any items for playback route here 401 // Output gain is default to 1 and any items for playback route here
310 // Foo gain is used for analysis to ensure paths get processed, but are not heard 402 // Foo gain is used for analysis to ensure paths get processed, but are not heard