audiochannelsplitter.html (3677B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title> 5 Tests AudioChannelSplitter 6 </title> 7 <script src="/resources/testharness.js"></script> 8 <script src="/resources/testharnessreport.js"></script> 9 <script src="/webaudio/resources/audit-util.js"></script> 10 </head> 11 <body> 12 <script> 13 14 // Arbitrary power-of-two-length render so timing math is exact. 15 const sampleRate = 44100.0; 16 const lengthInSampleFrames = 512; 17 18 // checkResult() checks that the rendered buffer is stereo and that the 19 // left channel is all –1 and right channel all +1. In other words, 20 // we've reversed the order of the two channels. 21 function checkResult(buffer) { 22 assert_equals( 23 buffer.numberOfChannels, 24 2, 25 'Rendered buffer must be stereo'); 26 27 const left = buffer.getChannelData(0); 28 const right = buffer.getChannelData(1); 29 30 assert_constant_value(left, -1, 'Left channel:'); 31 assert_constant_value(right, 1, 'Right channel:'); 32 } 33 34 function createStereoBufferWithDCOffset(context, length, sr, offset) { 35 const buffer = new AudioBuffer({ 36 numberOfChannels: 2, 37 length: length, 38 sampleRate: sr 39 }); 40 const channelL = buffer.getChannelData(0); 41 const channelR = buffer.getChannelData(1); 42 43 for (let i = 0; i < length; ++i) { 44 channelL[i] = offset; 45 channelR[i] = -offset; 46 } 47 return buffer; 48 } 49 50 test(t => { 51 // Create a stereo OfflineAudioContext. 52 const context = new OfflineAudioContext( 53 2, lengthInSampleFrames, sampleRate); 54 55 // Invalid splitter channel counts. 56 assert_throws_dom('IndexSizeError', 57 () => context.createChannelSplitter(0), 58 'createChannelSplitter(0) must throw'); 59 assert_throws_dom('IndexSizeError', 60 () => context.createChannelSplitter(33), 61 'createChannelSplitter(33) must throw'); 62 63 // Maximum valid splitter. 64 let splitter = context.createChannelSplitter(32); 65 assert_equals(splitter.numberOfOutputs, 32, 66 'splitter.numberOfOutputs'); 67 assert_equals(splitter.numberOfInputs, 1, 68 'splitter.numberOfInputs'); 69 70 // Default constructor should yield 6 outputs. 71 splitter = context.createChannelSplitter(); 72 assert_equals(splitter.numberOfOutputs, 6, 73 'Default output count should be 6'); 74 }, 'Construction of ChannelSplitterNode'); 75 76 77 promise_test(async t => { 78 // Create a stereo OfflineAudioContext. 79 const context = new OfflineAudioContext( 80 2, lengthInSampleFrames, sampleRate); 81 82 // Create a stereo buffer, with all +1 values in left channel, all 83 // –1 in right channel. 84 const srcBuffer = createStereoBufferWithDCOffset( 85 context, lengthInSampleFrames, sampleRate, 1); 86 87 const source = new AudioBufferSourceNode(context, { 88 buffer: srcBuffer 89 }); 90 const splitter = new ChannelSplitterNode(context, { 91 numberOfOutputs: 2 92 }); 93 const merger = new ChannelMergerNode(context); 94 95 source.connect(splitter); 96 splitter.connect(merger, 0, 1); 97 splitter.connect(merger, 1, 0); 98 merger.connect(context.destination); 99 100 source.start(); 101 102 const renderedBuffer = await context.startRendering(); 103 checkResult(renderedBuffer); 104 }, 'Functionality of ChannelSplitterNode (channel swap)'); 105 </script> 106 </body> 107 </html>