オーディオセッション

W3C作業草案,

この文書についての詳細
このバージョン:
https://www.w3.org/TR/2024/WD-audio-session-20241113/
最新公開バージョン:
https://www.w3.org/TR/audio-session/
編集者草案:
https://w3c.github.io/audio-session/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/audio-session/
フィードバック:
GitHub
編集者:
(Apple)
(Mozilla)

概要

この API は、オーディオがどのようにレンダリングされ、他のオーディオ再生アプリケーションとどのように相互作用するかを制御するための API サーフェスを定義します。

この文書の状態

この節では、公開時点におけるこの文書の状態について説明します。現在の W3C 公開文書およびこの技術報告書の最新改訂版の一覧は、 https://www.w3.org/TR/ にある W3C 技術報告書インデックスで 見つけることができます。

この仕様に対するフィードバックおよびコメントを歓迎します。この仕様についての議論には、GitHub Issues が推奨されます。 あるいは、Media Working Group のメーリングリスト public-media-wg@w3.org (アーカイブ) にコメントを送ることもできます。 この草案では、ワーキンググループでまだ議論されるべき未解決の課題の一部を強調しています。 これらの課題の結果について、それらが有効であるかどうかを含め、まだ決定は行われていません。

この文書は、Media Working Group により、 勧告 トラックを用いて作業草案として公開されました。 この文書は W3C 勧告となることを意図しています。

作業草案としての公開は、W3C およびそのメンバーによる承認を意味するものではありません。

これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される可能性があります。 作業中の文書以外のものとしてこの文書を引用することは不適切です。

この文書は、W3C 特許ポリシーの下で運営されるグループによって作成されました。W3C は、そのグループの成果物に関連して行われた特許開示の公開一覧を維持しています。 そのページには、特許を開示するための手順も含まれています。個人が、その個人の実際の知識として、必須クレームを含むと信じる特許を知っている場合、その個人は W3C 特許ポリシー第 6 節に従って 情報を開示しなければなりません。

この文書は、2023年11月3日 W3C プロセス文書に準拠します。

1. はじめに

人々は、ますます Web を通じてメディア(オーディオ/ビデオ)を消費するようになっており、 Web はこの種のコンテンツにアクセスするための主要なチャネルになっています。 しかし、Web 上のメディアは、多くの場合、基盤となるプラットフォームとのシームレスな統合を欠いています。 Audio Session API は、オーディオセッション管理または類似のオーディオフォーカス機能をサポートする プラットフォーム全体でメディア処理を強化することにより、この隔たりに対処します。 この API は、Web ベースのオーディオが他のアプリとどのように相互作用するかを改善し、 コンテキストに応じて、より良いオーディオミキシングまたは排他的な再生を可能にし、 デバイス全体でより一貫した統合メディア体験を提供します。

さらに、一部のプラットフォームは、メディア再生およびオーディオ再生に使用される API に基づいて、 サイトのオーディオセッションを自動的に管理します。 しかし、この振る舞いは、常にユーザーの期待に沿うとは限りません。 この API により、開発者はデフォルトの振る舞いを上書きし、オーディオセッションをより細かく制御できます。

2. 概念

Web ページは、HTMLMediaElementAudioContext などのさまざまな API を組み合わせて、さまざまな方法でオーディオ処理を行うことができます。 このオーディオ処理には開始と停止があり、使用されているすべての異なるオーディオ API を集約します。 オーディオセッションは、 この集約されたオーディオ処理を表します。これは、Web ページが行うオーディオ処理の一般的な性質を Web ページが表明できるようにします。

オーディオセッションは、特定の を持ち、 特定の 状態にあることができます。 オーディオセッションは、個々の ソース(マイク録音)およびシンク(オーディオレンダリング)の集合に対するオーディオを管理し、それらは オーディオセッションの 要素と呼ばれます。

オーディオセッション要素には、 いくつかのプロパティがあります。

