今から説明するものは、
socket.on('audio', (payload) => {
  // 送り先はともかく、ほんとに流すだけ
  socket.to(payload.ch).emit('audio', payload.buf);
});
var processor = context.createScriptProcessor(
  BUFFER_SIZE,
  // 1: Monoral, 2: Stereo
  numOfInputCh,
  numOfOutputCh
);
processor.onaudioprocess = function(ev) {
  var inputBuffer  = ev.inputBuffer;
  var outputBuffer = ev.outputBuffer;
  // Float32Array
  var inputData  = inputBuffer.getChannelData(0);
  var outputData = outputBuffer.getChannelData(0);
  for (var sample = 0; sample < inputBuffer.length; sample++) {
    outputData[sample] = inputData[sample];
  }
  // or just set
  // outputData.set(inputData);
};
PCMのサンプルデータに直接アクセスできるAudioNode
var filter = context.createBiquadFilter();
// 電話はバンドパスフィルタ
filter.type = 'bandpass';
// アナログ電話は300Hz ~ 3.4kHz / ひかり電話は100Hz ~ 7kHzを使ってる
// 今回は高品質あたりに山を作る
filter.frequency.value = (100 + 7000) / 2;
// 固定ならだいたい聴き良いのがこれくらい・・?
filter.Q.value = 0.25;
最適な通過帯域は声や音によってそれぞれなので、決め打ちは気休めでしかない・・
が、コレが有るのと無いのでは大違い
new Worker('./worker.js');
// require('webworkify')(require('./worker.js'));
webworkifysocket.on('audio', this._handleAudioBuffer);
// とにかくこれがすごい呼ばれる
function _handleAudioBuffer(buf) {
  var currentTime = ctx.currentTime;
  // 略
  // 貯まってるので未来に再生
  if (currentTime < startTime) {
    source.start(startTime);
    startTime += audioBuffer.duration;
  }
  // すぐ再生
  else {
    source.start(startTime);
    startTime = currentTime + audioBuffer.duration;
  }
}
こうしないと、Socketの到着タイミングで随時再生されちゃうので、プツプツと聞けたもんじゃない!
同一WiFi上で、
Pub: Mac ⇔ Server ⇔ Sub: Mac || iPhoneの場合。
| Pubの内容 | 評価 | 備考 | 
|---|---|---|
| マイクから声 | S+ | |
| 動画ニュース | S+ | |
| 音楽 | S | さすがに音質が気になる | 
サーバーをVPSに立ててみた。
Pub: Mac ⇔ Server ⇔ Sub: Mac || iPhoneの場合。
| Pubの内容 | 評価 | 備考 | 
|---|---|---|
| マイクから声 | S | 1秒くらい遅れる | 
| 動画ニュース | S | 〃 | 
| 音楽 | A+ | 音質は(ry |