| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <script src="../fast/js/resources/js-test-pre.js"></script> | |
| <script type="text/javascript" src="resources/audio-testing.js"></script> | |
| </head> | |
| <body> | |
| <div id="description"></div> | |
| <div id="console"></div> | |
| <script> | |
| description("This test verifies that the AudioBasicInspectorNode based nodes work correctly."); | |
| var sampleRate = 44100.0; | |
| // We carefully arrange the renderLengthInFrames to be a multiple of the AudioNode rendering quantum (AudioNode::ProcessingSizeInFrames) | |
| // so that AudioSourceNode will not feed tailing zeroes into the context and fail this test. | |
| var renderLengthInFrames = 256; | |
| var fftSize = 64; | |
| var audioDataOne = 255; // Audio data 1.0 in Uint8 format will be 255. | |
| var audioDataZero = 128; // Audio data 0 in Uint8 format will be 128. | |
| var context; | |
| var constantBuffer; | |
| var bufferSource; | |
| var analyser; | |
| function constructCommonGraph() { | |
| // Create offline audio context. | |
| context = new webkitAudioContext(1, renderLengthInFrames, sampleRate); | |
| constantBuffer = createConstantBuffer(context, renderLengthInFrames, 1); | |
| bufferSource = context.createBufferSource(); | |
| bufferSource.buffer = constantBuffer; | |
| analyser = context.createAnalyser(); | |
| analyser.fftSize = fftSize; | |
| bufferSource.connect(analyser); | |
| } | |
| function test1Finished() { | |
| var timeDomainData = new Uint8Array(fftSize); | |
| analyser.getByteTimeDomainData(timeDomainData); | |
| if (timeDomainData[0] >= audioDataOne) | |
| testPassed("RealtimeAnalyserNode got pulled when connected from upstream node but not to downstream node."); | |
| else | |
| testFailed("RealtimeAnalyserNode failed to get pulled when connected from upstream node but not to downstream node."); | |
| test2(); | |
| } | |
| // To verify the realtimeAnalyser can pull data when there is an upstream node connected to it | |
| // but it's not connected to a downstream node. | |
| function test1() { | |
| constructCommonGraph(); | |
| bufferSource.noteOn(0); | |
| context.oncomplete = test1Finished; | |
| context.startRendering(); | |
| } | |
| function test2Finished() { | |
| var timeDomainData = new Uint8Array(fftSize); | |
| analyser.getByteTimeDomainData(timeDomainData); | |
| if (timeDomainData[0] >= audioDataOne) | |
| testPassed("RealtimeAnalyserNode got pulled when connected from upstream node and to destination node."); | |
| else | |
| testFailed("RealtimeAnalyserNode failed to be pulled when connected by upstream node and to destination node."); | |
| test3(); | |
| } | |
| // To verify the realtimeAnalyser can process normally when there is an upstream node connected to it | |
| // and it's also connected to a downstream node which ultimately connect to audio destination. | |
| function test2() { | |
| constructCommonGraph(); | |
| analyser.connect(context.destination); | |
| bufferSource.noteOn(0); | |
| context.oncomplete = test2Finished; | |
| context.startRendering(); | |
| } | |
| function test3Finished() { | |
| var timeDomainData = new Uint8Array(fftSize); | |
| analyser.getByteTimeDomainData(timeDomainData); | |
| // If realtimeAnalyser hasn't pulled any data, the data in buffer will be 0. | |
| if (timeDomainData[0] == audioDataZero) | |
| testPassed("RealtimeAnalyserNode didn't get pulled when it should not."); | |
| else | |
| testFailed("RealtimeAnalyserNode been pulled when it should not."); | |
| finishJSTest(); | |
| } | |
| // To verify the realtimeAnalyser will stop pulling if it is connected to a downstream node | |
| // which is not ultimatly connected to any audio destination. | |
| function test3() { | |
| constructCommonGraph(); | |
| var gain = context.createGainNode(); | |
| analyser.connect(gain); | |
| bufferSource.noteOn(0); | |
| context.oncomplete = test3Finished; | |
| context.startRendering(); | |
| } | |
| function runTest() { | |
| if (window.testRunner) { | |
| testRunner.dumpAsText(); | |
| testRunner.waitUntilDone(); | |
| } | |
| window.jsTestIsAsync = true; | |
| test1(); | |
| } | |
| runTest(); | |
| </script> | |
| <script src="../fast/js/resources/js-test-post.js"></script> | |
| </body> | |
| </html> |