changeset 2871:0981212c091f

Merge branch 'vnext' into Dev_main
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Tue, 09 May 2017 14:53:03 +0100
parents c3e444d743f1 (current diff) 0228ab1777d9 (diff)
children fefa7c50d263
files js/specification.js xml/test-schema.xsd
diffstat 3 files changed, 34 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/js/core.js	Fri May 05 09:35:58 2017 +0100
+++ b/js/core.js	Tue May 09 14:53:03 2017 +0100
@@ -1717,6 +1717,11 @@
         if (typeof id !== "number" || id < 0 || id > this.audioObjects.length) {
             throw ('FATAL - Passed id was undefined - AudioEngineContext.play(id)');
         }
+        var maxPlays = this.audioObjects[id].specification.maxNumberPlays || this.audioObjects[id].specification.parent.maxNumberPlays || specification.maxNumberPlays;
+        if (maxPlays !== undefined && this.audioObjects[id].numberOfPlays >= maxPlays) {
+            interfaceContext.lightbox.post("Error", "Cannot play this fragment more than " + maxPlays + " times");
+            return;
+        }
         if (this.status === 1) {
             this.timer.startTest();
             interfaceContext.playhead.setTimePerPixel(this.audioObjects[id]);
@@ -1850,6 +1855,8 @@
 function audioObject(id) {
     // The main buffer object with common control nodes to the AudioEngine
 
+    var playCounter = 0;
+
     this.specification = undefined;
     this.id = id;
     this.state = 0; // 0 - no data, 1 - ready
@@ -1946,6 +1953,7 @@
 
     this.play = function (startTime) {
         if (this.bufferNode === undefined && this.buffer.buffer !== undefined) {
+            playCounter++;
             this.bufferNode = audioContext.createBufferSource();
             this.bufferNode.owner = this;
             this.bufferNode.connect(this.outputGain);
@@ -2025,6 +2033,17 @@
         }
         this.metric.exportXMLDOM(this.storeDOM.getElementsByTagName('metric')[0]);
     };
+
+    Object.defineProperties(this, {
+        "numberOfPlays": {
+            'get': function () {
+                return playCounter;
+            },
+            'set': function () {
+                return playCounter;
+            }
+        }
+    });
 }
 
 function timer() {
--- a/js/specification.js	Fri May 05 09:35:58 2017 +0100
+++ b/js/specification.js	Tue May 09 14:53:03 2017 +0100
@@ -17,6 +17,8 @@
     this.preSilence = undefined;
     this.postSilence = undefined;
     this.playOne = undefined;
+    this.minNumberPlays = undefined;
+    this.maxNumberPlays = undefined;
 
     // nodes
     this.metrics = new metricNode();
@@ -562,6 +564,8 @@
         this.restrictMovement = undefined;
         this.position = undefined;
         this.commentBoxPrefix = "Comment on track";
+        this.minNumberPlays = undefined;
+        this.maxNumberPlays = undefined;
         this.audioElements = [];
         this.commentQuestions = [];
         this.schema = schemaRoot.querySelector("[name=page]");
@@ -837,6 +841,8 @@
             this.stopTime = undefined;
             this.sampleRate = undefined;
             this.image = undefined;
+            this.minNumberPlays = undefined;
+            this.maxNumberPlays = undefined;
             this.alternatives = [];
             this.schema = schemaRoot.querySelector('[name=audioelement]');
             this.parent = undefined;
--- a/xml/test-schema.xsd	Fri May 05 09:35:58 2017 +0100
+++ b/xml/test-schema.xsd	Tue May 09 14:53:03 2017 +0100
@@ -27,6 +27,9 @@
             </xs:simpleType>
         </xs:attribute>
 
+        <xs:attribute name="minNumberPlays" type="xs:nonNegativeInteger" default="0" />
+        <xs:attribute name="maxNumberPlays" type="xs:nonNegativeInteger" />
+
         <xs:attribute name="playOne" type="xs:boolean" default="false" />
 
         <xs:attribute name="minWait" type="xs:nonNegativeInteger" default="0" />
@@ -67,6 +70,8 @@
                 <xs:attribute ref="preSilence" />
                 <xs:attribute ref="postSilence" />
                 <xs:attribute ref="playOne" />
+                <xs:attribute ref="minNumberPlays" use="optional" />
+                <xs:attribute ref="maxNumberPlays" use="optional" />
             </xs:complexType>
         </xs:element>
 
@@ -107,6 +112,8 @@
                 <xs:attribute ref="postSilence" />
                 <xs:attribute ref="playOne" />
                 <xs:attribute name="restrictMovement" type="xs:boolean" default="false" use="optional" />
+                <xs:attribute ref="minNumberPlays" use="optional" />
+                <xs:attribute ref="maxNumberPlays" use="optional" />
             </xs:complexType>
         </xs:element>
 
@@ -238,6 +245,8 @@
                     </xs:simpleType>
                 </xs:attribute>
                 <xs:attribute name="image" type="xs:anyURI" use="optional" />
+                <xs:attribute ref="minNumberPlays" use="optional" />
+                <xs:attribute ref="maxNumberPlays" use="optional" />
             </xs:complexType>
         </xs:element>