WebRTC + WebAudio bug

by juberti

HTML

<button onclick="playNewSound()">▶</button>
<button onclick="reconnect()">?</button>
<video muted autoplay/>
<audio autoplay/>

JavaScript

window.AudioContext = window.AudioContext || window.webkitAudioContext;

var audioContext = new AudioContext();
var video = document.querySelector("video");
var audio = document.querySelector("audio");
var pc1, pc2;

async function playNewSound() {
  audio.play();
  audioContext.resume();
  createConnection(createLocalStream(), video);
  setInterval(() => { 
    console.log(audioContext.state);
  }, 1000);
}

function reconnect() {
  audio.play();
  video.play();
  connectRemoteStream(video.srcObject, video);
}

function createLocalStream() {
  var audioContext2 = new AudioContext();
  audioContext2.resume();
  var oscillator = audioContext2.createOscillator();
  oscillator.type = 'sine';
  oscillator.frequency.value = 440; // value in hertz
  
  var dest = audioContext2.createMediaStreamDestination();
  oscillator.connect(dest); 
  oscillator.start(0);
  return dest.stream;
}

function connectRemoteStream(stream, elem) {
  elem.srcObject = stream;
  if (0) {
    audio.srcObject = stream;
  } else {
    const mss = audioContext.createMediaStreamSource(stream);
    mss.connect(audioContext.destination);
  }
}

async function createConnection(stream, elem) {
  pc1 = new RTCPeerConnection({}), pc2 = new RTCPeerConnection({});
  pc1.addTrack(stream.getTracks()[0], stream);
  pc1.onicecandidate = (e) => { if (e.candidate) pc2.addIceCandidate(e.candidate); }
  pc2.onicecandidate = (e) => { if (e.candidate) pc1.addIceCandidate(e.candidate); }
  pc2.ontrack = (e) => { connectRemoteStream(e.streams[0], elem); }
  const offer = await pc1.createOffer();
  await pc1.setLocalDescription(offer);
  await pc2.setRemoteDescription(offer);
  const answer = await pc2.createAnswer();
  await pc2.setLocalDescription(answer);
  await pc1.setRemoteDescription(answer);
}