automation-rate.html (5963B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>AudioParam.automationRate tests</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 </head> 8 9 <body> 10 <script> 11 // For each node that has an AudioParam, verify that the default 12 // |automationRate| has the expected value and that we can change it or 13 // throw an error if it can't be changed. 14 15 // Any valid sample rate is fine; we don't actually render anything in the 16 // tests. 17 const sampleRate = 8000; 18 19 // Array of tests. Each test is a dictonary consisting of the name of the 20 // node and an array specifying the AudioParam's of the node. This array 21 // in turn gives the name of the AudioParam, the default value for the 22 // |automationRate|, and whether it is fixed (isFixed). 23 const tests = [ 24 { 25 nodeName: 'AudioBufferSourceNode', 26 audioParams: [ 27 {name: 'detune', defaultRate: 'k-rate', isFixed: true}, 28 {name: 'playbackRate', defaultRate: 'k-rate', isFixed: true} 29 ] 30 }, 31 { 32 nodeName: 'BiquadFilterNode', 33 audioParams: [ 34 {name: 'frequency', defaultRate: 'a-rate', isFixed: false}, 35 {name: 'detune', defaultRate: 'a-rate', isFixed: false}, 36 {name: 'Q', defaultRate: 'a-rate', isFixed: false}, 37 {name: 'gain', defaultRate: 'a-rate', isFixed: false}, 38 ] 39 }, 40 { 41 nodeName: 'ConstantSourceNode', 42 audioParams: [{name: 'offset', defaultRate: 'a-rate', isFixed: false}] 43 }, 44 { 45 nodeName: 'DelayNode', 46 audioParams: 47 [{name: 'delayTime', defaultRate: 'a-rate', isFixed: false}] 48 }, 49 { 50 nodeName: 'DynamicsCompressorNode', 51 audioParams: [ 52 {name: 'threshold', defaultRate: 'k-rate', isFixed: true}, 53 {name: 'knee', defaultRate: 'k-rate', isFixed: true}, 54 {name: 'ratio', defaultRate: 'k-rate', isFixed: true}, 55 {name: 'attack', defaultRate: 'k-rate', isFixed: true}, 56 {name: 'release', defaultRate: 'k-rate', isFixed: true} 57 ] 58 }, 59 { 60 nodeName: 'GainNode', 61 audioParams: [{name: 'gain', defaultRate: 'a-rate', isFixed: false}] 62 }, 63 { 64 nodeName: 'OscillatorNode', 65 audioParams: [ 66 {name: 'frequency', defaultRate: 'a-rate', isFixed: false}, 67 {name: 'detune', defaultRate: 'a-rate', isFixed: false} 68 ] 69 }, 70 { 71 nodeName: 'PannerNode', 72 audioParams: [ 73 {name: 'positionX', defaultRate: 'a-rate', isFixed: false}, 74 {name: 'positionY', defaultRate: 'a-rate', isFixed: false}, 75 {name: 'positionZ', defaultRate: 'a-rate', isFixed: false}, 76 {name: 'orientationX', defaultRate: 'a-rate', isFixed: false}, 77 {name: 'orientationY', defaultRate: 'a-rate', isFixed: false}, 78 {name: 'orientationZ', defaultRate: 'a-rate', isFixed: false}, 79 ] 80 }, 81 { 82 nodeName: 'StereoPannerNode', 83 audioParams: [{name: 'pan', defaultRate: 'a-rate', isFixed: false}] 84 }, 85 ]; 86 87 function testAudioParam(context, node, param) { 88 const audioParam = node[param.name]; 89 const defaultRate = param.defaultRate; 90 91 // Verify that the default value is correct. 92 assert_equals( 93 audioParam.automationRate, 94 defaultRate, 95 `Default ${context}.${param.name}.automationRate should be 96 "${defaultRate}"` 97 ); 98 99 // Try setting the rate to a different rate. If the |automationRate| 100 // is fixed, expect an error. Otherwise, expect no error and expect 101 // the value is changed to the new value. 102 const newRate = defaultRate === 'a-rate' ? 'k-rate' : 'a-rate'; 103 104 if (param.isFixed) { 105 assert_throws_dom( 106 'InvalidStateError', 107 () => { 108 audioParam.automationRate = newRate; 109 }, 110 `Setting ${context}.${param.name}.automationRate to 111 "${newRate}" should throw InvalidStateError` 112 ); 113 } else { 114 audioParam.automationRate = newRate; 115 assert_equals( 116 audioParam.automationRate, 117 newRate, 118 `${context}.${param.name}.automationRate should change 119 to "${newRate}"` 120 ); 121 } 122 } 123 124 // Tests for each AudioNode type 125 for (const { nodeName, audioParams } of tests) { 126 test(() => { 127 const context = new OfflineAudioContext({ length: sampleRate, 128 sampleRate }); 129 const node = new window[nodeName](context); 130 audioParams.forEach(param => testAudioParam(nodeName, node, 131 param)); 132 }, `${nodeName}`); 133 } 134 135 // Special case: AudioListener tests 136 test(() => { 137 const context = new OfflineAudioContext({ length: sampleRate, 138 sampleRate }); 139 const listenerParams = [ 140 { name: 'positionX', defaultRate: 'a-rate', isFixed: false }, 141 { name: 'positionY', defaultRate: 'a-rate', isFixed: false }, 142 { name: 'positionZ', defaultRate: 'a-rate', isFixed: false }, 143 { name: 'forwardX', defaultRate: 'a-rate', isFixed: false }, 144 { name: 'forwardY', defaultRate: 'a-rate', isFixed: false }, 145 { name: 'forwardZ', defaultRate: 'a-rate', isFixed: false }, 146 { name: 'upX', defaultRate: 'a-rate', isFixed: false }, 147 { name: 'upY', defaultRate: 'a-rate', isFixed: false }, 148 { name: 'upZ', defaultRate: 'a-rate', isFixed: false } 149 ]; 150 151 listenerParams.forEach(param => { 152 testAudioParam('AudioListener', context.listener, param); 153 }); 154 }, 'AudioListener'); 155 </script> 156 </body> 157 </html>