オーディオセッション要素は、その可聴フラグtrue の場合、 可聴要素です。

さらに、オーディオセッション要素には、さまざまな状態変化を処理するための関連する手順があります。 デフォルトでは、これらの各手順は空の手順リストです。

この仕様は、これらの手順、デフォルト型、および可聴フラグを、オーディオセッションの一部の要素について、§ 6 オーディオソースおよびシンクの統合で定義しています。 他の要素を定義する仕様は、これらの手順とプロパティを定義する必要があります。

トップレベル閲覧コンテキストは、 選択されたオーディオセッションを持ちます。 任意のオーディオセッションに 変更があった場合、ユーザーエージェントはどのオーディオセッション選択されたオーディオセッションになるかを更新します。 トップレベル閲覧コンテキストは、その選択されたオーディオセッションnull でなく、かつその状態が active である場合、オーディオフォーカスを持つといいます。

ユーザーエージェントは、複数のトップレベル閲覧コンテキストオーディオ フォーカスを持つことを許可するか、または任意の時点で単一のトップレベル閲覧コンテキストだけがオーディオフォーカスを持つように強制するかを決定できます。

3. AudioSession インターフェイス

AudioSession は、この API の主要なインターフェイスです。 これは Navigator インターフェイスを通じてアクセスされます(§ 4 Navigator インターフェイスへの拡張を参照)。

[Exposed=Window]
interface AudioSession : EventTarget {
  attribute AudioSessionType type;

  readonly attribute AudioSessionState state;
  attribute EventHandler onstatechange;
};

realmAudioSession オブジェクトを作成するには、次の手順を実行します。

  1. audioSession を、realm における新しい AudioSession オブジェクトとし、次の内部スロットで初期化します。

    1. [[type]] は、オーディオセッションのを格納し、 auto に初期化されます。

    2. [[state]] は、オーディオセッションの状態を格納し、inactive に初期化されます。

    3. [[elements]] は、オーディオセッションの要素を格納し、空リストに初期化されます。

    4. [[interruptedElements]] は、可聴である間に 中断されたオーディオセッションの要素を格納し、 空リストに初期化されます。

    5. [[appliedType]] は、オーディオセッションに適用されたを格納し、 auto に初期化されます。

    6. [[isTypeBeingApplied]] フラグは、 がオーディオセッションに適用中かどうかを格納し、 false に初期化されます。

  2. audioSession を返します。

AudioSession オブジェクトは、その基盤となるオーディオセッションに一意に結び付けられます

AudioSession の state 属性は、そのオーディオ セッション状態を反映します。 取得時には、AudioSession[[state]] 値を返さなければなりません。

AudioSession の type 属性は、auto を除き、そのオーディオ セッションを反映します。

取得時には、AudioSession[[type]] 値を返さなければなりません。

設定時には、audioSession に設定される新しい値を newValue として、 次の手順を実行しなければなりません。

  1. audioSession.[[type]]newValue と等しい場合、これらの手順を中止します。

  2. audioSession.[[type]]newValue に設定します。

  3. audioSession型を更新します

3.1. オーディオセッション型

慣例として、さまざまな目的に応じて、いくつかの異なるオーディオセッションがあります。 API では、これらは AudioSessionType enum によって表されます。

