Mercurial > hg > webaudioevaluationtool
changeset 965:2dc61bd6494e
Merge
author | Nicholas Jillings <nicholas.jillings@eecs.qmul.ac.uk> |
---|---|
date | Wed, 27 May 2015 16:46:43 +0100 |
parents | b81bedba3e13 (current diff) 9c09cb530ec1 (diff) |
children | 4a5102ff2822 |
files | ape.css ape.js core.js example_eval/project.xml python2.py |
diffstat | 3 files changed, 164 insertions(+), 100 deletions(-) [+] |
line wrap: on
line diff
--- a/ape.js Wed May 27 12:40:37 2015 +0100 +++ b/ape.js Wed May 27 16:46:43 2015 +0100 @@ -30,12 +30,25 @@ var xmlSetup = xmlDoc.find('setup'); // Should put in an error function here incase of malprocessed or malformed XML + // Create pre and post test questions + + var preTest = xmlSetup.find('PreTest'); + var postTest = xmlSetup.find('PostTest'); + preTest = preTest[0]; + postTest = postTest[0]; + + if (preTest == undefined) {preTest = document.createElement("preTest");} + if (postTest == undefined){postTest= document.createElement("postTest");} + + testState.stateMap.push(preTest); + // Extract the different test XML DOM trees var audioHolders = xmlDoc.find('audioHolder'); + var testXMLSetups = []; audioHolders.each(function(index,element) { var repeatN = element.attributes['repeatCount'].value; for (var r=0; r<=repeatN; r++) { - testXMLSetups[testXMLSetups.length] = element; + testXMLSetups.push(element); } }); @@ -55,6 +68,12 @@ { testXMLSetups = randomiseOrder(testXMLSetups); } + + $(testXMLSetups).each(function(index,elem){ + testState.stateMap.push(elem); + }) + + testState.stateMap.push(postTest); // Obtain the metrics enabled var metricNode = xmlSetup.find('Metric'); @@ -232,23 +251,8 @@ testContent.style.zIndex = 1; insertPoint.innerHTML = null; // Clear the current schema - // Create pre and post test questions - - var preTest = xmlSetup.find('PreTest'); - var postTest = xmlSetup.find('PostTest'); - preTest = preTest[0]; - postTest = postTest[0]; - currentState = 'preTest'; - // Create Pre-Test Box - if (preTest != undefined && preTest.childElementCount >= 1) - { - //popup.showPopup(); - //preTestPopupStart(preTest); - popup.initState(preTest); - } - // Inject into HTML testContent.appendChild(title); // Insert the title testContent.appendChild(pagetitle); @@ -258,17 +262,17 @@ insertPoint.appendChild(testContent); // Load the full interface - + testState.initialise(); + testState.advanceState(); } -function loadTest(id) +function loadTest(textXML) { // Reset audioEngineContext.Metric globals for new test audioEngineContext.newTestPage(); - // Used to load a specific test page - var textXML = testXMLSetups[id]; + var id = textXML.id; var feedbackHolder = document.getElementById('feedbackHolder'); var canvas = document.getElementById('slider'); @@ -483,19 +487,6 @@ trackComment.appendChild(trackCommentBox); feedbackHolder.appendChild(trackComment); }); - - // Now process any pre-test commands - - var preTest = $(testXMLSetups[id]).find('PreTest')[0]; - if (preTest.childElementCount > 0) - { - currentState = 'testRunPre-'+id; - //preTestPopupStart(preTest); - popup.initState(preTest); - //popup.showPopup(); - } else { - currentState = 'testRun-'+id; - } } @@ -534,12 +525,7 @@ return; } } - if (currentState.substr(0,7) == 'testRun') - { - hasBeenPlayed = []; // clear array to prepare for next test - audioEngineContext.timer.stopTest(); - advanceState(); - } + testState.advanceState(); } else // if a fragment has not been played yet { str = ""; @@ -605,13 +591,13 @@ }); } -function pageXMLSave(testId) +function pageXMLSave(store, testXML, testId) { // Saves a specific test page - var xmlDoc = currentTestHolder; + var xmlDoc = store; // Check if any session wide metrics are enabled - var commentShow = testXMLSetups[testId].attributes['elementComments']; + var commentShow = testXML.attributes['elementComments']; if (commentShow != undefined) { if (commentShow.value == 'false') {commentShow = false;} else {commentShow = true;} @@ -716,21 +702,5 @@ cqHolder.appendChild(comment); xmlDoc.appendChild(cqHolder); } - testResultsHolders[testId] = xmlDoc; -} - -// Only other global function which must be defined in the interface class. Determines how to create the XML document. -function interfaceXMLSave(){ - // Create the XML string to be exported with results - var xmlDoc = document.createElement("BrowserEvaluationResult"); - xmlDoc.appendChild(returnDateNode()); - for (var i=0; i<testResultsHolders.length; i++) - { - xmlDoc.appendChild(testResultsHolders[i]); - } - // Append Pre/Post Questions - xmlDoc.appendChild(preTestQuestions); - xmlDoc.appendChild(postTestQuestions); - - return xmlDoc; + store = xmlDoc; } \ No newline at end of file
--- a/core.js Wed May 27 12:40:37 2015 +0100 +++ b/core.js Wed May 27 16:46:43 2015 +0100 @@ -9,15 +9,16 @@ var audioContext; // Hold the browser web audio API var projectXML; // Hold the parsed setup XML var popup; // Hold the interfacePopup object +var testState; var currentState; // Keep track of the current state (pre/post test, which test, final test? first test?) -var testXMLSetups = []; // Hold the parsed test instances -var testResultsHolders =[]; // Hold the results from each test for publishing to XML +//var testXMLSetups = []; // Hold the parsed test instances +//var testResultsHolders =[]; // Hold the results from each test for publishing to XML var currentTrackOrder = []; // Hold the current XML tracks in their (randomised) order -var currentTestHolder; // Hold any intermediate results during test - metrics +//var currentTestHolder; // Hold any intermediate results during test - metrics var audioEngineContext; // The custome AudioEngine object var projectReturn; // Hold the URL for the return -var preTestQuestions = document.createElement('PreTest'); // Store any pre-test question response -var postTestQuestions = document.createElement('PostTest'); // Store any post-test question response +//var preTestQuestions = document.createElement('PreTest'); // Store any pre-test question response +//var postTestQuestions = document.createElement('PostTest'); // Store any post-test question response // Add a prototype to the bufferSourceNode to reference to the audioObject holding it AudioBufferSourceNode.prototype.owner = undefined; @@ -31,6 +32,9 @@ var AudioContext = window.AudioContext || window.webkitAudioContext; audioContext = new AudioContext; + // Create test state + testState = new stateMachine(); + // Create the audio engine object audioEngineContext = new AudioEngine(); @@ -163,6 +167,11 @@ } else { // Reached the end of the popupOptions this.hidePopup(); + if (this.responses.nodeName == testState.stateResults[testState.stateIndex].nodeName) { + testState.stateResults[testState.stateIndex] = this.responses; + } else { + testState.stateResults[testState.stateIndex].appendChild(this.responses); + } advanceState(); } } @@ -170,44 +179,114 @@ function advanceState() { - console.log(currentState); - if (currentState == 'preTest') - { - // End of pre-test, begin the test - preTestQuestions = popup.responses; - loadTest(0); - } else if (currentState == 'postTest') { - postTestQuestions = popup.responses; - console.log('ALL COLLECTED!'); - createProjectSave(projectReturn); - }else if (currentState.substr(0,10) == 'testRunPre') - { - // Start the test - var testId = currentState.substr(11,currentState.length-10); - currentState = 'testRun-'+testId; - currentTestHolder.appendChild(popup.responses); - //audioEngineContext.timer.startTest(); - //audioEngineContext.play(); - } else if (currentState.substr(0,11) == 'testRunPost') - { - var testId = currentState.substr(12,currentState.length-11); - currentTestHolder.appendChild(popup.responses); - testEnded(testId); - } else if (currentState.substr(0,7) == 'testRun') - { - var testId = currentState.substr(8,currentState.length-7); - // Check if we have any post tests to perform - var postXML = $(testXMLSetups[testId]).find('PostTest')[0]; - if (postXML == undefined || postXML.childElementCount == 0) { - testEnded(testId); + // Just for complete clarity + testState.advanceState(); +} + +function stateMachine() +{ + // Object prototype for tracking and managing the test state + this.stateMap = []; + this.stateIndex = null; + this.currentStateMap = []; + this.currentIndex = null; + this.currentTestId = 0; + this.stateResults = []; + this.initialise = function(){ + if (this.stateMap.length > 0) { + if(this.stateIndex != null) { + console.log('NOTE - State already initialise'); + } + this.stateIndex = -1; + var that = this; + for (var id=0; id<this.stateMap.length; id++){ + var name = this.stateMap[id].nodeName; + var obj = document.createElement(name); + this.stateResults.push(obj); + } + } else { + conolse.log('FATAL - StateMap not correctly constructed. EMPTY_STATE_MAP'); } - else if (postXML.childElementCount > 0) - { - currentState = 'testRunPost-'+testId; - popup.initState(postXML); + }; + this.advanceState = function(){ + if (this.stateIndex == null) { + this.initialise(); + } + if (this.stateIndex == -1) { + console.log('Starting test...'); + } + if (this.currentIndex == null){ + if (this.currentStateMap.nodeName == "audioHolder") { + // Save current page + this.testPageCompleted(this.stateResults[this.stateIndex],this.currentStateMap,this.currentTestId); + this.currentTestId++; + } + this.stateIndex++; + if (this.stateIndex >= this.stateMap.length) { + console.log('Test Completed'); + createProjectSave(projectReturn); + } else { + this.currentStateMap = this.stateMap[this.stateIndex]; + if (this.currentStateMap.nodeName == "audioHolder") { + console.log('Loading test page'); + loadTest(this.currentStateMap); + this.initialiseInnerState(this.currentStateMap); + } else if (this.currentStateMap.nodeName == "PreTest" || this.currentStateMap.nodeName == "PostTest") { + if (this.currentStateMap.childElementCount >= 1) { + popup.initState(this.currentStateMap); + } else { + this.advanceState(); + } + } else { + this.advanceState(); + } + } + } else { + this.advanceInnerState(); + } + }; + + this.testPageCompleted = function(store, testXML, testId) { + // Function called each time a test page has been completed + // Can be used to over-rule default behaviour + + pageXMLSave(store, testXML, testId); + } + + this.initialiseInnerState = function(testXML) { + // Parses the received testXML for pre and post test options + this.currentStateMap = []; + var preTest = $(testXML).find('PreTest')[0]; + var postTest = $(testXML).find('PostTest')[0]; + if (preTest == undefined) {preTest = document.createElement("preTest");} + if (postTest == undefined){postTest= document.createElement("postTest");} + this.currentStateMap.push(preTest); + this.currentStateMap.push(testXML); + this.currentStateMap.push(postTest); + this.currentIndex = -1; + this.advanceInnerState(); + } + + this.advanceInnerState = function() { + this.currentIndex++; + if (this.currentIndex >= this.currentStateMap.length) { + this.currentIndex = null; + this.currentStateMap = this.stateMap[this.stateIndex]; + this.advanceState(); + } else { + if (this.currentStateMap[this.currentIndex].nodeName == "audioHolder") { + console.log("Loading test page"+this.currentTestId); + } else if (this.currentStateMap[this.currentIndex].nodeName == "PreTest") { + popup.initState(this.currentStateMap[this.currentIndex]); + } else if (this.currentStateMap[this.currentIndex].nodeName == "PostTest") { + popup.initState(this.currentStateMap[this.currentIndex]); + } else { + this.advanceInnerState(); + } } } - console.log(currentState); + + this.previousState = function(){}; } function testEnded(testId) @@ -303,6 +382,19 @@ return submitDiv; } +// Only other global function which must be defined in the interface class. Determines how to create the XML document. +function interfaceXMLSave(){ + // Create the XML string to be exported with results + var xmlDoc = document.createElement("BrowserEvaluationResult"); + xmlDoc.appendChild(returnDateNode()); + for (var i=0; i<testState.stateResults.length; i++) + { + xmlDoc.appendChild(testState.stateResults[i]); + } + + return xmlDoc; +} + function AudioEngine() { // Create two output paths, the main outputGain and fooGain. @@ -634,4 +726,4 @@ hold.appendChild(time); return hold -} +} \ No newline at end of file
--- a/example_eval/project.xml Wed May 27 12:40:37 2015 +0100 +++ b/example_eval/project.xml Wed May 27 16:46:43 2015 +0100 @@ -38,9 +38,11 @@ <audioElements url="9.wav" id="9"/> <audioElements url="10.wav" id="10"/>--> <CommentQuestion id='mixingExperiance'>What is your mixing experiance</CommentQuestion> + <!-- <PreTest> <statement>Start the Test 3</statement> </PreTest> + --> <PostTest> <question id="genre" mandatory="true">Please enter the genre</question> </PostTest>