| <!DOCTYPE html> | |
| <!-- | |
| Tests that AudioGainNode is properly scaling the gain. | |
| We'll render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1. | |
| The 11th note will be of gain 0.0, so it should be silent (at the end in the rendered output). | |
| --> | |
| <html> | |
| <head> | |
| <script type="text/javascript" src="resources/audio-testing.js"></script> | |
| </head> | |
| <body> | |
| <script> | |
| window.onload = init; | |
| var sampleRate = 44100.0; | |
| var bufferDurationSeconds = 0.125; | |
| var numberOfNotes = 11; | |
| var noteSpacing = bufferDurationSeconds + 0.020; // leave 20ms of silence between each "note" | |
| var lengthInSeconds = numberOfNotes * noteSpacing; | |
| var context = 0; | |
| var sinWaveBuffer = 0; | |
| function createSinWaveBuffer(lengthInSeconds, frequency) { | |
| var audioBuffer = context.createBuffer(2, lengthInSeconds * sampleRate, sampleRate); | |
| var n = audioBuffer.length; | |
| var channelL = audioBuffer.getChannelData(0); | |
| var channelR = audioBuffer.getChannelData(1); | |
| for (var i = 0; i < n; ++i) { | |
| channelL[i] = Math.sin(frequency * 2.0*Math.PI * i / sampleRate); | |
| channelR[i] = channelL[i]; | |
| } | |
| return audioBuffer; | |
| } | |
| function playNote(time, gain) { | |
| var source = context.createBufferSource(); | |
| source.buffer = sinWaveBuffer; | |
| var gainNode = context.createGainNode(); | |
| gainNode.gain.value = gain; | |
| source.connect(gainNode); | |
| gainNode.connect(context.destination); | |
| source.noteOn(time); | |
| } | |
| function init() { | |
| if (!window.testRunner) | |
| return; | |
| // Create offline audio context. | |
| context = new webkitAudioContext(2, sampleRate * lengthInSeconds, sampleRate); | |
| // Create a buffer for a short "note". | |
| sinWaveBuffer = createSinWaveBuffer(bufferDurationSeconds, 880.0); | |
| // Render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1. | |
| // The last note will be of gain 0.0, so shouldn't be perceptible in the rendered output. | |
| for (var i = 0; i < numberOfNotes; ++i) { | |
| var time = i * noteSpacing; | |
| var gain = 1.0 - i / (numberOfNotes - 1); | |
| playNote(time, gain); | |
| } | |
| context.oncomplete = finishAudioTest; | |
| context.startRendering(); | |
| testRunner.waitUntilDone(); | |
| } | |
| </script> | |
| </body> | |
| </html> |