playback
再生オーディオ。これは動画や音楽再生、ポッドキャストなどに使用されます。 他の再生オーディオとミックスされるべきではありません。(おそらく)他のすべてのオーディオを無期限に一時停止すべきです。
transient
通知音などの一時的なオーディオ。通常、再生オーディオの上に重ねて再生されるべきです(また、 永続的なオーディオを「ダック」することもあります)。
transient-solo
運転案内などの一時的なソロオーディオ。他のすべてのオーディオを一時停止/ミュートし、 排他的に再生すべきです。一時的なソロオーディオが終了したときは、一時停止/ミュートされたオーディオを再開すべきです。
ambient
アンビエントオーディオ。これは他の種類のオーディオとミックス可能です。 ユーザーが複数のページからのオーディオをミックスしたい場合など、一部の特殊なケースで有用です。
play-and-record
再生および録音オーディオ。これはオーディオ録音に使用されます。 マイクが使用されている場合やビデオ会議アプリケーションで有用です。
auto
Auto は、Web ページによるオーディオの使用に応じて、ユーザーエージェントが最適なオーディオセッション型を選択できるようにします。 これは AudioSession のデフォルト型です。
enum AudioSessionType {
  "auto",
  "playback",
  "transient",
  "transient-solo",
  "ambient",
  "play-and-record"
};

AudioSessionType は、それが playbackplay-and-record または transient-solo である場合、排他的型です。

3.2. オーディオセッション状態

オーディオセッションは、 次のいずれかの状態にあることができ、これらは API では AudioSessionState enum によって表されます。

active
オーディオセッションは、 音を再生しているか、マイクを録音しています。
interrupted
オーディオセッションは、 音を再生しておらず、マイクも録音していませんが、中断が解除されれば再開できます。
inactive
オーディオセッションは、 音を再生しておらず、マイクも録音していません。
enum AudioSessionState {
  "inactive",
  "active",
  "interrupted"
};

オーディオセッションの状態は 変化する可能性があり、その変化は状態の変化を通知する手順を通じて、対応する AudioSession オブジェクトに自動的に反映されます。

4. Navigator インターフェイスへの拡張

Window は、関連付けられた AudioSessionを持ち、これは AudioSession オブジェクトです。 これは、オーディオセッションパラメーターを自動的に設定するためにユーザーエージェントが使用するデフォルトの オーディオセッションを表します。 ユーザーエージェントは、オーディオセッション要素が再生を開始または終了したときに、 オーディオフォーカスを要求または放棄します。 Window オブジェクトの作成時に、その関連付けられた AudioSessionは、AudioSession オブジェクトとして新たに作成され、Window オブジェクトの関連するレルムで設定されなければなりません。

関連付けられた AudioSession要素のリストは、Window オブジェクトのオーディオソースおよびシンクが作成または削除されるにつれて動的に更新されます。

[Exposed=Window]
partial interface Navigator {
  // The default audio session that the user agent will use when media elements start/stop playing.
  readonly attribute AudioSession audioSession;
};

5. オーディオセッションアルゴリズム

5.1. AudioSession の type を更新する

audioSession型を更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[isTypeBeingApplied]]true の場合、 これらの手順を中止します。

  2. audioSession.[[isTypeBeingApplied]]true に設定します。

  3. 次の手順を実行するタスクをキューに入れます

    1. audioSession.[[isTypeBeingApplied]]false に設定します。

    2. audioSession.[[type]]audioSession.[[appliedType]] と同じである場合、これらの手順を中止します。

    3. audioSession.[[appliedType]]audioSession.[[type]] に設定します。

    4. audioSession により、audioSessionトップレベル閲覧コンテキストすべての AudioSession 状態を更新します

    5. audioSession.[[elements]] の各 element について、element更新します

    6. newType を、audioSession型を計算する結果とします。

    7. 並列にaudioSessionオーディオセッションnewType に設定します。

5.2. AudioSession の state を更新する

オーディオセッション要素が開始または停止しているとき、ユーザーエージェントは、 非アクティブ化するおよびアクティブ化を試みるアルゴリズムを通じて、オーディオセッション状態を設定する手順を実行します。 オーディオセッション状態active に設定することには、特にオーディオセッション排他的型である場合、結果が伴います。

逆に、オーディオセッション状態は、 オーディオセッション要素の変更とは別に変更されることがあります。 ユーザーエージェントがそのような変更を観測したとき、ユーザーエージェントは、変更されたオーディオセッション結び付けられた AudioSession オブジェクトである audioSession と、新しいオーディオセッション状態である newState を用いて、状態の変化を通知するためのタスクをキューに入れなければなりません。

