AudioWorkletNode: port プロパティ

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2021.

AudioWorkletNode インターフェイスの読み取り専用プロパティ port は、関連付けられた MessagePort を返します。これにより、ノードと対応する AudioWorkletProcessor の間で双方向通信ができます。

メモ: チャネルのもう一方の端にあるポートは、処理器の port プロパティから参照できます。

この AudioWorkletNode と対応する AudioWorkletProcessor を繋ぐ MessagePort オブジェクトです。

双方向通信でできることのデモのため、無音を出力し、AudioWorkletNode からの ping 要求に応える AudioWorkletProcessor を作成します。

まず、独自の AudioWorkletProcessor を定義し、登録します。 これは別のファイルで行うことに注意してください。

js
// ping-pong-processor.js
class PingPongProcessor extends AudioWorkletProcessor {
  constructor(...args) {
    super(...args);
    this.port.onmessage = (e) => {
      console.log(e.data);
      this.port.postMessage("pong");
    };
  }
  process(inputs, outputs, parameters) {
    return true;
  }
}

registerProcessor("ping-pong-processor", PingPongProcessor);

そして、メインスクリプトファイルで処理器をロードし、処理器の名前を渡して AudioWorkletNode のインスタンスを作成し、このノードを音声グラフに接続します。

js
const audioContext = new AudioContext();
await audioContext.audioWorklet.addModule("ping-pong-processor.js");
const pingPongNode = new AudioWorkletNode(audioContext, "ping-pong-processor");
// 毎秒、AudioWorkletNode から
// 文字列 'ping' が入ったメッセージを AudioWorkletProcessor に送る
setInterval(() => pingPongNode.port.postMessage("ping"), 1000);
pingPongNode.port.onmessage = (e) => console.log(e.data);
pingPongNode.connect(audioContext.destination);

このプログラムは、コンソールに毎秒文字列 "ping""pong" を出力します。

仕様書

Specification
Web Audio API
# dom-audioworkletnode-port

ブラウザーの互換性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
port

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

関連情報