MediaStreamTrackGenerator-audio.https.html (3654B)
1 <!doctype html> 2 <html> 3 4 <head> 5 <title>MediaStreamTrackGenerator</title> 6 <link rel="help" href="https://w3c.github.io/mediacapture-insertable-streams"> 7 </head> 8 9 <body> 10 <p class="instructions">When prompted, use the accept button to give permission to use your audio and video devices.</p> 11 <h1 class="instructions">Description</h1> 12 <p class="instructions">This test checks that generating audio MediaStreamTracks works as expected.</p> 13 <audio id="audioElement" autoplay=true></audio> 14 <script src=/resources/testharness.js></script> 15 <script src=/resources/testharnessreport.js></script> 16 <script src=/resources/testdriver.js></script> 17 <script src=/resources/testdriver-vendor.js></script> 18 <script src='/mediacapture-streams/permission-helper.js'></script> 19 <script> 20 21 function makeAudioData(timestamp) { 22 const sampleRate = 30000; 23 24 let frames = sampleRate / 10; 25 let channels = 1; 26 27 // Generate a simple sin wave, so we have something. 28 let data = new Float32Array(frames*channels); 29 const hz = 100; // sound frequency 30 for (let i = 0; i < data.length; i++) { 31 const t = (i / sampleRate) * hz * (Math.PI * 2); 32 data[i] = Math.sin(t); 33 } 34 35 return new AudioData({ 36 timestamp: timestamp, 37 numberOfFrames: frames, 38 numberOfChannels: channels, 39 sampleRate: sampleRate, 40 data: data, 41 format: "f32", 42 }); 43 } 44 45 promise_test(async t => { 46 const generator = new MediaStreamTrackGenerator("audio"); 47 48 const writer = generator.writable.getWriter(); 49 await writer.write(makeAudioData(1)); 50 51 assert_equals(generator.kind, "audio"); 52 assert_equals(generator.readyState, "live"); 53 54 t.add_cleanup(() => generator.stop()); 55 }, "Tests that creating a Audio MediaStreamTrackGenerator works as expected"); 56 57 promise_test(async t => { 58 assert_throws_js(TypeError, () => { new MediaStreamTrackGenerator({ kind: "invalid kind" }) }); 59 }, "Creating Generator with an invalid kind throws"); 60 61 promise_test(async t => { 62 await setMediaPermission(); 63 const capturedStream = await navigator.mediaDevices.getUserMedia({ audio: true }); 64 assert_equals(capturedStream.getAudioTracks().length, 1); 65 const upstreamTrack = capturedStream.getAudioTracks()[0]; 66 t.add_cleanup(() => upstreamTrack.stop()); 67 68 assert_throws_js(TypeError, () => { new MediaStreamTrackGenerator() }); 69 }, "Creating Generator with a missing kind throws"); 70 71 promise_test(async t => { 72 const generator = new MediaStreamTrackGenerator({ kind: "video" }); 73 t.add_cleanup(() => generator.stop()); 74 75 const writer = generator.writable.getWriter(); 76 const data = makeAudioData(1); 77 78 writer.write(data).then(t.step_func(() => assert_unreached("Write should reject")), t.step_func(f => assert_true(f instanceof TypeError, "write rejects with a TypeError"))); 79 }, "Mismatched data and generator kind throws on write."); 80 81 promise_test(async t => { 82 const generator = new MediaStreamTrackGenerator("audio"); 83 t.add_cleanup(() => generator.stop()); 84 85 const audioElement = document.getElementById("audioElement"); 86 audioElement.srcObject = new MediaStream([generator]); 87 await audioElement.play(); 88 89 const writer = generator.writable.getWriter(); 90 await writer.write(makeAudioData(1)); 91 92 // Wait for audio playout to actually happen. 93 await t.step_wait(() => audioElement.currentTime > 0, "audioElement played out generated track"); 94 }, "Tests that audio actually flows to a connected audio element"); 95 </script> 96 </body> 97 </html>