アクティブな playback オーディオセッションは、着信電話、または別のタブで新しいメディアコンテンツの再生を開始しようとしている 別の playback セッションによって中断されることがあります。

audioSession および newState を用いて状態の 変化を通知するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. isMutatingState を、audioSession.[[state]]newState でない場合は true、そうでない場合は false とします。

  2. audioSession.[[state]]newState に設定します。

  3. newStateinactive の場合、 audioSession.[[interruptedElements]] を空リストに設定します。

  4. audioSession.[[elements]] の各 element について、element更新します

  5. isMutatingStatefalse の場合、これらの手順を中止します。

  6. audioSession により、audioSessionトップレベル閲覧コンテキストすべての AudioSession 状態を更新します

  7. audioSession に対して statechange という名前のイベントを発火します。

audioSession という名前の AudioSession非アクティブ化するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[state]]inactive である場合、 これらの手順を中止します。

  2. 次の手順を並列に実行します。

    1. audioSessionオーディオセッション状態を設定しinactive にします。

    2. アサート: audioSessionオーディオセッション状態inactive です。

    3. audioSession と、そのオーディオセッション状態を用いて、状態の 変化を通知するためのタスクをキューに入れます

audioSession という名前の AudioSessionアクティブ化を試みるには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[state]]active である場合、 これらの手順を中止します。

  2. 次の手順を並列に実行します。

    1. audioSessionオーディオセッション状態を設定しactive にします。 状態を設定することは、 active に対して失敗する可能性があり、その場合、オーディオセッション状態inactive または interrupted のいずれかになります。

    2. audioSession と、そのオーディオセッション状態を用いて、状態の 変化を通知するためのタスクをキューに入れます

オーディオセッションのアクティブ化は、 さまざまな理由で失敗する可能性があります。 たとえば、電話アプリケーションのようなより高い権限を持つアプリケーションがすでにオーディオを再生している間に、 Web アプリケーションが何らかのオーディオの再生を開始しようとする場合があります。

5.3. 選択されたオーディオセッションを更新する

context という名前のトップレベル閲覧コンテキスト選択された オーディオセッションを更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. activeAudioSessions を、context およびその子の AudioSession オブジェクトに結び付けられたすべてのオーディオセッションのうち、幅優先順で、次の 両方の制約に一致するもののリストとします。

    1. その状態active です。

    2. AudioSession オブジェクトの型を計算する結果が排他的型です。

  2. activeAudioSessions が空の場合、これらの手順を中止します。

  3. activeAudioSessions 内にオーディオ セッションが 1 つだけある場合、選択されたオーディオセッションを このオーディオセッションに設定し、 これらの手順を中止します。

  4. アサート: activeAudioSessions 内のオーディオ セッション結び付けられた任意の AudioSession オブジェクトで、audioSession という名前のものについて、 audioSession.[[type]]auto です。

    明示的な排他的型を持つオーディオセッションは、任意の時点で 1 つだけ アクティブになれることが期待されます。 activeAudioSessions 内に複数のアクティブなオーディオセッションがある場合、それらの [[type]]auto のみになり得ます。
  5. ユーザーエージェントは、activeAudioSessions を並べ替えるために特定のヒューリスティックを適用してもよいです。

  6. 選択されたオーディオセッションを、 activeAudioSessions 内の最初のオーディオセッションに設定します。

5.4. その他のアルゴリズム

