WebRTC getSources

by juberti

HTML

<button onclick="start()">▶</button>
<audio autoplay/>

JavaScript

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

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

async function start() {
  audio.play();
  audioContext.resume();
  createConnection(createLocalStream(), audio);
  setInterval(() => { 
    dumpReceiver(pc2);
  }, 1000);
}

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

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) => { elem.srcObject = e.streams[0]; }
  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);
}

async function dumpReceiver(pc) {
  const sources = await pc.getReceivers()[0].getSynchronizationSources();
  console.log(sources);
}