tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>