context という名前のトップレベル閲覧コンテキストすべての AudioSession 状態を更新するには、 updatedAudioSession を用いて、次の手順を実行します。

  1. context選択されたオーディオセッションを更新します

  2. updatedType を、updatedAudioSession型を 計算する結果とします。

  3. updatedType排他的型でない場合、または updatedAudioSession.[[state]]active でない場合、 これらの手順を中止します。

  4. audioSessions を、context およびその子のすべての AudioSession オブジェクトの幅優先順のリストとします。

  5. updatedAudioSession を除く audioSessions の各 audioSession について、 次の手順を実行します。

    1. audioSession.[[state]]active でない場合、 これらの手順を中止します。

    2. type を、audioSession型を計算する結果とします。

    3. type排他的型でない場合、これらの手順を中止します。

    4. typeupdatedType がどちらも auto の場合、 これらの手順を中止します。

    5. audioSession非アクティブ化します

audioSessionオーディオ セッション型を計算するには、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSession.[[type]]auto でない場合、 audioSession.[[type]] を返します。

  2. audioSession.[[elements]] のいずれかの elementplay-and-recordデフォルト型を持ち、その状態active である場合、 play-and-record を返します。

  3. audioSession.[[elements]] のいずれかの elementplaybackデフォルト型を持ち、その状態active である場合、 playback を返します。

  4. audioSession.[[elements]] のいずれかの elementtransient-soloデフォルト型を持ち、その状態active である場合、 transient-solo を返します。

  5. audioSession.[[elements]] のいずれかの elementtransientデフォルト型を持ち、その状態active である場合、 transient を返します。

  6. ambient を返します。

6. オーディオソースおよびシンクの統合

この節では、AudioContextHTMLMediaElement およびマイクの MediaStreamTrack について、オーディオ セッション要素の手順とプロパティを説明します。

要素状態は次のとおりです。

element という名前の要素を更新するには、 ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioSessionelementAudioSession とします。

  2. element更新手順を実行します。

  3. element可聴要素であり、かつ audioSession.[[state]]interrupted である場合、 次の手順を実行します。

    1. elementaudioSession.[[interruptedElements]] に追加します。

    2. element一時停止手順を実行します。

  4. elementaudioSession.[[interruptedElements]] 内にあり、かつ audioSession.[[state]]active である場合、 次の手順を実行します。

    1. elementaudioSession.[[interruptedElements]] から削除します。

    2. element再開手順を実行します。

audioSession要素の 1 つの可聴フラグが 変化しているとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. 可聴フラグtrue に変化している場合、audioSessionアクティブ化を試みます

  2. そうでなく、audioSession.[[elements]] のいずれかの elementinterrupted状態を持つ場合、 これらの手順を中止します。

  3. そうでなければ、audioSession非アクティブ化します

6.1. AudioContext

AudioContext は、次のプロパティを持つ要素です。

AudioContext が作成されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. audioContext を、新しく作成された AudioContext とします。

  2. audioSession を、audioContext が作成される Window オブジェクトの AudioSession オブジェクトとします。

  3. audioContextaudioSession.[[elements]] に追加します。

6.2. HTMLMediaElement

HTMLMediaElement は、次のプロパティを持つ要素です。

HTMLMediaElementノード文書が変更されるとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. mediaElement を、そのノード文書が変更される HTMLMediaElement とします。

  2. previousWindow を、存在する場合は mediaElement の以前のノード文書に関連付けられた Window オブジェクトとし、そうでなければ null とします。

  3. previousWindownull でない場合、mediaElementpreviousWindow関連付けられた AudioSession.[[elements]] から削除します。

  4. newWindow を、存在する場合は mediaElement の新しいノード文書に関連付けられた Window オブジェクトとし、そうでなければ null とします。

  5. newWindownull でない場合、mediaElementnewWindow関連付けられた AudioSession.[[elements]] に追加します。

6.3. マイク MediaStreamTrack

マイクキャプチャ MediaStreamTrack は、次のプロパティを持つ要素です。

マイクキャプチャ MediaStreamTrack が作成されたとき、ユーザーエージェントは次の手順を実行しなければなりません。

  1. track を、新しく作成された MediaStreamTrack とします。

  2. audioSession を、track が作成される Window オブジェクトの AudioSession オブジェクトとします。

  3. trackaudioSession.[[elements]] に追加します。

FIXME: MediaStreamTrack ではなく、Window の mediaDevices の mediaStreamTrackSources に格納されたオーディオトラックのソースにフックするべきです。 これは、転送されたマイクトラックの場合を扱うべきです。

7. プライバシーに関する考慮事項

8. セキュリティに関する考慮事項

9.

9.1. サイトがオーディオセッション型を先回りして "play-and-record" に設定する

navigator.audioSession.type = 'play-and-record';
// これ以降、音量は 'play-and-record' に基づいて設定される可能性があります。
...
// リモートメディアの再生を開始する
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// キャプチャを開始する
navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((stream) => {
    localVideo.srcObject = stream;
  });

9.2. サイトが中断に反応する

navigator.audioSession.type = "play-and-record";
// これ以降、音量は 'play-and-record' に基づいて設定される可能性があります。
...
// リモートメディアの再生を開始する
remoteVideo.srcObject = remoteMediaStream;
remoteVideo.play();
// キャプチャを開始する
navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((stream) => {
    localVideo.srcObject = stream;
  });

navigator.audioSession.onstatechange = async () => {
  if (navigator.audioSession.state === "interrupted") {
    localVideo.pause();
    remoteVideo.pause();
    // 通話が中断されていることをユーザーに明確に示す。
    showInterruptedBanner();
    for (const track of localVideo.srcObject.getTracks()) {
      track.enabled = false;
    }
  } else {
    // 通話をいつ再開するかはユーザーに決めさせる。
    const shouldRestart = await showOptionalRestartBanner();
    if (!shouldRestart) {
      return;
    }
    for (const track of localVideo.srcObject.getTracks()) {
      track.enabled = true;
    }
    localVideo.play();
    remoteVideo.play();
  }
};

10. 謝辞

ワーキンググループは、この仕様への貴重な貢献について、次の方々に謝意を表します。

適合性

文書 規約

適合性要件は、記述的な表明と RFC 2119 の用語の組み合わせによって表現されます。 この文書の規範的な部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、 RFC 2119 で説明されているように解釈されるものとします。 ただし、読みやすさのために、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のすべてのテキストは、非規範的であると明示的に示された節、例、および注を除いて、 規範的です。 [RFC2119]

この仕様における例は、“for example” という語で導入されるか、 または class="example" によって 規範的なテキストから分離されます。 例えば次のようになります。

これは情報提供的な例の一例です。

情報提供的な注は “Note” という語で始まり、 class="note" によって 規範的なテキストから分離されます。 例えば次のようになります。

注、これは情報提供的な注です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (例えば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など)の意味で解釈されるものとします。

アルゴリズムまたは具体的な手順として表現された適合性要件は、 最終的な結果が等価である限り、 どのような方法でも実装できます。 特に、この仕様で定義されるアルゴリズムは、 理解しやすいことを意図したものであり、 高性能であることを意図したものではありません。 実装者には最適化が推奨されます。

索引

この仕様で定義される 用語

参照により 定義される用語

参照文献

規範的参照文献

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. 2024年10月3日. CR. URL: https://www.w3.org/TR/mediacapture-streams/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBAUDIO]
Paul Adenot; Hongchan Choi. Web Audio API. 2021年6月17日. REC. URL: https://www.w3.org/TR/webaudio/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL 索引

[Exposed=Window]
interface AudioSession : EventTarget {
  attribute AudioSessionType type;

  readonly attribute AudioSessionState state;
  attribute EventHandler onstatechange;
};

enum AudioSessionType {
  "auto",
  "playback",
  "transient",
  "transient-solo",
  "ambient",
  "play-and-record"
};

enum AudioSessionState {
  "inactive",
  "active",
  "interrupted"
};

[Exposed=Window]
partial interface Navigator {
  // The default audio session that the user agent will use when media elements start/stop playing.
  readonly attribute AudioSession audioSession;
};